首页/开发/代码质量与评审速查/测试债:脆弱与缺失的代价
技术债与度量63 条

测试债:脆弱与缺失的代价

测试债表现为:用例脆弱(一碰就红)、运行缓慢、覆盖虚高(断言薄弱)、环境依赖重;偿还方向是把测试分层、稳定数据夹具、缩短反馈,测试是重构的安全网,欠得越久重构越不敢做。

测试债是什么

测试债指测试套件本身失去可信度或效率的现象:用例脆弱(一碰就红)、运行缓慢、覆盖虚高(有执行无断言)、依赖共享环境。它是最危险的债务类型之一,因为测试是重构的安全网——网破了,其它债务都不敢还。欠得越久,团队越不敢动老代码,改动成本进一步上升。

基本信息

症状flaky / 执行慢 / 断言薄弱 / 依赖共享环境
偿还方向分层重组、夹具隔离、并行化、缩短反馈
优先级先修 flaky:它直接摧毁对红灯的信任
配套覆盖率只看趋势与增量,不做个人排名

典型表现与识别

  • 同一用例连续运行结果不一致,重跑就绿:典型的 flaky
  • 测试需要按特定顺序运行才通过,顺序一变就失败
  • 断言只校验「不抛异常」,改坏业务逻辑也照样通过
  • 多个用例共享同一份数据库或同一账号,互相污染
  • 全量执行时间长到没人愿意本地跑,只能靠 CI 事后发现
  • 为绕过失败加上的 skip 与忽略标记长期没人清理

测试体检清单

测试体检清单
□ 连续 10 次运行,结果是否完全一致
□ 全量执行时长是否可接受(本地能跑完)
□ 随机顺序执行是否仍然全绿
□ 失败信息能否定位到根因(含输入与期望)
□ 是否存在只为通过而写的无断言用例
□ skip / ignore 标记是否有责任人与到期时间

常见病因与处理

病因表现处理
时间与随机半夜跑的用例失败注入可控制的时钟与随机源
共享状态单跑绿、全跑红每用例独立夹具,用完清理
异步等待偶发超时用条件轮询替代固定 sleep
外部依赖网络抖动导致失败本地桩或录制回放
断言太弱覆盖率好看但测不出问题补行为断言,用变异测试抽检
修 flaky 比补覆盖率更值钱:一条不稳定的红灯反复出现后,团队学会的第一件事是重跑而不是排查,安全网从此形同虚设。发现 flaky 应当立即标记并排进当期修复,而不是靠重跑掩盖。
覆盖率是弱信号:它只能证明代码被执行过,不能证明被验证过。看增量覆盖率与趋势可以防止新代码缺测;一旦拿它做个人排名,空断言式的凑数用例会立刻出现。

易错点

  • 忽视 flaky 直接重跑:团队学会无视红灯,真实回归被漏掉
  • 为覆盖率数字写空壳断言:安全网看着完整,实际拦不住任何问题
  • 测试只有端到端一层:定位不到根因,改一处怕三处,重构从此停滞
  • 共享测试环境与账号:用例互相污染,失败原因被归到「环境问题」而无人深挖

数据来源与参考

  • Google Engineering Practices(测试相关)与 flaky test 治理实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌