📄 本页由源文件
skills/dev-flow/references/tdd-mode.md自动投影生成(单一权威源)。请勿直接编辑本页。
可选 TDD 模式(RED-GREEN-REFACTOR)
本文件由步骤 5 按需加载。当 AI 识别到适合 TDD 的场景时主动建议开启,用户也可显式要求。
适用场景(AI 主动建议开启)
| 场景 | 示例 |
|---|---|
| 纯逻辑函数 | 数据转换、格式化、计算、排序、过滤 |
| 工具函数/Utils | 字符串处理、日期处理、URL 解析 |
| 自定义 Hooks(纯逻辑) | useDebounce、useLocalStorage、usePagination |
| 状态机/Reducer | 复杂状态转换逻辑 |
| API 数据层 | 请求封装、响应转换、错误映射 |
| 正则表达式 | 输入校验、文本提取 |
不适用场景(默认关闭)
| 场景 | 原因 |
|---|---|
| UI 组件渲染 | 样式/布局难以用 TDD 驱动,快照测试价值有限 |
| 交互动画/过渡 | 视觉效果需浏览器验证,非测试可覆盖 |
| 第三方库集成 | 依赖外部行为,mock 成本高且易脆弱 |
| 一次性脚本/配置 | 投入产出比低 |
| 样式调整 | CSS 变更无法有效 TDD |
TDD 循环流程(RED-GREEN-REFACTOR)
🔴 RED:先写失败测试
- 根据计划中的功能点,编写最小化的测试用例
- 测试必须描述预期行为,而非实现细节
- 运行测试,确认测试失败(且失败原因是功能未实现,而非语法错误)
- 每次只写 1 个测试用例,不要批量写
typescript
// ✅ 好的测试:描述行为
it("should format date as YYYY-MM-DD", () => {
expect(formatDate(new Date(2026, 0, 15))).toBe("2026-01-15");
});
// ❌ 差的测试:测试实现细节
it("should call toISOString and split by T", () => { ... });🟢 GREEN:写最小代码通过测试
- 只写刚好让测试通过的最小代码
- 不要提前优化,不要写"将来可能需要"的代码
- 运行测试,确认测试通过
- 如果测试仍失败,修复代码直到通过(不修改测试)
🔵 REFACTOR:重构(测试保持通过)
- 消除重复代码、改善命名、提取函数
- 每次重构后立即运行测试,确保仍然通过
- 重构不改变行为,只改善结构
- 重构完成后进入下一个 RED 循环
执行规则
- 每个 RED-GREEN-REFACTOR 循环处理一个功能点
- 循环之间保持测试全部通过的状态
- 遇到需要修改已有测试的情况 → 暂停,向用户说明原因
- TDD 模式下的测试文件也计入步骤 5 的
files_created产出 - 测试文件命名遵循项目已有约定(如
*.test.ts、*.spec.ts)
触发方式
| 方式 | 说明 |
|---|---|
| AI 主动建议 | 识别到适用场景时,在步骤 5 开始前建议开启 |
| 用户显式要求 | 用户说"用 TDD"/"测试驱动"/"先写测试" |
| 计划中标注 | 步骤 3 计划表中标注"TDD 模式" |
与步骤 6 的关系
- TDD 模式下,步骤 6A V5(测试验证)的测试已在步骤 5 中编写并通过
- 步骤 6A 仍需执行完整验证管线(Build/Type/Lint 等),TDD 不替代其他验证
- TDD 产出的测试覆盖率可作为步骤 6 的质量指标之一