You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的标记语法基本一致,只需要做少量修改:

  1. 安装依赖:pip install pytest-depends
  2. 修改测试代码的标记:
# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:06