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

如何在pytest中根据--connection命令行参数动态调整运行的测试用例?

实现方案

你之前的方案用错了钩子函数,pytest_generate_tests是用于测试用例参数化的场景,不适合用来控制测试收集逻辑,且你代码中读取的是option.name而非你自定义的--connection参数,逻辑本身也没有生效。你要的动态调整测试总数的效果,可以通过pytest_collection_modifyitems钩子实现,该钩子可以在测试用例收集完成后修改要执行的测试列表。

推荐实现步骤

1. 保留原有基础逻辑

你已实现的pytest_addoption和connection fixture无需修改,保留即可作为双重校验。

2. 新增测试收集过滤钩子

在conftest.py中添加如下代码:

def pytest_collection_modifyitems(config, items):
    # 判断是否传入了--connection参数
    connection_arg = config.getoption("--connection")
    if not connection_arg:
        # 无连接参数时,过滤所有依赖connection fixture的HW测试
        items[:] = [item for item in items if "connection" not in item.fixturenames]

3. 测试用例写法保持不变

  • SW类测试不需要声明connection入参,无参数时会正常执行
  • HW类测试声明connection入参,无参数时会直接从执行列表中移除,不会被计数也不会被跳过
  • 传入--connection参数时,所有测试都会被收集执行

可选优化:自定义标记区分测试类型

如果希望更清晰的划分测试类型,避免依赖fixture名称判断出现误判,可以给HW类测试加上自定义标记:

  1. 先在conftest.py中注册标记:
def pytest_configure(config):
    config.addinivalue_line("markers", "hw: 标记需要硬件环境的测试用例")
  1. HW测试用例加上标记:
@pytest.mark.hw
def test_hw_1(connection):
    # HW测试逻辑
    pass
  1. 修改收集过滤逻辑,按标记过滤:
def pytest_collection_modifyitems(config, items):
    connection_arg = config.getoption("--connection")
    if not connection_arg:
        items[:] = [item for item in items if not item.get_closest_marker("hw")]

两种方案都可以实现你要的效果:

  • 无--connection参数时,仅运行3个SW测试,测试总数为3
  • 有--connection参数时,运行全部3个SW+5个HW共8个测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 21:15:07