如何在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类测试加上自定义标记:
- 先在
conftest.py中注册标记:
def pytest_configure(config): config.addinivalue_line("markers", "hw: 标记需要硬件环境的测试用例")
- HW测试用例加上标记:
@pytest.mark.hw def test_hw_1(connection): # HW测试逻辑 pass
- 修改收集过滤逻辑,按标记过滤:
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
相关产品推荐
相关产品推荐

