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

如何选择或取消选择使用特定pytest fixture的测试用例?

自动标记依赖特定fixture的测试并筛选

要实现不用手动标记,就能通过类似pytest -m 'not uses_foo'的命令筛选依赖特定fixture的测试,可以通过pytest的钩子函数自动识别测试的fixture依赖并添加标记,具体实现如下:

步骤1:在conftest.py中注册自定义标记

首先注册uses_<fixture_name>格式的标记,避免pytest运行时抛出未知标记的警告:

def pytest_configure(config):
    # 注册针对foo fixture的标记,若需要支持多个fixture可扩展逻辑
    config.addinivalue_line(
        "markers", "uses_foo: 标记所有直接或间接依赖foo fixture的测试"
    )

步骤2:自动识别依赖并添加标记

在conftest.py中添加pytest_itemcollected钩子,递归分析测试项的所有fixture依赖,给依赖目标fixture的测试添加对应标记:

def _get_all_fixture_names(item, fixturemanager):
    """递归获取测试项直接或间接依赖的所有fixture名称"""
    fixture_names = set(item.fixturenames)
    for name in list(fixture_names):
        fixturedef = fixturemanager.getfixturedefs(name, item.cls)
        if fixturedef:
            # 获取当前fixture依赖的其他fixture
            fixture_deps = fixturedef[0].argnames
            fixture_names.update(fixture_deps)
            # 递归处理依赖的fixture
            for dep in fixture_deps:
                fixture_names.update(_get_all_fixture_names(item, fixturemanager))
    return fixture_names

def pytest_itemcollected(item):
    # 目标fixture名称,这里以foo为例
    target_fixture = "foo"
    all_fixtures = _get_all_fixture_names(item, item.session._fixturemanager)
    if target_fixture in all_fixtures:
        # 给测试添加uses_foo标记
        item.add_marker("uses_foo")

使用方法

  • 排除所有依赖foo fixture的测试:
    pytest -m 'not uses_foo'
    
  • 只运行所有依赖foo fixture的测试:
    pytest -m 'uses_foo'
    

扩展说明

如果需要支持多个fixture,只需修改pytest_configure注册对应的标记,同时在pytest_itemcollected中遍历多个目标fixture即可,比如:

def pytest_configure(config):
    target_fixtures = ["foo", "bar", "baz"]
    for fixture in target_fixtures:
        config.addinivalue_line(
            "markers", f"uses_{fixture}: 标记所有直接或间接依赖{fixture} fixture的测试"
        )

def pytest_itemcollected(item):
    target_fixtures = ["foo", "bar", "baz"]
    all_fixtures = _get_all_fixture_names(item, item.session._fixturemanager)
    for fixture in target_fixtures:
        if fixture in all_fixtures:
            item.add_marker(f"uses_{fixture}")

这样就无需手动标记任何测试,不管fixture是直接还是间接被依赖,都会被自动识别并添加标记,完全满足通过标记筛选测试的需求。

内容的提问来源于stack exchange,提问作者shadowtalker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:29:51