如何确保带标记的pytest测试仅在显式指定时才运行?
嗨,我来帮你搞定这个需求!想要让带特定标记的测试默认跳过,只有显式指定标记时才运行,有几种靠谱的实现方式:
方法一:修改pytest配置文件(最推荐,持久生效)
在项目根目录下创建或编辑pytest.ini文件,添加以下配置:
[pytest] addopts = -m "not your_marker_name"
把your_marker_name替换成你给测试加的实际标记(比如integration、slow这类)。这样每次你直接运行pytest时,会自动跳过带这个标记的测试。如果要专门运行这些测试,只需要在命令行显式指定:
pytest -m your_marker_name
要是你临时想取消默认规则,也可以用--no-addopts参数:
pytest --no-addopts
方法二:通过conftest.py实现灵活默认规则
如果需要更灵活的逻辑(比如只有在用户没指定-m参数时才启用默认跳过),可以在项目根目录的conftest.py里添加以下代码:
def pytest_configure(config): # 先注册你的标记(如果还没注册的话) config.addinivalue_line( "markers", "slow: marks tests as slow (deselected by default)" ) # 当用户没有指定-m参数时,默认跳过带slow标记的测试 if not config.getoption("-m"): config.option.markexpr = "not slow"
这种方式的好处是,如果你本来就在命令行指定了-m规则(比如pytest -m "unit and not slow"),默认规则不会覆盖你的自定义规则,只会在无标记筛选时生效。
方法三:临时设置环境变量(适合临时需求)
如果只是想临时生效,不想修改配置文件,可以设置环境变量:
# Linux/macOS终端 export PYTEST_ADDOPTS="-m 'not your_marker_name'" # Windows cmd set PYTEST_ADDOPTS="-m 'not your_marker_name'" # Windows PowerShell $env:PYTEST_ADDOPTS="-m 'not your_marker_name'"
不过这个是全局生效的,会影响你当前终端里运行的所有pytest命令,适合临时测试场景。
额外小贴士
如果有多个标记需要默认跳过,可以把表达式写成not (marker1 or marker2),比如:
addopts = -m "not (slow or integration)"
内容的提问来源于stack exchange,提问作者Stefano Borini
相关产品推荐
相关产品推荐

