You need to enable JavaScript to run this app. pytest fixture中能否检测到命令行传入的-m 'not my_mark'标记参数
优惠活动
大模型
产品
解决方案
定价
更多

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表达式的干扰:

  1. 首先在项目根目录的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)
  1. 修改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()
  1. 无ePDU环境执行测试时,仅需传入自定义参数即可,无需额外加mark过滤:
    pytest --no-power-control

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 00:39:02