pytest失败后立即停止执行用例只需加-x,它是--maxfail=1的快捷写法,等价且更简洁;若需停在第n次失败则用--maxfail=n,二者不可共存。

pytest失败后立即停止执行用例,直接加 -x
只要加一个 -x 就够了,这是最常用也最可靠的方式。它会让 pytest 在第一个测试用例失败(或出错)时立刻退出,不再运行后续任何用例。
常见错误是以为要配合 --maxfail=1 才行——其实 -x 就是 --maxfail=1 的快捷写法,两者完全等价,但 -x 更简洁、更易记。
- 命令行直接运行:
pytest -x - 如果只想对某个文件生效:
pytest test_example.py -x - 和
-v、--tb=short等其他参数混用没问题:pytest -x -v --tb=short
需要停在第N个失败时,用 --maxfail=N
当你要观察多个失败模式(比如排查一批不稳定用例),而不是只看第一个失败,就得用 --maxfail。它比 -x 更灵活,但注意:N 是「失败总数」,不是「失败用例数」——如果一个用例里有多个断言失败,只算 1 次失败;但如果用了 pytest.mark.parametrize 生成多个参数化实例,每个失败的实例都单独计数。
-
pytest --maxfail=3:第 3 次失败(无论来自哪个用例)后停止 - 和
-x不能同时用,否则 pytest 报错:argument -x: not allowed with argument --maxfail - 如果测试中抛出异常(如
ValueError)或未捕获的错误,也算一次失败计数
CI/CD 或配置文件中固化该行为,写进 pyproject.toml
手动敲 -x 容易漏,尤其在 CI 脚本或团队共享配置里,推荐写死在配置中。pytest 会自动读取项目根目录下的 pyproject.toml,比 pytest.ini 更推荐。
[tool.pytest.ini_options] maxfail = 1 # 或者写成 x = true(但 maxfail 更明确,且支持大于1的值)
注意:maxfail = 1 和 -x 效果一致;但如果你在命令行再显式传 --maxfail=2,会覆盖配置里的值。
- 不要写
x = true—— 这个键名 pytest 不识别,会被忽略 - 如果项目同时有
pyproject.toml和pytest.ini,前者优先级更高 - 配置项名必须小写,
MAXFAIL或MaxFail都无效
为什么有时加了 -x 还没停?检查是否被插件干扰
极少数情况下,你加了 -x 却发现 pytest 继续跑完了所有用例,大概率是某个 pytest 插件重写了失败处理逻辑,比如:
-
pytest-rerunfailures:它默认会重试失败用例,可能掩盖首次失败,导致-x失效 -
pytest-xdist并行执行时,-x仍有效,但「第一个失败」指的是所有 worker 中最早报告失败的那个——不是按代码顺序,而是按实际执行完成顺序 - 自定义 hook(如
pytest_runtest_makereport)若修改了rep.outcome,也可能绕过内置的中断判断
排查方法:临时去掉插件再试,例如 pytest -x -p no:rerunfailures;或者加 -s 看输出节奏,确认失败是否真被捕捉到了。
真正容易被忽略的是并行场景下「第一个失败」的含义——它不取决于你写的用例顺序,而取决于哪个 worker 先跑完并上报结果。这点在调试时经常让人误判流程控制逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











