pytest运行带依赖测试时如何自动运行无对应marker的依赖用例
问题解决方法
你遇到的是pytest-dependency库默认不会主动加载筛选条件外的依赖用例的问题,有两种成熟的解决方案可以参考:
方案1:原生扩展conftest.py实现(无需更换依赖库)
在测试项目根目录新建conftest.py文件,添加以下代码即可实现自动递归加载所有选中用例的依赖用例,不受-k、-m等筛选条件限制:
# conftest.py import pytest def pytest_collection_modifyitems(config, items): # 建立用例nodeid到用例对象的映射表 item_map = {item.nodeid: item for item in items} # 存储所有需要执行的用例,包括依赖 all_needed = set() # 递归查找依赖 def add_deps(item): if item.nodeid in all_needed: return all_needed.add(item.nodeid) # 提取当前用例的依赖列表 if hasattr(item, 'own_markers'): dep_marker = next((m for m in item.own_markers if m.name == 'dependency'), None) if dep_marker and 'depends' in dep_marker.kwargs: deps = dep_marker.kwargs['depends'] for dep in deps: # 匹配依赖的nodeid,兼容同文件/跨文件的依赖路径 for nodeid in item_map: if nodeid.endswith(dep): add_deps(item_map[nodeid]) break # 遍历初始选中的所有用例,添加自身和所有层级的依赖 for item in items: add_deps(item) # 替换最终执行的用例列表 items[:] = [item for item in items if item.nodeid in all_needed]
添加完成后再执行pytest -vv -k category命令,会自动加载test_b依赖的test_a并执行,不会出现跳过的情况。
方案2:切换为pytest-depends库(语法兼容改造成本低)
pytest-depends库原生支持自动拉取所有依赖用例执行,无需额外配置,和pytest-dependency的标记语法基本一致,只需要做少量修改:
- 安装依赖:
pip install pytest-depends - 修改测试代码的标记:
# test_test.py import pytest @pytest.mark.depends def test_a(): assert True @pytest.mark.category @pytest.mark.depends(on=['test_a']) def test_b(): assert True
修改完成后执行筛选命令,会自动运行所有依赖的上游用例,无需给上游用例加对应的marker。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

