pytest fixture中能否检测到命令行传入的-m 'not my_mark'标记参数
核心原因
你之前的方案无法生效的原因是request.keywords存储的是当前被执行的测试用例的标记集合,当你传入-m "not power"时,所有带power标记的用例都会被过滤,执行到的用例都没有该标记,自然无法读取到对应的关键字。
适配现有使用习惯的解决方案
如果你不想修改现有的命令行调用方式,直接读取pytest配置中存储的mark过滤表达式即可:
import pytest @pytest.fixture(scope='session', autouse=True) def power_on(request): mark_expr = request.config.option.markexpr.strip() # 匹配排除power标记的场景 if 'not power' in mark_expr: yield return power_on_test_equipment() yield power_off_test_equipment()
更优雅的推荐方案
自定义命令行参数实现,逻辑更清晰,不会受复杂mark表达式的干扰:
- 首先在项目根目录的
conftest.py中添加自定义参数和自动过滤逻辑:
def pytest_addoption(parser): parser.addoption( "--no-power-control", action="store_true", default=False, help="跳过ePDU供电控制,适用于无ePDU的测试环境" ) def pytest_collection_modifyitems(config, items): # 传了--no-power-control时自动跳过所有power标记的用例 if config.getoption("--no-power-control"): skip_power = pytest.mark.skip(reason="无ePDU环境,跳过供电相关测试") for item in items: if "power" in item.keywords: item.add_marker(skip_power)
- 修改fixture逻辑:
@pytest.fixture(scope='session', autouse=True) def power_on(request): if request.config.getoption("--no-power-control"): yield return power_on_test_equipment() yield power_off_test_equipment()
- 无ePDU环境执行测试时,仅需传入自定义参数即可,无需额外加mark过滤:
pytest --no-power-control
内容的提问来源于stack exchange,提问作者nikolaj
相关产品推荐
相关产品推荐

