pytest 如何跳过(排除)某些目录不收集测试?
pytest 排除目录用 --ignore=路径 参数,可多次使用;在 pytest.ini 的 addopts 中配置可永久生效。norecursedirs 可排除按模式匹配。
命令行用 --ignore=目录名 排除;想每次自动生效,把 --ignore 写进 pytest.ini 的 addopts 中。
命令行排除
# 排除单个目录
pytest --ignore=somedirectory
# 排除多个目录
pytest --ignore=somedirectory --ignore=someotherdirectory
配置文件永久生效
# pytest.ini
[pytest]
addopts = --ignore=somedirectory --ignore=someotherdirectory
之后直接 pytest 就会自动排除这些目录。
按模式排除:norecursedirs
[pytest]
norecursedirs = node_modules dist build .venv
norecursedirs 接受目录名模式(支持通配符),匹配的目录在收集阶段就被跳过,不递归进入。默认模式通常包括 .*、build、dist、node_modules 等;虚拟环境还有单独的识别机制。显式设置 norecursedirs 会替换默认列表,应按所用 pytest 版本保留需要的默认模式。
排除单个文件
pytest --ignore=test_legacy.py
在 conftest.py 中(相对该 conftest.py 所在目录):
collect_ignore = ["test_legacy.py"]
常见问题(FAQ)
Q:--ignore 和 --deselect 有什么区别?
A:--ignore 在收集阶段就跳过整个目录/文件;--deselect 是收集完成后排除具体的测试用例(格式 文件::用例名)。
Q:虚拟环境目录会被收集吗?
A:pytest 默认会识别并跳过虚拟环境,--collect-in-virtualenv 可改变该行为,但 norecursedirs 仍可能阻止递归。显式指定测试路径也可能绕过部分递归排除规则,应验证实际收集结果。
Q:--ignore 的路径是相对哪的?
A:相对当前工作目录。建议从项目根目录运行 pytest,路径写相对根目录的路径。