关于 frontend-review-testing
供团队评估现有项目测试状况的前端测试审计技能。它检查配置、覆盖率、测试结构和缺口,并提出优先处理事项;不会编写测试或运行测试套件。
主要功能
- 01审计测试与覆盖率配置
- 02检查 Vitest 和 Playwright 设置
- 03识别测试缺口并提议 PR
- 04建议验证可观察行为的组件测试
- 05评估覆盖率与分支测试需求
- 06记录测试失败分诊指引
适用场景
- 01评估前端项目的测试现状
- 02规划路由器和控制器的初始 E2E 测试
- 03发现组件测试实践中的缺口
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mizchi/ skills --skill frontend-review-testing安装后在 Claude Code 中输入/frontend-review-testing确认已加载。
附带文件README.md
详细介绍
前端评审——测试
你正在审查一个前端项目的测试状况。当前阶段为第 2 周:建立 vitest + playwright,并采用合成覆盖率,同时注意:
- E2E 粒度:初期,Router / 服务端控制器的每个分支各编写一个用例(先搭建骨架,不追求穷尽)。
- 单元测试粒度:优先覆盖组件。
- 覆盖率合并:使用
monocart-coverage-reports或istanbul-merge合并 vitest V8 + playwright V8 覆盖率。
流程
- 运行
scripts/audit-coverage.sh --repo <client-repo>。 - 如果存在
coverage/coverage-summary.json,阅读该文件。 - 检查:
vitest.config.*——是否配置了覆盖率?使用的是 v8 提供程序吗?playwright.config.*——projects、webServer、分片配置tests/、e2e/、__tests__/——当前测试数量和结构package.json脚本——test、test:coverage、test:e2e
输出
写入 <client-repo>/.frontend-review/report/latest/md/testing-review.md,包含:
- 当前状态:是否配置了 vitest?是否配置了 playwright?有多少项测试?覆盖率是多少?
- 差距:缺失的配置、缺失的脚本、未合并覆盖率
- 建议的 PR(最多 3-5 项):每项列出标题、涉及文件、预期覆盖率增幅
- 分支覆盖清单:应优先编写 E2E 测试的 Router / 控制器分支
组件测试——优先使用 Testing Library
对于 React 组件测试,优先使用 @testing-library/react,而不是测试内部实现:
- 按角色 / 标签 / 文本查询(
getByRole、getByLabelText、getByText),而不是按类名或组件内部结构查询。 - 用户交互通过
@testing-library/user-event实现——使用userEvent.click、userEvent.type,而不是直接分发 DOM 事件。 - 异步断言使用
waitFor/findBy*,检查异步操作后的状态更新。
// Bad: testing implementation details
const wrapper = render(<LoginForm />);
wrapper.find('button.submit').simulate('click');
expect(wrapper.state('isLoading')).toBe(true);
// Good: testing observable behaviour
render(<LoginForm />);
await userEvent.type(screen.getByLabelText('Email'), '[email protected]');
await userEvent.click(screen.getByRole('button', { name: /sign in/i }));
expect(await screen.findByText('Welcome')).toBeInTheDocument();
如果 package.json 中没有 @testing-library/react,请将其标记为差距,并建议同时添加 @testing-library/user-event 和 @testing-library/jest-dom(或 @testing-library/vitest-dom)。
对于 atom / store 测试,使用该库自己的测试工具(例如 Jotai createStore()),而不是渲染组件——将组件测试与状态逻辑测试分开。
源码内测试模式
对于逻辑密集的 .ts 文件,通常更适合将测试与源代码放在同一文件中(Vite 项目使用 if (import.meta.vitest),或使用等效的构建时死代码剔除方式),而不是单独创建测试文件:
- AI Agent 可以在同一文件上下文中读取源代码和规范,从而提高生成准确性。
- 纯函数与其不变量保持紧密关联。
- 生产构建通过
"import.meta.vitest": "undefined"define 剔除测试代码块。
为工具 / lib 文件提出新的单元测试时,建议采用此模式。
测试失败分诊流程
测试失败时,正确的做法不是机械地重写测试以使其通过。应让人类决定:
- 规范已变更——当前实现正确;更新测试。
- 实现存在错误——测试正确;修复实现。
- 测试有误——测试从未符合预期规范;重写测试。
在输出报告中记录此分诊流程。将任何看起来像“实现回声”(测试的是确切的内部路径,而非可观察行为)的现有测试标记为第 3 类候选项。
MSW(Mock Service Worker)原则
当代码库会从外部 API 获取数据时,建议使用 MSW,而不是 jest 风格的模块模拟:
- 仅在网络边界模拟(
http.get、http.post处理器)。 - 保留实际的状态管理 / 组件连接,仅替换 HTTP 响应。
- 将共享处理器放在
src/test-utils/handlers.ts或等效位置。
这样可以避免出现集成契约已失效、测试却仍然通过的情况。
覆盖率指导
- 目标:纯 lib/utility 文件达到 80% 以上;UI 组件达到 60% 以上。
- 反面目标:不要为了达到 100% 而堆砌测试。优先编写数量较少、能体现真实规范的测试,而不是大量枚举实现细节的测试。
- 生成的 UI 组件(例如 shadcn/ui 的输出)不纳入覆盖率要求。
VRT 稳定性提示
- 在 Linux 容器中生成参考快照(与 CI 使用相同的操作系统),以消除不同机器之间的字体渲染和抗锯齿差异。
- 通过共享 fixture 全局注入 Web 字体,而不是在每个测试中单独注入——字体不可用会导致像素差异比较出现误报。
边界
- 不要编写实际测试代码——只提出结构和数量。
- 不要通过此 skill 运行
vitest或playwright;这些脚本不会执行测试,只会读取现有报告。
参考
- 检查清单:
07-unit-test.md、08-e2e-playwright.md、15-vrt.md、13-kpi-tracking.md - 阶段:
week-2-testing.md、week-3-security-vrt.md