with one click
tdd
红-绿-重构循环的测试驱动开发工作流。适用于需用 TDD 构建功能、修复 bug、编写集成测试,或提到"红绿重构"时的场景。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
红-绿-重构循环的测试驱动开发工作流。适用于需用 TDD 构建功能、修复 bug、编写集成测试,或提到"红绿重构"时的场景。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | tdd |
| description | 红-绿-重构循环的测试驱动开发工作流。适用于需用 TDD 构建功能、修复 bug、编写集成测试,或提到"红绿重构"时的场景。 |
核心原则:测试应通过公共接口验证行为,而非验证实现细节。代码可以彻底重构,但测试不应随之变动。
好测试是集成风格的:它们通过公共 API 执行真实的代码路径。测试描述的是系统做什么,而不是怎么做。好测试读起来就像一份规范——"用户可以用有效的购物车完成结账"——清楚说明了系统具备什么能力。这类测试能够经受住重构,因为它们不关心内部结构。
坏测试与实现紧密耦合。它们模拟(mock)内部协作者、测试私有方法,或者通过外部手段间接验证(例如不通过接口而是直接查询数据库)。警告信号:当你重构时测试挂了,但行为没有变化。如果你重命名了一个内部函数而导致测试失败,那些测试测试的是实现,而非行为。
详见 tests.md 中的示例和 mocking.md 中的模拟指南。
不要先写完所有测试,再写所有实现。这就是"水平切分"——把 RED 阶段理解为"写所有测试",GREEN 阶段理解为"写所有代码"。
这会产生糟糕的测试:
正确做法:通过"示踪子弹"(tracer bullet)垂直切分。一个测试 → 一个实现 → 重复。每个测试都基于前一个周期学到的经验。因为你刚刚写了代码,你完全知道什么行为是重要的以及如何验证它。
错误(水平切分):
RED: test1, test2, test3, test4, test5
GREEN: impl1, impl2, impl3, impl4, impl5
正确(垂直切分):
RED→GREEN: test1→impl1
RED→GREEN: test2→impl2
RED→GREEN: test3→impl3
...
在探索代码库时,使用项目的领域术语,使测试名称和接口词汇与项目语言保持一致,并遵守相关区域的 ADR。
在编写任何代码之前:
提问:"公共接口应该是什么样子?哪些行为最重要需要测试?"
你不可能测试所有东西。 与用户确认究竟哪些行为最重要。将测试精力集中在关键路径和复杂逻辑上,而非每个可能的边缘情况。
编写一个测试,验证系统的一件事情:
RED: 编写第一个行为的测试 → 测试失败
GREEN: 编写最简代码使其通过 → 测试通过
这是你的示踪子弹——证明端到端的路径是通的。
对剩余每个行为:
RED: 编写下一个测试 → 失败
GREEN: 编写最简代码使其通过 → 通过
规则:
所有测试通过后,寻找重构机会:
永远不要在 RED 状态下重构。 先回到 GREEN。
[ ] 测试描述的是行为,而非实现
[ ] 测试只使用公共接口
[ ] 测试能够经受住内部重构
[ ] 代码量刚好满足当前测试
[ ] 没有添加推测性的功能