关于 vitest-best-practices
面向编写、审查和维护 Vitest 测试的技能,适用于 TypeScript 和 JavaScript 项目。内容按主题提供测试组织、断言、模拟及异步测试的指导,并采用按需加载的参考资料结构。
主要功能
- 01测试组织与命名规范
- 02AAA 与参数化测试
- 03断言与测试替身选择
- 04异步测试和性能建议
- 05Vitest 覆盖率与快照指导
适用场景
- 01为 TypeScript 模块编写单元测试
- 02梳理或重构现有 Vitest 测试
- 03排查不稳定或失败的测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pageai-pro/ ralph-loop --skill vitest-best-practices安装后在 Claude Code 中输入/vitest-best-practices确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
AGENTS.mdreferences/aaa-pattern.mdassertions.mdasync-testing.mderror-handling.mdorganization.mdparameterized-tests.mdperformance.mdsnapshot-testing.mdtest-doubles.mdvitest-features.md详细介绍
Vitest 最佳实践
何时应用此技能
遇到以下任一情形时,请使用此技能:
文件模式
- 处理
*.test.ts、*.spec.ts或类似测试文件 - 为 TypeScript/JavaScript 模块创建新的测试文件
- 审查现有的 vitest 测试套件
用户意图关键词
- 用户提到:vitest、测试、TDD、BDD、单元测试、集成测试
- 用户要求:编写测试、增加测试覆盖率、修复失败的测试、重构测试
- 用户讨论:模拟、桩、断言、测试性能、测试组织
代码上下文
- 从
vitest导入内容的文件(describe、it、expect、vi) - 测试设置/清理代码(
beforeEach、afterEach、beforeAll、afterAll) - 使用
vi.mock()、vi.spyOn()、vi.fn()实现的模拟/间谍 - 断言链(
expect(...).toEqual()、.toBe()、.toThrow()等)
常见任务
- 为现有功能编写新的测试用例
- 重构测试,以提升清晰度或性能
- 调试不稳定或失败的测试
- 提升测试覆盖率或可维护性
- 审查测试代码是否符合最佳实践
不要在以下情形使用此技能
- 使用 Playwright/Cypress 编写端到端测试(范围不同)
- 任务纯粹涉及实现代码,而非测试
此技能涵盖的内容
此技能全面介绍以下内容:
- 测试组织:文件放置位置、命名约定、分组策略
- AAA 模式:使用 Arrange、Act、Assert 结构提升清晰度
- 参数化测试:使用
it.each()测试不同情况 - 错误处理:测试异常、边界情况和故障注入
- 断言:选择严格断言(
toEqual、toStrictEqual、toThrow) - 测试替身:Fake、桩、模拟、间谍——何时使用各自的方式
- 异步测试:Promise、async/await、定时器和并发测试
- 性能:快速测试、避免开销大的操作、清理模式
- Vitest 专属功能:覆盖率、监视模式、基准测试、类型测试、设置文件
- 快照测试:何时以及如何有效使用快照
使用方法
此技能采用渐进式披露结构,以尽量减少上下文用量:
1. 从概览开始(AGENTS.md)
阅读 AGENTS.md,简要了解所有规则及其单行摘要。
2. 按需加载具体规则
确定相关优化后,加载对应的参考文件,了解详细的实现指南:
核心模式:
- organization.md
- aaa-pattern.md
- parameterized-tests.md
- error-handling.md
- assertions.md
- test-doubles.md
进阶主题:
3. 应用模式
每个参考文件都包含:
- ❌ 展示反模式的错误示例
- ✅ 展示最佳实现方式的正确示例
- 关于此模式为何重要的说明
快速示例
此技能可帮助你将不清晰的测试改写为清晰、易维护的测试:
之前(不清晰):
test('product test', () => {
const p = new ProductService().add({name: 'Widget'});
expect(p.status).toBe('pendingApproval');
});
之后(使用此技能优化):
describe('ProductService', () => {
describe('Add new product', () => {
it('should have status "pending approval" when no price is specified', () => {
// Arrange
const productService = new ProductService();
// Act
const newProduct = productService.add({name: 'Widget'});
// Assert
expect(newProduct.status).toEqual('pendingApproval');
});
});
});
核心原则
- 清晰胜于巧妙:测试应当一目了然
- 结构扁平:避免在 describe 块中深层嵌套
- 每个概念一个断言:让测试聚焦于单一行为
- 严格断言:优先使用
toEqual而非toBe,必要时使用toStrictEqual - 尽量少用模拟:条件允许时使用真实实现
- 快速执行:通过高效的设置/清理让测试保持快速
评论
支持 Markdown