不稳定测试是什么
同一代码重复运行结果不一致的测试即 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 信号,口径写进看板再谈趋势。