Skip to content

tdd — 测试驱动开发

  • 触发方式: /tdd 或关键词「TDD」「test-driven」「测试驱动」「red-green-refactor」
  • 适用场景: 新功能开发、Bug 修复、需要集成测试的任务
  • 不适用场景: 纯探索性编码、一次性脚本、已有完整测试覆盖的简单改动

功能概述

tdd 让 Claude Code 严格遵循测试驱动开发流程:先写失败测试 → 写最少代码通过测试 → 重构优化。确保每行代码都有测试覆盖。

触发条件

以下情况会自动触发 tdd

  • 提到「用 TDD 方式」、「测试驱动开发」
  • 提到「red-green-refactor」
  • 要求先写测试再写实现
  • 使用 /tdd 命令

使用示例

示例 1:实现工具函数

/tdd 实现一个 deepClone 函数,支持 Date、RegExp、Map、Set 类型

Claude 会先生成测试用例:

javascript
describe('deepClone', () => {
  it('should clone primitive values', () => {
    expect(deepClone(42)).toBe(42);
    expect(deepClone('hello')).toBe('hello');
  });

  it('should deep clone nested objects', () => {
    const obj = { a: { b: { c: 1 } } };
    const cloned = deepClone(obj);
    expect(cloned).toEqual(obj);
    expect(cloned.a).not.toBe(obj.a);
  });

  it('should clone Date objects', () => {
    const date = new Date('2026-01-15');
    const cloned = deepClone(date);
    expect(cloned.getTime()).toBe(date.getTime());
    expect(cloned).not.toBe(date);
  });
});

然后逐步实现,每步都确保所有测试通过。

示例 2:API 接口开发

/tdd 实现用户注册 API POST /api/register,包含邮箱验证和密码强度校验
  1. 红灯: 先写集成测试 — 正常注册、重复邮箱、弱密码、缺少字段
  2. 绿灯: 实现路由、验证逻辑、数据库操作
  3. 重构: 提取验证中间件,优化错误处理

示例 3:Bug 修复

/tdd 修复订单金额计算含税时浮点精度问题

先写一个复现 Bug 的测试 → 测试失败 → 修复(如改用 decimal 库)→ 测试通过。

示例 4:重构遗留代码

/tdd 重构 src/utils/price.ts 中的 calculateDiscount 函数,先补测试

示例 5:组件开发

/tdd 实现一个 Autocomplete 组件,支持键盘导航和防抖搜索

工作流程

  1. Red(红灯) — 先写测试,运行确认测试失败
  2. Green(绿灯) — 写最少代码使测试通过
  3. Refactor(重构) — 在测试保护下优化代码结构

注意事项

  • 测试应该测行为而非实现细节
  • 重构阶段不要同时加新功能
  • 如果某个场景测试难以编写,可能是设计需要调整
  • 对已有代码库做 TDD 时,先补特征测试(characterization tests)锁定现有行为
  • 不是所有代码都适合 TDD — 探索性原型更适合 /prototype

相关 Skills

  • prototype — 先做原型探索,确定方案后再用 TDD 正式实现
  • review — TDD 完成后审查测试质量
  • simplify — 重构阶段的深度简化