跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Python如何通过标签过滤测试_使用pytest mark标记并筛选运行

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

相关文章