关于 tdd
一项引导开发者实践测试驱动开发的技能,覆盖从确认测试命令到完成 Red-Green-Refactor 循环。它强调行为测试、小步垂直切片,以及确认失败原因有效。
主要功能
- 01Red-Green-Refactor 工作流
- 02发现测试运行器
- 03编写聚焦的行为测试
- 04持续获取测试反馈
- 05查看测试状态与后续步骤
适用场景
- 01为新功能启动 TDD
- 02编写描述目标行为的测试
- 03实现通过测试所需的最少代码
- 04在测试保持通过时重构
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jellydn/ my-ai-tools --skill tdd安装后在 Claude Code 中输入/tdd确认已加载。
附带文件templates/test-template.md
详细介绍
测试驱动开发(TDD)
通过 Red-Green-Refactor 循环,引导你完成完整的 TDD 工作流。
用法
/tdd <ACTION> [ARGUMENTS]
操作
- start - 为某项功能初始化 TDD 会话
- red <TEST_NAME> - 创建失败的测试(Red 阶段)
- green - 运行测试并实现代码(Green 阶段)
- refactor - 引导重构流程(Refactor 阶段)
- cycle - 运行完整的 Red-Green-Refactor 循环
- watch - 启动测试监视器,持续获取反馈
- status - 显示当前测试状态和后续步骤
TDD 原则
Red-Green-Refactor 循环
- Red:编写一个失败的测试,用于定义期望的行为
- Green:编写最少量的代码,使测试通过
- Refactor:在保持测试通过的同时提升代码质量
最佳实践
- 先编写测试——测试定义接口和行为
- 小步前进——进行微小、渐进式的更改
- 快速反馈——频繁运行测试,立即验证
- 代码整洁——定期重构以保持质量
- 每个测试只覆盖一个概念——让测试保持聚焦且原子化
- AAA 模式——按照 Arrange、Act、Assert 的结构组织测试
- 黑盒测试——只测试公共方法和行为,不测试实现细节
- 在双方约定的接缝处测试——编写测试前,先确定暴露该行为的公共接口,并优先选择现有的最高层接缝
- 独立的预期结果——预期值应来自字面值、实际推演示例或规范;不要用与实现相同的算法重新计算
- 垂直切片——编写一个有意义的测试,实现最少代码,然后重复;避免在从第一个循环中获取经验前,就编写整套假想的测试
反模式
- 与实现耦合的测试会模拟私有协作者或检查内部状态。它们会在无害的重构中失败,也无法提供充分的行为验证。
- 同义反复的测试用与被测代码相同的逻辑推导预期值,因此两者可能同时出错。
- 水平切片先编写所有测试,之后再编写所有实现。应优先采用示踪弹式切片,每次只验证一个用户可见的行为。
- 未经确认的接缝仅仅因为容易访问就测试低层辅助函数。如果某行为在更高层的接口中更重要,就应在那里测试,或说明为什么低层接缝才是正确选择。
在第一个 Red 阶段之前,应从项目清单、任务运行器、文档或 CI 中查明仓库使用的测试运行器和命令。不要假定使用 TypeScript、Vitest、npm 或 pnpm。记录导致测试失败时所用的确切命令及失败原因;语法或导入错误不属于有效的 Red 状态。
流程
对于“start ”:
- 为该功能初始化 TDD 会话
- 创建或确定目标源文件
- 如果对应的测试文件不存在,则创建该文件
- 说明功能需求和验收标准
对于“red <TEST_NAME>”:
- 创建一个描述期望行为的失败测试
- 确保测试因正确原因失败(而非语法错误)
- 运行测试,确认处于 Red 状态
- 说明该测试验证的内容
对于“green”:
- 实现最少量的代码,使失败的测试通过
- 专注于让测试通过,而非追求完美代码
- 运行测试,确认处于 Green 状态
- 只编写足以通过测试的代码
对于“refactor”:
- 在保持测试通过的同时提升代码质量
- 消除重复并改进设计
- 重构过程中持续运行测试
- 每次只进行一项重构更改
测试模板
测试模板位于 $SKILL_PATH/templates/test-template.md:
import { describe, it, expect } from "vitest";
import { functionName } from "./module";
describe("functionName", () => {
it("should return formatted output when given valid input", () => {
// Arrange - Setup test scenario
const input = "test input";
const expectedOutput = "expected output";
// Act - Execute the unit under test
const result = functionName(input);
// Assert - Verify expected outcome
expect(result).toBe(expectedOutput);
});
});
常用命令
- 运行测试:
npm test或pnpm test - 监视模式:
npm test --watch - 使用覆盖率:
npm test --coverage
评论
支持 Markdown