Back to Ant Design

Ant Design 测试用例审查

.agents/skills/test-review/SKILL.md

6.3.74.9 KB
Original Source

Ant Design 测试用例审查

目标

一、只判断测试用例是否合理,不负责创建或补充测试。

二、优先识别“用 a 证明 a”、实现细节自证、重复覆盖这类低价值测试。

三、验证场景默认只做静态审查,不默认运行测试。

四、输出先给结论,再给最关键原因。

何时使用

当用户提到以下意图时使用此 skill:

  • 验证测试 case
  • review 测试是否合理
  • 判断测试是否无意义
  • 判断测试是否重复
  • 判断测试是不是“用 a 证明 a”
  • 决定测试应保留、改写还是删除

不做的事

  • 不主动新增测试
  • 不主动补回归测试
  • 不主动修改生产代码
  • 不默认执行 npm testnpm run test:update

如果用户明确要求“顺手给改写建议”,可以在结论后补一句改写方向;但主任务仍然是审查,不是落地实现。

核心判断

一、先看契约是否独立

先用一句话描述这条测试声称在保护什么:

当 <前置条件> 时,<组件/方法> 应该 <可观察结果>。

如果这句话只能从当前实现反推出来,这条测试大概率不值得保留。

二、expected 必须来自独立来源

高质量来源包括:

  • issue / PR 里明确描述的回归现象
  • 组件文档、API、demo、FAQ
  • DOM / React / WAI-ARIA / 浏览器语义
  • 用户可感知的文本、属性、交互、布局结果

低质量来源包括:

  • 生产代码里的同一个 helper、token、常量、分支逻辑
  • 在测试里复制一遍实现
  • “因为实现可能要这样写,所以我断言它这样写了”

三、优先审查外部行为,不审查实现细节

优先级:

  1. DOM / 文本 / 属性 / role / aria
  2. callback 的触发与参数
  3. 用户或使用方能观察到的行为结果
  4. 只有存在独立契约时,class / style 才能作为代理信号

如果断言锁定的是具体 CSS 属性、临时 class、内部状态或中间过程,默认先判低价值。

四、默认拦截样式实现自证

以下写法默认按“无实际作用”或“需要改写”处理,除非能证明它对应公开契约:

  • toHaveStyle(...)
  • toHaveClass(...)
  • 断言具体 CSS 属性、CSS 变量、临时 class 存在

典型反例:

  • expect(node).toHaveStyle({ whiteSpace: 'nowrap' })

如果它只是验证“实现里加了 nowrap”,而不是验证独立可感知行为,就属于“用 A 证明 A”。

五、重复覆盖也应判低价值

以下情况优先判为重复或冗余:

  • 已有 mountTestrtlTest 或其他聚焦行为测试覆盖相同契约
  • 同一组件已有相同 props 组合和同类断言
  • 新 case 只是换文案、换变量名、换写法,没有新增行为分支

输出要求

默认只输出最终结论,不写调研过程。

格式:

text
结论:此用例无实际作用 / 此用例可保留 / 此用例需要改写
原因:
- ...
- ...

规则:

  • 先下结论,再给原因
  • 原因保留 2 到 4 条即可
  • 不要先讲命令、搜索过程、推理链
  • 除非用户追问,否则不要展开长篇建议

执行流程

1. 静态审查优先

当用户是在验证测试是否合理时:

  • 默认只读代码、diff、文档、demo、已有测试
  • 默认不运行测试
  • 不把“能不能跑过”当成主要判断依据

只有用户明确要求“跑一下”“验证 red/green”时,才执行测试命令。

2. 提炼被保护的契约

先回答:

  • 这条测试到底想保护什么公开行为?

如果回答不稳,优先判为:

结论:此用例无实际作用。

3. 查独立依据

从以下位置找证据:

  • 当前 PR / issue 描述
  • 组件文档与 demo
  • 现有测试
  • 外部语义规范

如果找不到独立依据,而 expected 又来自实现本身,直接判低价值。

4. 查是否重复

需要时搜索现有覆盖:

bash
rg -n "<关键字>|<issue号>|<行为描述>" components/<component> tests

如果同一契约已经被保护,新 case 通常应判为冗余。

5. 给出分类结论

分类标准:

  • 此用例可保留 条件:契约独立、断言面向外部行为、不是重复覆盖
  • 此用例需要改写 条件:测试意图可能对,但断言方式锁定实现或证据不足
  • 此用例无实际作用 条件:expected 同源、实现自证、重复覆盖、只测存在性、只测内部细节

Ant Design 约束

  • __tests__ 中引用仓库内代码时使用相对路径
  • 优先沿用目标组件现有测试结构与 helper
  • 对样式问题,先问“能否用更外层行为表达”,再接受 style/class 断言

快速拦截

以下情况默认直接质疑:

  • 输入 a,expected 也从同一路径算出 a
  • 断言私有 helper / hook / 中间 state
  • 断言 classNamewhiteSpacedisplayzIndex 等具体实现
  • 在已有 mountTestrtlTest 旁边再补同类 case
  • 只做 toBeTruthy() / toBeDefined() 这类存在性断言