失败重跑插件是什么
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 内部,不影响其他用例的调度。