Pytest 插件开发
简介
Pytest 是一个功能强大的 Python 测试框架,支持通过插件来扩展其功能。
Pytest 插件开发可以帮助开发者自定义和扩展 Pytest 的行为,以满足特定项目或需求的需要。
开发 Pytest 插件的优点
-
可扩展性:Pytest 插件提供了一种灵活的方式扩展和定制测试框架。通过编写插件,可以添加自定义的功能和行为,满足特定项目或测试需求。
-
代码复用:编写 Pytest 插件可以将一些通用的测试功能和逻辑封装成可复用的组件,方便在不同的测试项目中共享和重用。插件可以提供一些常用的断言、测试工具、测试装饰器等,以避免重复编写和维护相同的代码。
-
便捷性:通过使用 Pytest 插件可以提供更便捷的测试流程和工具。插件可以自动识别和收集测试用例,提供更丰富的标记和过滤选项,扩展测试报告和日志,以及灵活配置和管理测试环境等。
Pytest 编写插件
修改默认编码
pytest_collection_modifyitems
方法可以收集测试用例,然后实现定制化功能。
例如含有中文的测试用例名称,改写编码格式:
# conftest.py
def pytest_collection_modifyitems(session, config, items):
for item in items:
# name 用例的名字
# nodeid 测试用例路径
item.name = item.name.encode('utf-8').decode('unicode-escape')
item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
# test_demo
import pytest
@pytest.mark.parametrize('name',['哈利波特','赫敏'])
def test_mm(name):
print(f"name:{name}")
测试结果对比:
添加命令行参数
# conftest.py
def pytest_addoption(parser):
# group 将下面所有的 option 都展示在这个 group 下
mygroup = parser.getgroup("hogwarts")
mygroup.addoption(
"--env", # 注册一个命令行选项
default='test', # 参数的默认值
dest='env', # 存储的变量,为属性命令,可以使用 Option 对象访问到这个值,暂用不到
help='set your run env' # 帮助提示参数的描述信息
)
@pytest.fixture(scope='session')
def cmdoption(request):
myenv = request.config.getoption("--env", default='test')
if myenv == 'test':
datapath = "datas/test/data.yml"
elif myenv == 'dev':
datapath = "datas/dev/data.yml"
with open(datapath) as f:
datas = yaml.safe_load(f)
return myenv,datas
# datas/dev/data.yml
env:
ip: https://ceshiren.com
port: 443
# datas/test/data.yml
env:
ip: https://test.ceshiren.com
port: 80
# test_option.py
def test_addoption(cmdoption):
print(cmdoption)
打包发布
-
打包项目构成
-
源码包
- setup.py
- 测试包
setup.py 配置
from setuptools import setup,find_packages
setup(
name='pytest_encode',
url='https://github.com/xxx/pytest-encode',
version='1.0',
author="xixi",
author_email='418974188@qq.com',
description='set your encoding and logger',
long_description='Show Chinese for your mark.parametrize(). Define logger variable for getting your log',
classifiers=[# 分类索引 ,pip 对所属包的分类
'Framework :: Pytest',
'Programming Language :: Python',
'Topic :: Software Development :: Testing',
'Programming Language :: Python :: 3.8',
],
license='proprietary',
packages = find_packages(), #['pytest_encode'],
keywords=[
'pytest', 'py.test', 'pytest_encode',
],
# 需要安装的依赖
install_requires=[
'pytest'
],
# 入口模块 或者入口函数
entry_points={
'pytest11': [
'pytest_encode = pytest_encode.main',
]
},
zip_safe=False
)
打包命令
# 依赖包安装:
pip install setuptools python 的包管理工具,负责 安装和发布,尤其是安装拥有信赖关系的包。
pip install wheel 生成 *.whl 格式的安装包,本质上也是一个压缩包。
# 打包命令:
python setup.py sdist bdist_wheel
# 注意:确保你的目录里有setup.py
发布命令
python3 -m pip install --user --upgrade twine ## 安装 twine 工具
python3 -m twine upload --repository testpypi dist/* ## 上传代码
最后会将 dist
目录下的文件上传到 pypi
上。
安装发布的包
如果想安装,可以执行 python -m install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-YOUR-USERNAME-HERE
来安装。
总结
- Pytest 插件的开发。
- 插件打包发布。