用途
e2e-test-reviewer 用于审查、审计或改进现有的 E2E 测试规格文件(spec)以及页面对象模型(POM)文件。当任务涉及“review tests”“improve test quality”“audit specs”“check test…”等时触发。其审查原则与测试框架无关,在 Playwright、Cypress、Puppeteer 存在差异时分别给出代码示例。
主要能力
该技能采用三阶段流程:
第一阶段:自动化 Grep 检查(优先运行)
确定审查目标文件后,先运行 Bash 命令,机械检测已知反模式,再进行 LLM 分析。检查项包括:错误吞噬(.catch(() => {}) / .catch(() => false))、恒真断言(如 toBeGreaterThanOrEqual(0))、布尔陷阱(对非布尔值使用 toBeTruthy)、条件绕过(if 内的 expect)、原始 DOM 查询(规格文件中使用 document.querySelector)、硬编码超时(waitForTimeout / cy.wait(数字))、缺少网络 mock(goto/visit 附近无 route/intercept)等。结果解读:零命中则进入第二阶段;任一命中则逐行报告(含文件:行号);带 // justified 注释的行排除。第一阶段结果需原样输出,LLM 不得重新解释。
第二阶段:LLM 审查(仅主观检查)
第一阶段已检测的模式会被跳过,LLM 只执行主观检查,包括:名称-断言一致性(#1)、缺失 Then(#2)、仅渲染测试(#8)、重复场景(#9)、误导性命名(#10)、过宽断言 + 主语倒置(#11)、不稳定模式的部分判断(#13)、POM 中的 YAGNI(#14)。
第三阶段:覆盖率缺口分析
在第一、二阶段完成后,识别测试套件未覆盖的场景,扫描被测页面/功能并标记缺失项:错误路径(表单校验错误、API 失败、离线、404/500)、边界情况(空状态、最大长度输入、特殊字符、并发操作)、可访问性(键盘导航、屏幕阅读器标签、模态框后的焦点管理)、认证边界(未授权重定向、会话过期、基于角色的可见性)。最多列出 5 个高价值缺失场景作为建议(非要求)。
使用方式
审查清单针对每个非跳过测试及每个变更的 POM 文件逐项执行。注意:带原因注释或原因字符串的 test.skip() 是有意为之,不应标记或移除;只有隐藏失败的中途条件跳过才需标记(见 #6)。
检查分为两级:
Tier 1 — P0/P1(始终检查):
- 名称-断言一致性(仅 LLM):测试名称承诺的每个名词都应有对应断言,否则补充断言或重命名。
- 缺失 Then(仅 LLM):对 toggle/cancel/close 等操作,应同时验证恢复状态与被取消状态。
- 错误吞噬(grep 可检测):规格中不要用 try/catch 包裹断言;POM 中移除 wait/断言方法上的
.catch(() => {}),仅保留 UI 稳定化用途的 catch。 - 恒真断言(grep 可检测):如
toBeGreaterThanOrEqual(0)、对恒真字符串的toBeTruthy()。 - 布尔陷阱断言(grep 可检测):对 Locator/ElementHandle 对象使用
toBeTruthy()恒真;应使用框架内置断言;POM 应暴露元素句柄而非返回Promise<boolean>。 - 条件绕过(grep 可检测):每条测试路径至少包含一个
expect();环境检查移入 beforeEach 或声明级test.skip()。 - 原始 DOM 查询(grep 可检测):使用框架元素 API 而非原始 DOM;仅在框架 API 无法表达条件时使用 evaluate/waitForFunction,并在 POM 中加注释说明。
Tier 2 — P1/P2(时间允许时检查):
8. 仅渲染测试(仅 LLM):仅调用 toBeVisible() 而无交互或内容断言,应至少补充内容、计数或兄弟元素断言之一。
9. 重复场景(仅 LLM):步骤重叠 >70% 的测试应合并;跨文件亦做子集检查。
10. 误导性测试命名(仅 LLM):使用 API/REST 或间接方法时名称应明确说明。
11. 过宽断言(仅 LLM):已知有效值少时优先精确匹配而非 .includes() 或宽松正则。
11b. 主语倒置(仅 LLM):被测的实际值必须作为 expect() 的参数,期望值放入匹配器。
12. 硬编码超时(grep 可检测):不使用显式 sleep;自定义超时应提取为带注释的命名常量。
13. 不稳定模式(仅 LLM + grep):位置选择器 nth()/first()/last() 无注释、无 mock 的网络依赖、动画竞态。
14. 页面对象中的 YAGNI(仅 LLM):删除未被引用的成员;内部专用成员设为私有;新共享工具应被 2+ 规格使用;不要删除被活跃导入使用的工具文件/类。
输出格式
发现按严重程度分组:
## [P0/P1/P2] Task N: [filename] — [issue type]
### N-1. `[test name or POM method]`
- **Issue:** [description]
- **Fix:** [name change / assertion addition / merge / deletion]
- **Code:**
```typescript
// concrete code to add or change
所有发现之后附加汇总表,列出严重级别、数量、主要问题、受影响文件。
## 适用场景
适用于对现有 E2E 测试规格与 POM 文件进行系统性质量审查、审计和改进,尤其当需要自动化机械检测常见反模式并结合 LLM 进行语义级判断与覆盖率分析时。
## 限制
资料中未提供该技能的具体安装命令、依赖、平台支持范围、收费方式或版本信息,这些事实暂未提供。