test-driven-development
作者 addyosmanitest-driven-development 技能帮助你通过先写一个会失败的测试,再做最小修改让它通过来改代码。适用于逻辑变更、修复 bug、回归问题和边界场景——当你更看重可验证的证据,而不是看起来合理的补丁时尤其合适。
这个技能评分为 84/100,说明它非常适合作为目录条目,面向想要 agent 友好型 TDD 工作流、且希望有清晰触发条件和分步指导的用户。它能帮助 agent 比通用提示词更少靠猜测地选择并执行该技能,但它仍然只是一个单文件技能,没有配套脚本或参考资料。
- 触发条件明确:说明直接指向新逻辑实现、bug 修复和行为变更,适合自动判断何时启用。
- 流程清晰可执行:它把 RED-GREEN-REFACTOR 循环以及适用与不适用的场景都讲明白了。
- 实用深度不错:正文内容较充实,包含多个标题、约束和代码示例,而不是占位文本。
- 没有配套支持文件或安装命令:用户只能拿到 SKILL.md,因此是否采用很依赖认真阅读文档。
- 被标记为 experimental/test 且缺少外部引用,所以可信度主要取决于内容本身,而不是工具链或引文。
test-driven-development 技能概览
test-driven-development 技能的核心价值,是先用测试证明行为,再实现刚好能让测试通过的最小修复。它尤其适合开发者和智能体处理逻辑变更、bug 修复、边界情况以及回归问题——也就是那种“看起来没问题”远远不够的任务。如果你想借助 test-driven-development skill 来减少拍脑袋式修改,这份指南会告诉你它在什么场景最合适,以及它实际能带来什么:更安全的代码修改、更清晰的需求边界,以及首次提交后更少的返工。
这个技能适合解决什么问题
当任务会改变运行时行为时,就该考虑使用 test-driven-development:例如新增函数、修改判断条件、复现 bug,或任何可能悄悄破坏现有代码的改动。尤其是在仓库本身已经有测试的情况下,这个技能很有价值,因为它能让智能体在项目现有的“证明体系”里工作,而不是凭空猜测应该实现什么行为。
它和普通写代码方式有什么不同
它最关键的价值在于纪律性:先写一个失败的测试,再只实现测试已经证明需要的部分。这样做能给智能体一个非常明确的目标,尽早暴露隐藏假设,并把修复范围尽量收窄。对于 test-driven-development for Skill Testing 这类场景,这往往就是“看起来像是修好了”和“已经被验证修好了”的区别。
什么情况下不适合用
如果改动根本不涉及运行时行为,就不适合使用这个技能,比如文案修改、静态内容更新,或纯配置层面的微调。如果项目几乎没有测试覆盖,它依然可能有帮助,但落地会更慢,因为在这套工作流真正发挥价值之前,你可能得先把测试运行环境搭起来。
如何使用 test-driven-development 技能
安装并先检查技能内容
按照仓库的安装流程完成 test-driven-development install:
npx skills add addyosmani/agent-skills --skill test-driven-development
安装后,先从 SKILL.md 读起。在这个仓库里,没有额外的 rules/、resources/ 或 scripts/ 目录可供参考,所以最重要的工作就是认真读完这个技能文件,并把其中的方法映射到你自己的代码库里。
把模糊需求改写成可测试的提示词
高质量的 test-driven-development usage,起点应该是“行为描述”,而不是“直接要一个方案”。好的输入会像这样:“先为邮箱为空的校验补一个失败测试,再在 src/auth.ts 中实现最小修复。” 不够好的输入则像:“把登录做得更好。”
尽量明确可观察结果、已知的文件或模块,以及你最担心的回归风险。
按 RED-GREEN-REFACTOR 循环推进
把这个技能当成一套工作流来用:先写一个在当前代码下会失败的测试;再写最小代码改动让它通过;最后只在测试仍然通过的前提下做重构。如果失败场景很难稳定复现,不要急着改实现,先把测试用例打磨清楚。这个技能只有在“失败案例足够具体、足以证明 bug 存在”时,效果才最好。
先读对文件,再开始动手
对这个仓库来说,最应该优先读的是 SKILL.md。之后再检查你目标项目里的本地测试环境:测试运行器配置、现有测试约定,以及你计划修改代码附近的测试文件。如果项目已经有成熟的测试模式,就严格照着来;如果没有,就把测试写得尽量小、尽量明确。
test-driven-development 技能 FAQ
这是不是只适合有经验的工程师?
不是。初学者也可以用 test-driven-development,但前提是起点要足够清楚:一个行为、一个失败测试、一个最小修复。相比大范围的新功能开发,这个技能更适合拿小型 bug 修复来上手。
它和普通提示词有什么区别?
普通提示词通常只是要求代码“能工作”。这个技能要求的是“有证据证明它能工作”。test-driven-development guide 会推动智能体把“测试通过”定义为成功标准,从而减少歧义,也让代码评审更容易开展。
什么情况下不该选它?
如果是文档、格式调整,或者无法表达为运行时行为的改动,就跳过它。另一个不适合的场景是:项目根本没有可用的测试基础设施,而你又只需要一次很快的、非行为层面的修改。
test-driven-development 适用于所有技术栈吗?
原则上适用,但具体的测试命令、断言写法和文件结构,取决于你的技术栈。这个技能本身不绑定框架;你本地仓库的约定才决定你会使用 Jest、Vitest、pytest、JUnit,还是其他测试运行器。
如何提升 test-driven-development 技能的使用效果
给智能体一个更尖锐的失败案例
最有效的输入,应该明确指出失败行为、预期结果和边界条件。比如:“当 parseDate("") 执行时,应该抛出 InvalidDateError;先补测试,再修 parser。” 这样能帮助 test-driven-development skill 避免落入模糊实现猜测。
把现有测试风格一并说明清楚
可以主动提及附近的测试文件、命名模式,以及项目里已经在使用的 helpers 或 fixtures。如果仓库在类似行为上使用的是 table-driven tests、mocks 或 integration tests,也要直接说明。贴合本地约定,既能提升可信度,也更容易让产出顺利合并。
留意最常见的失败方式
最典型的错误包括:还没写测试就先写实现、写了一个本来就会通过的测试、以及把修复范围扩张到失败案例之外。如果第一轮输出改得太大,就明确要求“只写最小可失败测试,再给一个最小补丁”。这通常才是获得可靠 test-driven-development usage 的最快路径。
用证据推进迭代,而不是靠猜
第一轮完成后,继续要求下一个“证明点”:再补一个边界情况、加一个回归测试,或者做一次在测试通过前提下的重构。如果 bug 比较隐蔽,可以要求给出修改前后的行为摘要,以及需要新增的确切测试名称。这样整个工作流就会始终围绕可观察行为展开,而不是建立在主观假设之上。
