pytest -m 标签名必须与 @pytest.mark.xxx 中的 xxx 严格字符串相等、大小写敏感,不支持模糊匹配;多标签用 or/and 连接;加 --strict-markers 和在配置文件中声明 markers 可避免拼写错误导致测试被静默跳过。
pytest -m 后面跟的标签名必须和 @pytest.mark.xxx 里的 xxx 完全一致
标签匹配是严格字符串相等,不支持模糊、前缀或正则(除非加
)。比如你写了
,就必须用
,写成
或
都不会命中。
常见错误:在
上多打一个下划线,变成
,但运行时却敲
——没报错,但测试全被跳过,因为没匹配到任何标记
标签名区分大小写:
和
不匹配
如果想一次跑多个标签,用
连接:
;用
表示同时带两个标记:
如何避免 pytest 报 “no tests ran” 却不提示标签拼错
pytest 默认对不匹配的
标签静默忽略,既不报错也不警告。看起来像“没找到测试”,实际是标签写错了,但你可能花十分钟检查路径、文件名,最后发现只是
写成了
。
加
参数,让 pytest 在遇到未注册的标记时报错:
会直接提示
提前查看当前项目已注册的标记:运行
,它会列出所有被
或
注册过的标记(包括内置的
,
)
自定义标记建议在
或
中显式声明,否则即使用了
,
仍会报未知标记
pytest.ini 里配置 markers 能解决什么问题
不配置的话,自定义标记只是“能用”,但缺乏描述、不参与校验、IDE 也无法识别。配了之后,
才真正生效,且
会显示你写的说明。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
在
中添加:
注意格式:冒号后要空一格,描述尽量简短;每行一个标记,不能用逗号分隔
如果用
,对应写法是:
没配置时,
虽然能运行,但
不会显示它,
也会把它当非法标记拦掉
用 -m 筛选时,为什么有些测试还是被执行了
因为
只过滤标记,不覆盖其他筛选逻辑。如果你同时用了
(关键字匹配)、指定了具体文件或函数,pytest 会取交集——但只要任一条件满足,测试就可能进来。
立即学习
“
Python免费学习笔记(深入)
”;
例如:
,只要测试函数名含
或打了
标记,就会执行(不是“且”,而是“或”)
更隐蔽的情况:某个测试没加任何标记,但它所在的文件被显式指定(如
),那它照常运行,
对它完全无效
验证是否真被过滤:加
看详细输出,或加
先看 pytest 打算跑哪些测试,不真正执行
pytest 的标记机制本身不复杂,但标签名拼写、配置缺失、多条件混用这三处最容易卡住人——尤其当测试集变大后,一个拼错的标记可能让整轮 CI 白跑十几分钟。
-k@pytest.mark.smokepytest -m smokepytest -m "smo*"pytest -m smoke_test@pytest.mark.slow@pytest.mark.slow_testpytest -m slow@pytest.mark.APIpytest -m apiorpytest -m "smoke or integration"andpytest -m "smoke and windows"-m@pytest.mark.unit@pytest.mark.unnit--strict-markerspytest -m unnit --strict-markersUnknown marker 'unnit'pytest --markerspytest_addoptionpytest_configureskipxfailpytest.inipyproject.toml@pytest.mark.xxx--strict-markers--strict-markerspytest --markerspytest.ini[tool:pytest]
markers =
smoke: end-to-end smoke test
slow: test that takes >1s to run
gpu: requires CUDA devicepyproject.toml[tool.pytest.ini_options]
markers = [
"smoke: end-to-end smoke test",
"slow: test that takes >1s to run",
]@pytest.mark.gpupytest --markers--strict-markers-m-kpytest test_api.py -m smoke -k "login"loginsmokepytest test_slow.py-m-v--collect-only