目标
一个 flaky 测试就把整套件变成概率信号,而“重跑到绿”训练团队无视红色。恢复是机械的:反复运行套件、用失败矩阵点名不确定性测试、隔离它们让门禁信号恢复诚实,然后逐个修掉测试对时间、顺序或共享状态的错误假设。
步骤要点
- 连跑 20 次生成 JSON 报告,脚本汇总每测试的通过/失败矩阵,用数据点名 flaky。
- 给确认的测试打 @quarantine 标签移出主套件,主套件恢复可信的红绿信号,隔离区继续运行汇报。
- 分析失败分布:随一天时间变的是共享外部状态、随邻居测试变的是顺序耦合、随并行度变的是资源竞争。
- 修根因不修症状:sleep(2000) 换成 waitFor 轮询真实条件,时间假设消失。
- 连续 50 次绿才准毕业回门禁套件。
排错提示
隔离区变坟场就给每条测试设时限与负责人,超两个冲刺必须修或删;本地复现不了 CI 抖动,就用相同分片数与并行参数复现或从 CI 日志确定性取证;重试机制只能放在修复之后当纵深防御,测量抖动时必须先关掉重试。
适用边界
重复运行做检测是统计方法,稀有抖动需要更长窗口或种子顺序实验;隔离保住了其余套件的信号,但在修好前被隔离行为本身失去门禁保护。
代码示例
# 20 runs, then a per-test pass/fail matrix
for i in $(seq 1 20); do
npx vitest run --reporter=json > /tmp/run-$i.json
done
node scripts/flakiness.mjs /tmp/run-*.json