加 -x 参数可让 pytest 一失败就终止:pytest -x,等价于 --exitfirst,遇首个失败或错误立即退出;注意可能被 pytest.ini 中 addopts 或 --maxfail 覆盖。

pytest运行失败后怎么立刻停下?
默认情况下,pytest 会跑完所有用例才汇总报错,调试时特别低效。想让测试一失败就终止,直接加 -x 参数就行:
pytest -x
它等价于 --exitfirst,遇到第一个失败(或错误)的测试用例立即退出,不继续执行后续用例。
- 适合快速验证修复是否生效,尤其在改一个函数后只想看它相关测试是否通过
- 和
-v搭配用更清晰:pytest -xv,能看到具体哪个用例挂了 - 注意:它只对「失败(assert 失败)」和「错误(异常未捕获)」生效,跳过(
@pytest.mark.skip)或预期失败(@pytest.mark.xfail)不算中断条件
只想重跑失败的用例?用 --lf
修完 bug 后不想从头跑全部测试,--lf(last-failed)能自动找出上一次运行中失败的用例并只执行它们:
pytest --lf
这个功能依赖 pytest 的缓存文件 .pytest_cache/v/cache/lastfailed,所以必须先有一次包含失败的运行(比如先 pytest -x 挂掉一次)。
- 如果上次没失败,
--lf会退化为全量运行 - 配合
--tb=short可减少干扰信息:pytest --lf --tb=short - 想清空记录重来?删掉
.pytest_cache目录即可
为什么加了 -x 还没停?检查是否被 pytest.ini 干扰
有时候明明写了 pytest -x,却依然跑完全部用例——大概率是项目根目录存在 pytest.ini 或 pyproject.toml,里面配置了 addopts 覆盖了你的命令行参数。
- 检查
pytest.ini中是否有类似addopts = -x --maxfail=3这种多值配置,--maxfail优先级高于-x,会覆盖行为 -
--maxfail=1和-x效果一致,但如果两者同时出现,后者可能被前者“稀释” - 临时绕过配置文件:加
-c no,例如pytest -x -c no
CI 环境下慎用 -x,它可能掩盖问题
本地调试开 -x 很爽,但在 CI 流水线里要小心:一个用例失败导致后续用例不执行,可能让本该暴露的环境问题(比如资源未清理、状态污染)逃逸。
- CI 推荐用
--maxfail=3之类可控阈值,而非-x - 如果确实需要快速反馈,可结合
--tb=short+--disable-warnings减少日志噪音,而不是靠中断 - 更稳妥的做法是把高耦合测试拆开,让每个用例真正独立,这样即使全量跑也不怕卡在中间
最常被忽略的是缓存机制和配置文件的隐式覆盖——-x 看似简单,但它的行为实际由命令行、配置、缓存三层共同决定。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











