关于 writing-tests
writing-tests 是一项帮助开发者为现有代码编写测试或提升覆盖率的技能。它先识别项目测试配置和代码约定,再指导编写、运行和调整测试。
主要功能
- 01识别测试运行器与项目约定
- 02分析公开 API 和代码路径
- 03按项目惯例创建测试文件
- 04编写边界与异步测试
- 05模拟外部依赖
- 06运行测试并处理失败
适用场景
- 01为现有模块补充单元测试
- 02为 React 组件编写行为测试
- 03覆盖错误处理与边界情况
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ spencerpauly/ awesome-cursor-skills --skill writing-tests安装后在 Claude Code 中输入/writing-tests确认已加载。
详细介绍
编写测试
当用户要求为现有代码添加测试、提高测试覆盖率,或为特定文件或模块编写测试时,请使用此技能。
步骤
-
检测测试设置 — 检查已配置的内容:
# Check package.json for test runner cat package.json | grep -E "jest|vitest|mocha|playwright|cypress"查找配置文件:
vitest.config.ts、jest.config.ts、playwright.config.ts、.mocharc.*。检查现有测试文件,了解项目的测试模式和约定。 -
如果没有测试运行器 — 进行配置:
npm install -D vitest @testing-library/react @testing-library/jest-dom在
package.json中添加test脚本:{ "test": "vitest run", "test:watch": "vitest" } -
分析目标代码 — 阅读要测试的文件,并识别:
- 公共 API:导出的函数、类、组件、钩子
- 代码路径:条件分支、错误处理、边界情况
- 依赖项:需要模拟的外部服务、数据库、API
- 副作用:文件 I/O、网络调用、DOM 变更
-
创建测试文件 — 将其放在源文件旁边或
__tests__/目录中,并遵循项目惯例:src/utils/format.ts→src/utils/format.test.tssrc/components/Button.tsx→src/components/Button.test.tsx
-
按照以下结构编写测试:
import { describe, it, expect, vi } from "vitest"; describe("functionName", () => { // Happy path it("returns formatted output for valid input", () => { ... }); // Edge cases it("handles empty string", () => { ... }); it("handles null/undefined input", () => { ... }); // Error cases it("throws on invalid argument", () => { ... }); // Boundary conditions it("handles maximum length input", () => { ... }); }); -
模拟外部依赖项 — 不要在单元测试中进行真实的 API 调用或数据库查询:
vi.mock("@/lib/db", () => ({ query: vi.fn().mockResolvedValue([{ id: 1, name: "test" }]), }));对于 React 组件,模拟用于获取数据的钩子:
vi.mock("@/hooks/useUser", () => ({ useUser: () => ({ user: { name: "Test" }, isLoading: false }), })); -
使用 Testing Library 测试 React 组件:
import { render, screen, fireEvent } from "@testing-library/react"; it("renders the button and handles click", () => { const onClick = vi.fn(); render(<Button onClick={onClick}>Click me</Button>); fireEvent.click(screen.getByRole("button", { name: "Click me" })); expect(onClick).toHaveBeenCalledOnce(); }); -
运行测试并确认通过:
npm test如果有测试失败,请修复测试或代码(具体取决于错误出在测试预期还是实现)。
测试内容
- 始终测试:公共 API、错误处理、边界情况(空、null、零、负数)、状态转换、异步行为
- 跳过测试:私有实现细节、第三方库内部逻辑、简单的 getter/setter、仅类型代码
说明
- 遵循项目现有的测试风格——如果项目使用
test()而不是it(),也请使用test()。 - 不要测试实现细节——测试行为和输出,而不是内部方法调用。
- 使用能说明场景的测试名称,例如“购物车为空时返回 0”,而不是“test1”。
- 每个测试只验证一个断言概念——如果多个
expect调用验证的是同一行为,也可以使用。 - 对于异步代码,始终对结果使用
await,或使用resolves/rejects匹配器。
评论
支持 Markdown