tdd 是一项用于测试驱动开发的技能,帮助你用红-绿-重构循环来构建功能、修复 bug 并编写耐用的测试。它强调通过公共接口进行以行为为中心的测试、仅在边界处进行 mocking,以及面向测试自动化、重构和接口设计的实用指导。
该技能得分 78/100,说明它很适合作为目录用户的候选条目:它能清晰匹配 TDD/red-green-refactor 相关需求,并提供足够的流程指引来减少试错;但它更偏向方法论说明,而不是工具型能力,且缺少安装时自动化或支持文件。对于想给 agents 准备一套实用 TDD 操作手册的用户来说,值得安装;如果需要更深度的项目级集成,可能还需要更多脚手架。
- 触发能力强:frontmatter 明确说明可用于基于 TDD/red-green-refactor 构建功能或修复 bug,也适用于 integration tests 或 test-first development。
- 操作指引具体:涵盖公共接口测试、何时 mock、为了可测试性进行接口设计,以及可作为重构候选的场景,并配有代码示例和相关子主题链接。
- 渐进式展开设计好:主 SKILL.md 会指向聚焦的配套文档(tests、mocking、interface design、refactoring、deep modules),agent 可以按需深入,不必靠猜。
- 没有安装命令或支持文件/脚本,因此只能通过阅读指南来采用,不能借助任何自动化流程。
- 内容明确偏向 integration-style testing,并避免内部 mocks,这可能不适合高度依赖单元测试密集型 TDD 风格的团队。
tdd 技能概述
tdd 是一个用于通过红-绿-重构循环来构建功能和修复 bug 的 Test-Driven Development 技能。它最适合想要一份实用的 tdd 指南、并且希望测试始终围绕行为而不是实现来编写的工程师。如果你正在维护一个经常重构、接口很重要、而脆弱测试又拖慢开发节奏的代码库,这个技能可以帮助你写出更能经受变化的测试。
它要解决的核心任务很直接:把一个粗略的功能想法,转成一系列安全、可测试的小步骤。tdd 技能尤其适合测试自动化、偏集成式的测试,以及那些因边界更清晰而受益的代码。它最强的主张是:通过公开接口测试,只在真正的系统边界上做 mock。
tdd 是用来做什么的
当你需要为新行为、bug 修复,或者需要安全网的重构采用测试先行流程时,就用 tdd。如果你已经知道期望结果,但还没确定最干净的实现路径,它尤其适合。
这个 tdd 技能有什么不同
这个 repo 讲的不只是“先写测试”。它强调的是一套具体纪律:避免横向切片,优先写面向行为的测试,并设计更容易测试的接口。当你需要的是耐用测试,而不是快但脆的测试时,tdd 技能会比泛泛的提示词更有用。
什么时候 tdd 不适合
如果你只需要一个临时的单元测试、一个一次性脚本,或者那种高度依赖 mock 来验证内部调用的测试,这大概率不是合适的工具。这个技能面向的是你预期会持续重构的软件;在这里,测试质量比测试数量更重要。
如何使用 tdd 技能
安装并加载技能
先使用目录里的安装命令完成 tdd install 步骤,然后优先打开 SKILL.md。接着再阅读 tests.md、mocking.md、interface-design.md、refactoring.md 和 deep-modules.md,这些文件才是真正决定输出质量的规则来源。
给技能行为,不要给解决方案
最好的 tdd usage 会从一个用户可见的结果、一个输入和一个预期结果开始。更强的提示词写法例如:
- “新增结账校验:无效购物车返回清晰错误,有效购物车完成支付”
- “修复重复邮箱会创建两个账号的 bug”
- “为一个针对 payment API 的重试流程编写测试,使用公开的 service interface”
较弱的提示词写法例如:
- “给 checkout 写测试”
- “让这个模块更可测试”
- “mock 数据库并验证函数被调用了”
按红-绿-重构循环推进
从最小的可观察行为开始,先写一个能证明问题存在的失败测试,再补上最少的代码让它通过,然后在保持测试为绿的前提下重构。不要先把所有测试一口气写完、再统一实现;这个技能明确反对横向切片,因为那样会制造“想象中的行为”,而不是真正被测试覆盖的行为。
先读这些文件
实际执行时,建议优先看这些文件:
SKILL.md:理念和工作流tests.md:好测试与坏测试模式mocking.md:只在边界做 mockinterface-design.md:让代码更易测试refactoring.md:第一次通过测试之后该改什么
tdd 技能 FAQ
tdd 只适合单元测试吗?
不是。这个 tdd 技能更偏向通过公开接口来写集成式测试,这往往比孤立的、重单元测试的方案更适合测试自动化和行为测试。
我需要把所有东西都 mock 掉吗?
不需要。这个 tdd guide 的核心规则之一,是只在系统边界上做 mock,例如外部 API、时间、随机性,或者有时是文件系统或数据库。不要为了让测试通过,就去 mock 你自己的模块。
初学者能用 tdd 吗?
可以,只要你能清楚描述预期行为。主要学习曲线不在语法,而在于如何选对边界,以及如何避免写成实现细节测试。
tdd 和普通提示词有什么区别?
普通提示词可能只会产出“能编译”的测试。tdd 技能的观点更强:它推动你写面向行为的测试、小步推进,以及能在重构过程中保持稳定的接口设计。
如何改进 tdd 技能
从更清晰的输入开始
当你把行为、边界和约束都写进去时,tdd 的效果会更好。例如,与其说“让这个测试可测试”,不如说“构建一个可重试的邮件发送器,使用真实的 service wrapper,但 mock 时间和外部提供方”。
留意常见失败模式
最常见的问题是过度 mock、测试 private methods,以及写出描述代码如何工作而不是用户看到了什么的测试。如果第一次生成的内容太贴近实现,说明提示词需要改:明确 public API 和可观察结果。
从测试反推设计
拿到第一版输出后,可以借助失败点来改进接口设计:把参数拆小、把返回值说清楚、减少副作用。如果代码依然很难测,问题可能出在 API 形状,而不是测试本身。
绿灯后再要求重构目标
当行为已经被覆盖后,可以继续让技能找出重复、长方法、浅层模块、feature envy 或 primitive obsession。tdd 技能的额外价值也在这里:它能帮你从“测试通过”推进到更干净的设计,而且这种设计会一直更容易测试。
