用 pytest --collect-only 先确认测试能不能被发现

31 次浏览4 条回复

刚加了测试但不确定 pytest 有没有收进去时,可以先只做收集,不执行测试。

环境:Python 3.9+,项目已安装 pytest,在项目根目录执行:

python -m pytest --collect-only -q

它会列出将要运行的测试数量和节点名。测试文件命名、类名或函数名前缀不符合配置时,通常在这里就能看出来。只想检查某个目录也可以:

python -m pytest tests/unit --collect-only -q

这一步不会调用测试函数,适合改完目录结构或 pytest 配置后先排查“明明写了测试却没跑”的问题。最终还是要正常执行一遍,收集成功不代表断言一定通过。

这个还挺适合放到 CI 里做第一道门槛,尤其是改了 pytest.ini、pyproject.toml 里的 testpaths 或 python_files 之后。

还有个小用法是配合某个关键字先看会不会选中:

python -m pytest --collect-only -q -k user

如果这里数量已经不对,就不用等完整测试跑完才发现过滤条件写歪了。

还有一种情况是参数化测试名字太长、输出不太好找,可以临时加 -vv 看完整 node id:

python -m pytest --collect-only -vv

后面想单独跑某一个失败用例时,复制那个 node id 会省很多猜路径的时间。

补一个容易漏的点:如果项目里用了自定义 marker,也可以先把 marker 选择条件和收集一起看一下:

python -m pytest --collect-only -q -m slow

这样能提前发现 marker 名写错、或者 pytest.ini 里没注册导致筛选结果不对。真正跑慢测试前先扫一眼,挺省时间。

这个命令还有个小坑:collect 阶段虽然不跑测试函数,但会加载 conftest.py、测试模块和一些 fixture 定义。

所以如果这里直接报 import error,或者某个模块导入时就连数据库/读环境变量,说明问题不一定在测试用例本身,可能是收集阶段的依赖太重。临时排查时可以先缩小范围:

python -m pytest tests/unit/test_user.py --collect-only -q

能少绕一点路。