Pytest 插件开发
接下来我们来学习如何自己开发 pytest 的插件。
简介
Pytest 是一个功能强大的 Python 测试框架,支持通过插件来扩展其功能。
Pytest 插件开发可以帮助开发者自定义和扩展 Pytest 的行为,以满足特定项目或需求的需要。
Pytest 是一个非常强大的 python 测试框架,它不仅可以用来执行测试用例,还可以通过插件来扩展其功能。插件开发能够帮助开发者根据项目的具体需求,定制 pytest 的行为,让测试过程更加灵活和高效。
开发 Pytest 插件的优点
-
可扩展性: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}")
在编写 pytest 插件时,最常用的一个方法是 pytest collection modifyitems,它允许我们在收集测试用例时进行定制化处理。举个例子,如果测试用例的名称中包含中文字符,我们可能希望改写它们的编码格式,以便更好地显示。这时就可以通过 pytest collection modifyitems 方法来实现。例如,我们有一个测试用例 test mm,其名称包含中文字符,我们可以使用 encode 和 decode 方法来修改其编码,确保能够正确显示。这样做就能够正确显示测试用例的中文名称,而不会出现乱码。
测试结果对比:
通过这种方式修改编码格式后,测试结果的显示就能够正确处理中文字符。如果不做编码处理,测试结果可能会出现乱码,影响可读性。
添加命令行参数
# 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)
Pytest 插件还可以通过命令行参数来定制化运行环境。比如这个例子,假设我们需要根据不同的环境来加载不同的数据文件,可以使用 pytest addoption 方法添加命令行参数。这里通过 杠杠env 参数来指定测试环境,然后根据不同的环境加载相应的数据文件。这个例子中,通过 杠杠env 参数,就可以在命令行中指定 test 或 dev 环境,插件会根据指定的环境加载对应的数据文件。这样就能根据不同的环境灵活切换数据,简化了测试的配置和管理。
打包发布
-
打包项目构成
-
源码包
- setup.py
- 测试包
开发好 pytest 插件后,接下来你可能会想将它打包并发布。发布插件的过程包括几个步骤:首先你需要准备插件的源码和 setup.py 配置文件,然后使用 setuptools 工具将插件打包成源代码包和 Wheel 包。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
)
setup.py 是插件发布的关键文件,它定义了插件的基本信息和依赖项。在这个配置中,我们定义了插件的名称是 pytest_encode,版本 1点0,并指定了它的依赖项 pytest。通过 entry_points 配置,我们告诉 pytest 该插件的入口模块是 pytest_encode点main。
打包命令
# 依赖包安装:
# python 的包管理工具,负责 安装和发布,尤其是安装拥有信赖关系的包。
pip install setuptools
# 生成 *.whl 格式的安装包,本质上也是一个压缩包。
pip install wheel
# 打包命令:
python setup.py sdist bdist_wheel
# 注意:确保你的目录里有setup.py
打包插件的命令非常简单,只需要执行以下命令来生成插件的安装包。这将会生成 点tar点gz 和 点whl 格式的文件,这些文件就是你的插件安装包。
发布命令
## 安装 twine 工具
python3 -m pip install --user --upgrade twine
## 上传代码
python3 -m twine upload --repository testpypi dist/*
最后会将 dist
目录下的文件上传到 pypi
上。
一旦插件打包完成,就可以将它发布到 PyPI 上了,发布命令如下。这些命令会将打包后的插件上传到 PyPI 上,供其他人下载和使用。
安装发布的包
如果想安装,可以执行 python -m install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-YOUR-USERNAME-HERE
来安装。
如果想安装发布的插件,只需要运行这个命令。这个命令会从 Test PyPI 上下载并安装你的插件。
总结
- Pytest 插件的开发。
- 插件打包发布。
好了,关于如何开发 pytest 插件我们先介绍到这里。