Skip to content

Pytest 插件开发


简介

Pytest 是一个功能强大的 Python 测试框架,支持通过插件来扩展其功能。

Pytest 插件开发可以帮助开发者自定义和扩展 Pytest 的行为,以满足特定项目或需求的需要。


开发 Pytest 插件的优点

  1. 可扩展性:Pytest 插件提供了一种灵活的方式扩展和定制测试框架。通过编写插件,可以添加自定义的功能和行为,满足特定项目或测试需求。

  2. 代码复用:编写 Pytest 插件可以将一些通用的测试功能和逻辑封装成可复用的组件,方便在不同的测试项目中共享和重用。插件可以提供一些常用的断言、测试工具、测试装饰器等,以避免重复编写和维护相同的代码。

  3. 便捷性:通过使用 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 插件的开发。
  • 插件打包发布。