Flaky Test Detective 是一个用于诊断与修复不稳定测试(flaky tests)的技能。其目标是系统性地识别根因并完成测试稳定化,减少间歇性失败带来的干扰。
用途
该技能面向出现间歇性失败的测试用例,帮助定位并修复导致测试时通时不通的常见原因,并给出稳定化建议与监控方案。
主要能力
- 归纳常见不稳定测试模式,包括:时序问题、共享状态、随机性、网络依赖。
- 针对每类问题给出对照示例(问题写法与修复写法)。
- 提供不稳定测试检测脚本的实现思路:多次运行测试、解析 JSON 报告、统计每个用例的通过/失败次数、计算失败率并输出不稳定用例清单。
- 提供根因分析框架:依据错误信息归类为 timing、state、randomness、network 或 unknown,并给出对应建议。
- 提供稳定化检查清单(timing、state、randomness、network、parallelism)。
- 提供自动修复模式的代码处理思路。
- 提供在 CI 中监控不稳定测试的配置示例。
常见模式与修复方式(资料示例)
时序问题
问题示例:渲染组件后立即断言元素存在,可能因竞态条件而失败;或使用固定 setTimeout 等待动画完成。
修复示例:使用 waitFor() 等待条件成立,或使用 findBy* 查询(内建等待),并可设置合适的 timeout。
共享状态
问题示例:修改全局变量导致其他测试受影响;数据库数据未清理导致重复创建失败。
修复示例:使用局部变量隔离状态;在 afterEach 中执行清理(如删除测试数据)。
随机性
问题示例:使用随机生成的数据导致断言结果不稳定。
修复示例:使用固定、确定性的测试数据;或在 beforeEach 中为 faker 设置固定 seed。
网络依赖
问题示例:测试直接调用真实外部 API,可能因服务不可用而失败。
修复示例:使用 MSW 等工具 mock HTTP 请求并返回可控数据。
使用方式
- 检测不稳定测试:编写脚本多次运行测试(示例为 npm test -- --reporter=json),解析结果并统计通过/失败次数,输出失败率与不稳定用例列表;若无不稳定用例则正常结束,否则以非零状态退出。
- 根因分析:根据错误消息特征判断根因类别(例如包含 timeout 或 not found 归类时序;包含 already exists 或 unique constraint 归类共享状态;包含 expected 与 received 归类随机性;包含 network 或 ECONNREFUSED 归类网络),并给出建议。
- 稳定化清单:按 timing、state、randomness、network、parallelism 分组执行检查项。
- 自动修复模式:例如将 screen.getBy 断言包裹进 waitFor;将 getBy 替换为 findBy;在缺少 afterEach 时插入清理逻辑。
- CI 监控:通过 GitHub Actions 定时任务(示例为每日 2 点)运行测试多次并分析结果。
适用场景
- 测试在本地或 CI 中偶发失败,需要定位根因并稳定化。
- 需要建立不稳定测试的检测与报告机制。
- 需要为团队制定测试稳定性规范与检查清单。
- 需要在 CI 中长期监控测试稳定性趋势。
限制
- 资料未提供该技能的安装命令、价格、平台支持范围与版本信息,暂未提供。
- 示例主要基于 JavaScript/TypeScript 测试生态(如 waitFor、screen、MSW、faker),其他语言与框架的适配方式暂未提供。
- 检测脚本与自动修复示例为思路性代码,直接用于生产环境前需按项目实际情况调整。