
name: tdddescription: Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions “red-green-refactor”, or wants integration tests.category: “development”risk: “safe”source: “community”source_repo: “mattpocock/skills”source_type: “community”date_added: “2026-06-19”author: “Matt Pocock”license: “MIT”license_source: “https://github.com/mattpocock/skills/blob/main/LICENSE”tags:engineeringworkflowcoding-agentstools:claude-codecodex-clicursor测试驱动开发TDD何时使用当此工作流程与用户请求匹配时使用按其文档化的工作流程使用此技能。来源mattpocock/skillsMIT 协议。理念核心原则测试应通过公共接口验证行为而非实现细节。代码可以彻底改变测试不应随之改变。好的测试是集成风格的它们通过公共 API 运行真实的代码路径。它们描述系统_做了什么_而不是_如何做_。好的测试读起来像一份规格说明——用户可以使用有效的购物车结账精确地告诉你存在什么能力。这些测试能在重构中存活因为它们不关心内部结构。糟糕的测试与实现耦合。它们模拟内部协作者、测试私有方法或通过外部手段验证比如直接查询数据库而不是使用接口。警示信号当你重构时测试崩溃但行为并未改变。如果你重命名一个内部函数导致测试失败那么这些测试测的是实现而不是行为。参见 tests.md 获取示例mocking.md 获取模拟指南。反模式水平切片不要先写全部测试再写全部实现。这是水平切片——把 RED 当作写所有测试把 GREEN 当作写所有代码。这会产出糟糕的测试批量编写的测试测试的是_想象中_的行为而不是_实际的_行为你最终会测试事物的_形状_数据结构、函数签名而不是面向用户的行为测试对真实变化不敏感——行为被破坏时它们通过行为正常时它们失败你跑到了车灯照不到的前方在理解实现之前就固化了测试结构正确方法通过曳光弹tracer bullets进行垂直切片。一个测试 → 一个实现 → 重复。每个测试都回应你在前一个循环中学到的东西。因为你刚刚写了代码你确切知道什么行为重要以及如何验证它。错误水平 RED: test1, test2, test3, test4, test5 GREEN: impl1, impl2, impl3, impl4, impl5 正确垂直 RED→GREEN: test1→impl1 RED→GREEN: test2→impl2 RED→GREEN: test3→impl3 ...工作流程1. 规划在探索代码库时阅读CONTEXT.md如果存在以便测试名称和接口词汇与项目的领域语言一致并尊重你所触及区域的 ADR架构决策记录。在编写任何代码之前与用户确认需要哪些接口变更与用户确认要测试哪些行为确定优先级识别深层模块小接口、深实现的机会——运行/codebase-design技能获取词汇表和可测试性检查列出要测试的行为而非实现步骤获得用户对计划的批准提问“公共接口应该是什么样子的哪些行为最值得测试”你不可能测试所有东西。与用户确认到底哪些行为最重要。将测试工作集中在关键路径和复杂逻辑上而不是每一个可能的边界情况。2. 曳光弹Tracer Bullet写一个测试确认系统的一件事情RED: 为第一个行为写测试 → 测试失败 GREEN: 编写最少的代码使其通过 → 测试通过这就是你的曳光弹——证明这条路径端到端可行。3. 增量循环对每个剩余的行为RED: 写下一个测试 → 失败 GREEN: 编写最少的代码使其通过 → 通过规则一次只写一个测试只写足以通过当前测试的代码不要预判未来的测试让测试专注于可观察的行为4. 重构在所有测试通过后寻找重构候选提取重复代码加深模块把复杂性移到简单接口后面在自然之处应用 SOLID 原则思考新代码揭示了现有代码的什么问题每个重构步骤后运行测试绝不要在 RED 状态下重构。先到达 GREEN。每个循环的检查清单[ ] 测试描述行为而非实现 [ ] 测试只使用公共接口 [ ] 测试在内部重构后仍能存活 [ ] 代码对于这个测试是最少的 [ ] 没有添加投机性功能局限性当工作流程指定了上游工具、账户、API 密钥或本地配置时需要具备这些条件。未经用户明确批准不授权破坏性、生产环境、付费或对外消息类操作。在将生成的工件或建议视为最终结果之前请对照用户的真实来源进行验证。