首页/开发/软件测试速查/pytest 失败重跑
自动化测试66 条

pytest 失败重跑

pytest-rerunfailures 提供 --reruns 失败自动重跑与 --reruns-delay 间隔控制,也可只对标记用例生效;重跑能缓解环境抖动,但不该静默忽略根因。

软件测试速查开发更新于 2026-10-13

失败重跑插件是什么

pytest-rerunfailures 是 pytest 生态的重跑插件:用例失败后按配置再执行若干次,仍失败才判为失败;重跑通过的结果标注 RERUN,与一次通过区分开。适用对象是偶发失败(flaky)——外部依赖抖动、时序竞争;对稳定复现的失败,它不会也不应该帮你掩盖。

基本信息

安装pip install pytest-rerunfailures
全局重跑pytest --reruns 3 失败后最多再跑 3 次
重跑间隔--reruns-delay 2 每次重跑前等待 2 秒
按用例标记@pytest.mark.flaky(reruns=5, reruns_delay=1)
条件重跑only_rerun 参数指定只对特定异常类型重跑
报告标注重跑通过标记 RERUN,统计上与首次通过区分

最小示例

最小示例
pip install pytest-rerunfailures   # 安装插件
pytest -q --reruns 3 --reruns-delay 2   # 失败最多重跑 3 次,间隔 2 秒
pytest -q -m waits --reruns 2           # 只对特定标记的用例启用重跑
# 单用例写法(写在用例函数上,覆盖全局配置):
# @pytest.mark.flaky(reruns=5, only_rerun=["AssertionError"])

典型使用场景

  • 第三方依赖偶发超时:重跑两三次确认是环境抖动还是真实缺陷
  • 时序竞争排查:连续重跑观察失败是否可稳定复现
  • 全量回归降噪:把已知 flaky 用例设置重跑,减少报告噪声
  • CI 网络抖动兜底:弱网环境重跑一次,避免假红卡住流水线
  • 统计真实失败率:本地关闭重跑,对照 CI 开启重跑后的差异
  • 发布门禁:门禁阶段关闭重跑,保证放行结论的确定性

关键参数与行为

参数/标记作用注意
--reruns全局失败重跑次数次数越多总时长越长
--reruns-delay两次尝试之间的等待秒数等待外部依赖恢复时有用
flaky 标记按用例设置重跑次数与延迟参数覆盖全局设置
only_rerun限定触发重跑的异常类型如 AssertionError,避免盲目重跑
RERUN 状态重跑通过的结果标注统计时不能等同于首次通过
重跑会把 CI 时长拉长:一条用例重跑 3 次,最坏情况时间是原来的 4 倍,设置次数前先看流水线预算。
重跑是止血带不是解药:连续多轮都靠重跑通过的用例应作为 flaky 专项治理,否则 CI 的可信度会被慢慢腐蚀。
与 pytest-xdist 并行可搭配:重跑发生在各自 worker 内部,不影响其他用例的调度。

易错点

  • 把稳定失败的用例标成 flaky 靠重跑掩盖:真实缺陷被放行到线上,先看日志确认偶发性
  • 重跑次数设太大:CI 时间失控,失败反馈延迟,开发者不再跟踪红色结果
  • 只看最终绿不看 RERUN 统计:flaky 率在涨却无人负责,回归质量悄悄恶化
  • 发布门禁也开着重跑:放行结论建立在重试运气上,关键时刻失去确定性

数据来源与参考

  • pytest-rerunfailures 项目文档(PyPI/GitHub)
  • Google Testing Blog(flaky 测试治理实践)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌