← 中文资源

简体中文版本

不稳定测试清除计划工作流

用重复运行检测不稳定测试,带过期隔离,按优先级修根因,用禁重试门禁防止回潮。

阅读英文原文

目标

每次自动重试都在教团队“红色可能不代表什么”,而真正的回归将继承这份怀疑。清除计划把激励倒转:先测量不稳定率、诚实隔离、按影响半径修根因、最后关掉主赛道的自动重试——让红色重新意味着“真故障或新 flake”,永远不再是一声耸肩。

步骤要点

  1. 先测不稳定率:跨窗口重复运行套件,按每条测试的失败方差排名,用数据代替传闻。
  2. 带过期与 owner 隔离:被证实的 flake 移入单独隔离车道,每条登记责任人、根因假设与过期时间,过期自动升级。
  3. 按影响半径排序修:先修覆盖支付与鉴权路径的测试再修外观类的,用固定种子与乱序复现,复现种子写入文档。
  4. 主车道关闭重试:禁止自动重试让新 flake 立即现形,把“重跑到绿”的习惯变成可上报的指标。
  5. 加不稳定率门禁:CI 对 PR 触碰的测试做多次运行的方差检查,引入可测 flakiness 的合并直接失败。

排错提示

重试开着的日子里 flake 只会越攒越多,把主车道 retries 关掉是唯一的棘轮;修了半天复现不了是没用种子与乱序,让失败可重放是修复的前置条件;隔离车道成了永久养老院说明过期没被执行,过期即升级到管理层。

适用边界

方差门禁会少量增加 CI 运行成本,触发条件要限定在触碰的测试上;不稳定率的测量受运行环境影响,跨环境的方差要归一化后再比较。

代码示例

measurement (3 runs x 5 nights):
  flake rate: 4.7% of tests fail intermittently
  top offenders:
    payment/e2e_flow        38% fail rate  (blast: high)
    search/debounce         31%             (medium)
    ui/header_snapshot      29%             (low)

quarantine (expiry 14d, owner attached):
  fixed first: payment (seed + fake clock)
  root causes: 2 timing races, 1 order-dep state

main lane: retries DISABLED
  red run = real failure or new flake (escalates)
variance gate: touched tests must pass 3/3 runs