首页/开发/CI/CD 与发布速查/不稳定测试(Flaky Tests)治理
质量门禁与回滚51 条

不稳定测试(Flaky Tests)治理

同一代码重复运行结果不一致的测试即 flaky:会侵蚀门禁公信力。治理路径是识别、隔离、修复三步,并用 flaky 率观察趋势。

CI/CD 与发布速查开发更新于 2026-10-13

不稳定测试是什么

同一代码重复运行结果不一致的测试即 flaky:会侵蚀门禁公信力,还会让真实回归被重试噪声掩盖。治理路径是识别、隔离、修复三步:先度量识别,再暂时移出阻断集合并登记修复任务,最后从根上消除时序依赖、共享状态、随机端口与外部网络依赖。flaky 率用不稳定用例数除以总用例数度量,观察趋势而不是只看单次。

基本信息

识别重复运行或历史结果比对,标记不稳定用例
隔离暂时移出阻断集合并登记修复任务
修复消除时序依赖、共享状态、随机端口与外部网络依赖
度量flaky 率 = 不稳定用例数 / 总用例数
常见根因异步等待写死、测试间共享数据、真实网络调用

典型使用场景

  • 门禁救火:主干红灯先判定真实失败还是 flaky
  • 定期巡检:每周重复跑关键用例集,统计 flaky 率
  • 修复排序:被阻断的大变更前优先清理相关不稳定用例
  • 隔离台账:隔离用例进名单,限期限人跟进
  • 重试策略:临时重试只作缓冲,设上限并记录次数
  • 修复验证:修完重复跑验证,跟踪 flaky 率回落

重复运行排查

重复运行排查
pytest --count=5 tests/test_checkout.py   # pytest-repeat 提供 --count 参数
pytest -x tests/test_checkout.py          # 首败即停,保留现场

常见根因与修法

根因表现修法
时序依赖本地偶发、CI 频繁显式等待条件而非固定 sleep
共享状态单跑通过、全量挂用例隔离,独立数据与清理
网络依赖外部服务抖动即红假服务或录制回放
随机端口并行时冲突动态分配端口并向下传递
长期给不稳定测试打重试补丁:掩盖并发与时序缺陷,问题会在生产放大。
隔离不是删除:隔离的用例要带责任人与复查期限,否则等同悄悄下线覆盖。
统计口径先统一:重跑才通过也算 flaky 信号,口径写进看板再谈趋势。

易错点

  • 把 flaky 修复无限期延后:大变更时无法区分新旧失败
  • 隔离后没有跟踪任务:不稳定用例被遗忘在隔离区
  • 重试掩盖真实回归:重试成功就当作通过,序列缺陷遗留到生产
  • 只修表象不改根因:加 sleep 掩盖竞态,换个环境继续偶发
  • 用例顺序耦合:单跑通过、全量乱序失败,隔离数据与随机顺序暴露隐藏依赖

数据来源与参考

  • pytest-repeat 插件文档
  • Google Testing Blog 关于 flaky tests 的讨论
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌