首页app攻略pytest plugin pytest自定义插件

pytest plugin pytest自定义插件

圆圆2025-10-18 15:01:02次浏览条评论

pytest 5.x+ 升级:利用自定义标记灵活控制测试的运行与跳过

`pytest` 5.x 版本删除了 `pytest.config`,导致旧版本中通过命令行标志动态跳过或运行特定测试的方法不再适用。本文旨在提供一种现代且兼容的解决方案,即利用 `pytest` 的自定义标记(标记)结合 `-m`命令行选项,实现对装饰器修饰的测试进行精确的条件执行控制,确保升级过程的平滑过渡,并保持代码的简洁性。

在 pytest 从 4.x 版本升级到 5.x 版本时,开发者经常会遇到一个挑战:旧版本中用于通过命令行标记动态控制测试运行或跳过 pytest.config 对象已被移除。这使得依赖 pytest.config.getoption('--flag', False) 的pytest.mark.skipif 装饰器不再有效,导致 AttributeError: module 'pytest' has no attribute 'config' 错误。为了在不大量现有测试装饰器语法的前提下,实现相同的功能,我们采用 pytest 5.x 版本修改推荐的自定义机制标记(自定义标记)。旧版 pytest (4.x) 的实现方式回顾

在 pytest 4.x 版本中,常见的做法是定义一个跳过装饰器,该装饰器命令行选项来根据是否跳过测试来决定。例如,一个用于集成测试的装饰器可能如下所示:# common.pyimport pytest#如果命令行未提供--integration 标志,则跳过integration = pytest.mark.skipif( not pytest.config.getoption('--integration', False),reason=quot;需要--integration标志才能运行集成测试quot;)# test_something.pyfrom .common importintegration@integrationdef test_my_integration_feature():assert 1 == 1@integrationdef test_another_integration_feature():断言2 == 2def test_regular_feature():assert Truelogin后

在pytest 5.x中,由于pytest.config的移除,上述common.py中的集成装饰器将不再工作。pytest 5.x的解决方案:利用自定义标记

pytest 5.x使用推荐自定义标记来对测试进行分类,并通过-m选项来选择或排除特定标记的测试。这种方法更加灵活复制且符合pytest的设计哲学。1. 定义自定义标记

首先,我们需要重新定义集成装饰器。不再使用 pytest.mark.skipif 结合 pytest.config.getoption,而是直接创建一个 pytest.mark 实例作为我们的自定义标记。

# common.pyimport pytest#定义一个名为 'integration' 的自定义标记integration = pytest.mark.integration# test_something.py (保持与旧版本类似的装饰器使用方式)from .common import Integration@integrationdef test_my_integration_feature(): quot;quot;quot;一个测试集成.quot;quot;quot;assert 1 == 1@integrationdef test_another_integration_feature(): quot;quot;quot;这是另一个集成测试。quot;quot;quot;assert 2 == 2def test_regular_feature():quot;quot;quot;这是一个常规的单元测试。quot;quot;quot;assert True登录后复制

可以看到,test_something.py中的测试函数装饰器语法不变,这对于顺利升级大量现有测试代码至关重要。2. 注册自定义标记

为了 PytestUnknownMarkWarning 警告并提高测试的可维护性,强烈建议在 pytest.ini 文件中注册所有自定义标记。

在项目的根目录下创建或修改添加 pytest.ini,并添加标记部分:# pytest.ini[pytest]markers = Integration:将测试标记为集成测试。 #您的描述可以根据需要添加其他自定义标记,例如: # Slow:将测试标记为慢速(用“-m quot;not Slowquot取消选择;”)登录后复制3. 通过命令行控制测试执行

一旦定义并注册了自定义标记,我们就可以使用 pytest 的 -m 命令行选项来灵活运行或跳过带有特定标记的测试。

运行所有测试(包括集成和非集成测试):X Studio

网易云音乐·X Studio 91查看详情 pytest -v登录后复制

此命令将执行所有收集到的测试,无论它们是否被@integration标记。

只运行集成测试:pytest -v -m 集成登录后复制

此命令会告诉pytest只运行那些被@integration标记的测试。附带此标记修饰的测试将被跳过(取消选择)。

输出结果(摘要):========================================== 测试会话开始 =========================================...收集 3 项 / 1 取消选择 / 2 selectedtest_something.py::test_my_integration_feature PASSEDtest_something.py::test_another_integration_feature PASSED====================================== 2个通过,1个在0.00s内取消选择 =====================================登录后复制

只非运行集成测试:pytest -v -m 'not Integration'登录后复制

使用不关键字可以排除带有特定标记的测试。此命令将运行所有附件@integration标记的测试。

示例输出(摘要):========================================== 测试会话开始 ============================================...collected 3 items / 2 deselected / 1 selectedtest_something.py::test_regular_feature PASSED==================================== 1 passed, 2 deselected in 0.00s =====================================登录后复制总结及注意事项

通过上述方法成功,我们在pytest 5.x中成功 版本中实现了与旧版 pytest.config 相同甚至更强大的条件测试执行功能。平滑迁移:这种方法最大的优点是,对于已经使用自定义装饰器(如@i​​ntegration)来标记测试的现有代码库,几乎不需要修改测试函数本身的装饰器语法,简化了大大的升级过程。可变:pytest -m 选项支持复杂的选项,例如 pytest -m '集成且不慢' 或 pytest -m 'web 或实践:始终在 pytest.ini 中注册自定义标记是一个良好的做法,它不仅可以消除 PytestUnknownMarkWarning 警告,还能为团队成员提供可用的标记列表其用途,提高项目的可维护性和强制性。替代方案:虽然本文主要关注通过 -m 选项进行过滤,但 pytest 也提供了其他高级机制,如 pytest_addoption 和 pytest_collection_modifyitems 钩子函数,用于更复杂的自定义逻辑,但通常需要更深入的插件开发。对于本文所述的场景,自定义标记是最简洁高效的解决方案。

采用自定义标记是 pytest 5.x 中此类处理需求的标准且推荐方式,它使得测试组​​织更加清晰,执行控制更加灵活。

以上就是pytest 5.x升级:利用自定义标记灵活控制测试的运行与跳过的详细内容,更多请关注乐哥常识网其他相关文章! Golang如何处理Cookie与Session

pytest 5.x
米侠浏览器用法 米侠浏览器有风险吗
相关内容
发表评论

游客 回复需填写必要信息