name: 测试生成 description: 当用户询问测试、提到TDD,或者编写了新代码需要测试覆盖时使用。 context: fork agent: 测试工程师
测试生成
概述
生成全面测试,遵循TDD原则和项目测试标准。在隔离的测试工程师上下文中运行,预加载测试约定。
开始时宣布: “我使用测试生成技能为[功能/组件]创建测试。”
过程
步骤 1: 指定测试要求
向测试工程师提供清晰的要求:
/测试生成
特性:JWT令牌验证中间件
行为:
1. 有效令牌 → 允许请求
2. 过期令牌 → 拒绝,状态码401
3. 无效签名 → 拒绝,状态码401
4. 缺少令牌 → 拒绝,状态码401
覆盖:所有关键路径
测试标准(预加载):
- 框架:vitest
- 模拟:vi.mock()
- 结构:AAA模式
步骤 2: 审查测试计划
测试工程师提出测试计划:
## 测试计划
行为:
1. 有效令牌
- ✅ 正面:允许带有有效JWT的请求
- ❌ 负面:拒绝格式错误的JWT
2. 过期令牌
- ✅ 正面:正常令牌有效
- ❌ 负面:过期令牌被拒绝,状态码401
模拟策略:
- JWT验证:使用vi.mock()模拟
- 请求/响应:使用测试替身
覆盖目标:95%行覆盖,所有关键路径
重要:在实施前审查并批准。
步骤 3: 实施测试
测试工程师遵循AAA模式(安排-执行-断言)实施:
describe('JWT中间件', () => {
it('允许带有有效令牌的请求', () => {
// 安排
const req = mockRequest({ headers: { authorization: 'Bearer valid.jwt.token' } });
// 执行
const result = jwtMiddleware(req);
// 断言
expect(result.authorized).toBe(true);
});
});
步骤 4: 运行自我审查
测试工程师验证:
- ✅ 每个行为的正面和负面测试
- ✅ 遵循AAA模式
- ✅ 所有外部依赖模拟
- ✅ 测试是确定性的(无随机性)
- ✅ 标准合规
步骤 5: 运行测试
执行测试套件并验证所有通过:
npm test -- jwt.middleware.test.ts
步骤 6: 返回结果
status: success
tests_written: 8
coverage:
lines: 96%
branches: 93%
functions: 100%
behaviors_tested:
- name: "有效令牌处理"
positive_tests: 2
negative_tests: 2
test_results:
passed: 8
failed: 0
deliverables:
- "src/auth/jwt.middleware.test.ts"
TDD工作流
对于测试驱动开发,在实施前调用:
/测试生成
为用户注册端点编写测试(尚未实施):
预期行为:
- POST /api/register 带有有效数据 → 201 + 用户对象
- POST /api/register 带有重复邮箱 → 409错误
- POST /api/register 带有无效邮箱 → 400错误
注意:实施尚未存在。编写定义预期行为的测试。
测试最初会失败—使用它们作为规范指导实施。
错误处理
测试不匹配项目约定:
- 主代理必须预加载
.opencode/context/core/standards/tests.md
缺少边缘情况:
- 在要求中明确指定
不稳定测试:
- 确保所有外部依赖模拟
红色标志
如果您想到任何这些,停止并重新阅读此技能:
- “实施足够简单,不需要测试”
- “我现在只编写正面路径测试”
- “模拟此依赖太复杂”
- “功能稳定后我再添加测试”
常见合理化
| 借口 | 现实 |
|---|---|
| “太简单,不会坏” | 简单代码以简单方式坏。测试记录契约,不仅仅是捕获错误。 |
| “负面测试是明显失败,不值得编写” | 负面测试是错误隐藏的地方。“明显失败"不等于"正确失败”。 |
| “模拟此依赖太难” | 难以模拟的依赖是设计问题。无论如何模拟并注意问题。 |
| “测试减慢交付” | 没有负面案例的测试给出虚假信心。虚假信心更减慢交付。 |
记住
- 在调用技能前预加载测试标准
- 指定清晰的行为和接受标准
- 在实施前审查测试计划
- 正面和负面测试都是必需的
- 所有外部依赖必须模拟(没有真正的网络/数据库调用)
- AAA模式(安排-执行-断言)强制使用
- 测试必须是确定性的(没有随机性或时间依赖)
相关
- code-execution
- code-review
- context-discovery