测试债是什么
测试债指测试套件本身失去可信度或效率的现象:用例脆弱(一碰就红)、运行缓慢、覆盖虚高(有执行无断言)、依赖共享环境。它是最危险的债务类型之一,因为测试是重构的安全网——网破了,其它债务都不敢还。欠得越久,团队越不敢动老代码,改动成本进一步上升。
基本信息
| 症状 | flaky / 执行慢 / 断言薄弱 / 依赖共享环境 |
|---|---|
| 偿还方向 | 分层重组、夹具隔离、并行化、缩短反馈 |
| 优先级 | 先修 flaky:它直接摧毁对红灯的信任 |
| 配套 | 覆盖率只看趋势与增量,不做个人排名 |
典型表现与识别
- 同一用例连续运行结果不一致,重跑就绿:典型的 flaky
- 测试需要按特定顺序运行才通过,顺序一变就失败
- 断言只校验「不抛异常」,改坏业务逻辑也照样通过
- 多个用例共享同一份数据库或同一账号,互相污染
- 全量执行时间长到没人愿意本地跑,只能靠 CI 事后发现
- 为绕过失败加上的 skip 与忽略标记长期没人清理
测试体检清单
测试体检清单
□ 连续 10 次运行,结果是否完全一致
□ 全量执行时长是否可接受(本地能跑完)
□ 随机顺序执行是否仍然全绿
□ 失败信息能否定位到根因(含输入与期望)
□ 是否存在只为通过而写的无断言用例
□ skip / ignore 标记是否有责任人与到期时间常见病因与处理
| 病因 | 表现 | 处理 |
|---|---|---|
| 时间与随机 | 半夜跑的用例失败 | 注入可控制的时钟与随机源 |
| 共享状态 | 单跑绿、全跑红 | 每用例独立夹具,用完清理 |
| 异步等待 | 偶发超时 | 用条件轮询替代固定 sleep |
| 外部依赖 | 网络抖动导致失败 | 本地桩或录制回放 |
| 断言太弱 | 覆盖率好看但测不出问题 | 补行为断言,用变异测试抽检 |
修 flaky 比补覆盖率更值钱:一条不稳定的红灯反复出现后,团队学会的第一件事是重跑而不是排查,安全网从此形同虚设。发现 flaky 应当立即标记并排进当期修复,而不是靠重跑掩盖。
覆盖率是弱信号:它只能证明代码被执行过,不能证明被验证过。看增量覆盖率与趋势可以防止新代码缺测;一旦拿它做个人排名,空断言式的凑数用例会立刻出现。