名称: test-generator 描述: 从规格、组件和API端点生成测试代码。遵循项目测试模式和惯例创建单元测试、集成测试和端到端测试。 版本: 1.0 模型: sonnet 调用者: both 用户可调用: true 工具: [Read, Write, Glob, Grep] 最佳实践:
- 分析现有测试模式
- 遵循项目测试惯例
- 生成全面测试覆盖
- 包括边缘案例和错误场景
- 使用适当的测试框架 错误处理: graceful 流支持: supported 模板: [unit-test, integration-test, e2e-test, api-test] 已验证: false 最后验证时间: 2026-02-19T05:29:09.098Z
模式:认知/提示驱动 — 没有独立的实用脚本;通过代理上下文使用。
<身份> 测试生成技能 - 从规格、组件和API端点生成测试代码,遵循项目测试模式和惯例。 </身份>
<能力>
- 为新组件生成测试
- 为API端点创建测试
- 为用户流程生成端到端测试
- 创建集成测试
- 为现有代码添加测试覆盖 </能力>
<指令> <执行过程>
步骤1: 确定测试类型
确定需要什么类型的测试:
- 单元测试: 组件/函数测试
- 集成测试: 服务/API集成测试
- 端到端测试: 完整用户流程测试
- API测试: 端点测试
步骤2: 分析目标代码
检查要测试的代码(使用并行读取/搜索/全局搜索):
- 读取组件/函数代码
- 识别测试案例
- 理解依赖关系
- 注意边缘案例
步骤3: 分析测试模式
审查现有测试:
- 读取类似测试文件
- 识别测试模式
- 注意测试框架使用
- 理解模拟策略
步骤4: 生成测试代码
创建测试,遵循模式:
- 使用适当的测试框架
- 遵循项目惯例
- 包括全面覆盖
- 添加边缘案例和错误场景
步骤5: 覆盖分析
生成测试后,分析覆盖:
-
检查生成的测试是否覆盖所有要求:
- 验证所有函数/方法都经过测试
- 检查所有分支都被覆盖(如果/否则,切换等)
- 确保所有边缘案例都经过测试
- 验证错误场景被覆盖
-
验证测试可运行:
- 检查测试语法有效
- 验证导入正确
- 确保测试框架正确配置
- 验证测试设置/清理正确
-
报告覆盖百分比:
- 计算行覆盖(如果可能)
- 计算分支覆盖(如果可能)
- 报告未覆盖的代码路径
- 建议为未覆盖区域添加额外测试
-
覆盖验证清单:
- [ ] 所有公共函数/方法都有测试
- [ ] 所有错误路径都经过测试
- [ ] 所有边缘案例都被覆盖
- [ ] 测试语法有效
- [ ] 测试可以成功执行
- [ ] 覆盖满足项目阈值(如果定义) </执行过程> </指令>
<示例> <代码示例> 单元测试(React组件)
import { render, screen, waitFor } from '@testing-library/react'
import { describe, it, expect, vi } from 'vitest'
import { UserProfile } from './user-profile'
describe('UserProfile', () => {
it('renders user information', async () => {
const mockUser = { id: '1', name: 'John', email: 'john@example.com' }
render(<UserProfile user={mockUser} />)
await waitFor(() => {
expect(screen.getByText('John')).toBeInTheDocument()
expect(screen.getByText('john@example.com')).toBeInTheDocument()
})
})
it('handles loading state', () => {
render(<UserProfile user={null} loading />)
expect(screen.getByTestId('loading')).toBeInTheDocument()
})
it('handles error state', () => {
render(<UserProfile user={null} error="Failed to load" />)
expect(screen.getByText('Failed to load')).toBeInTheDocument()
})
})
</代码示例>
<代码示例> 集成测试(API)
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import { createTestClient } from './test-client';
describe('Users API', () => {
let client: TestClient;
beforeAll(() => {
client = createTestClient();
});
afterAll(async () => {
await client.cleanup();
});
it('creates a user', async () => {
const response = await client.post('/api/users', {
email: 'test@example.com',
name: 'Test User',
});
expect(response.status).toBe(201);
expect(response.data).toHaveProperty('id');
expect(response.data.email).toBe('test@example.com');
});
it('validates required fields', async () => {
const response = await client.post('/api/users', {});
expect(response.status).toBe(400);
expect(response.data).toHaveProperty('errors');
});
});
</代码示例>
<代码示例> 端到端测试(Cypress)
describe('User Authentication Flow', () => {
beforeEach(() => {
cy.visit('/login');
});
it('allows user to login', () => {
cy.get('[data-testid="email-input"]').type('user@example.com');
cy.get('[data-testid="password-input"]').type('password123');
cy.get('[data-testid="login-button"]').click();
cy.url().should('include', '/dashboard');
cy.get('[data-testid="user-menu"]').should('be.visible');
});
it('shows error for invalid credentials', () => {
cy.get('[data-testid="email-input"]').type('invalid@example.com');
cy.get('[data-testid="password-input"]').type('wrong');
cy.get('[data-testid="login-button"]').click();
cy.get('[data-testid="error-message"]')
.should('be.visible')
.and('contain', 'Invalid credentials');
});
});
</代码示例> </示例>
<指令> <集成> 与开发者代理集成:
- 在开发期间生成测试
- 确保测试覆盖
- 验证实现
与QA代理集成:
- 创建全面测试套件
- 生成测试计划
- 验证测试质量 </集成>
<最佳实践>
- 遵循模式: 匹配现有测试结构
- 全面覆盖: 测试正常路径和边缘案例
- 清晰测试名称: 描述性测试描述
- 隔离测试: 每个测试应独立
- 模拟依赖: 使用适当的模拟策略 </最佳实践> </指令>
<示例> <使用示例> 示例命令:
# 为文件生成测试
node .claude/skills/test-generator/scripts/main.cjs src/components/UserProfile.tsx
# 工具将分析文件并生成适当的测试
</使用示例> </示例>
内存协议(强制)
开始前:
读取 .claude/context/memory/learnings.md
完成后:
- 新模式 ->
.claude/context/memory/learnings.md - 发现的问题 ->
.claude/context/memory/issues.md - 做出的决策 ->
.claude/context/memory/decisions.md
假设中断:如果不在内存中,就没有发生。