用途
TDD 是一个测试驱动开发技能,用于指导“红 → 绿”循环,使该循环产出值得保留的测试。它提供关于什么是好测试、测试应放在哪里、常见反模式以及循环规则的参考。每个部分在每次循环中都适用:应在循环之前和循环过程中查阅,而不是事后。
主要能力
什么是好测试
测试通过公共接口验证行为,而不是实现细节。代码可以完全改变,测试不应随之改变。好测试读起来像规格说明:“user can checkout with valid cart”明确告诉你存在什么能力,并且它能经受重构,因为它不关心内部结构。
示例参见 tests.md,模拟(mocking)指南参见 mocking.md。
接缝:测试放在哪里
接缝(seam)是你进行测试的公共边界:在该接口处观察行为,而不深入内部。测试位于接缝处,绝不针对内部实现。
只在事先商定的接缝处测试。在编写任何测试之前,写下待测试的接缝并与用户确认。不在未确认的接缝处编写测试。你无法测试一切,因此事先商定接缝能让测试工作落在关键路径和复杂逻辑上,而不是每个边缘情况。
可以问:“公共接口是什么,我们应该测试哪些接缝?”
当接口本身的形态存在疑问时(模块有多深、接缝应放在哪里、接口应暴露什么),可调用 Skill 工具并传入 "codebase-design" 获取相关词汇。它是模块、接口、深度、接缝、适配器、杠杆和局部性等术语的共享来源,是供查阅的参考,而不是要运行的会话。
反模式
- 实现耦合:模拟内部协作者、测试私有方法,或通过侧信道验证(查询数据库而不是使用接口)。判断标志:重构时测试失败,但行为并未改变。
- 同义反复:断言以与代码相同的方式重新计算期望值(expect(add(a, b)).toBe(a + b)、以相同方式手工推导的快照、断言常量等于自身),因此它按构造通过,永远无法与代码产生分歧。期望值必须来自独立的事实来源:已知正确的字面量、已演算的示例、规格说明。
- 横向切片:先写所有测试,再写所有实现。批量测试验证的是想象的行为:你测试的是事物的形状而非面向用户的行为,测试对真实变化变得不敏感,并且在理解实现之前就锁定了测试结构。应改为纵向切片:一个测试 → 一个实现 → 重复,每个测试都是一颗曳光弹,回应上一轮循环教给你的东西。
循环规则
- 先红后绿:先写失败的测试,然后只写足够通过它的代码。不要预判未来的测试或添加推测性功能。
- 一次一个切片:每个循环一个接缝、一个测试、一个最小实现。
- 重构不属于循环:重构属于评审阶段(参见 code-review 技能),而不是红 → 绿实现循环。
使用方式
在探索代码库时,阅读 CONTEXT.md(如果存在),使测试名称和接口词汇与项目的领域语言一致,并尊重你所触及区域的 ADR。
适用场景
适用于用户希望以测试优先方式构建功能或修复缺陷、提到“red-green-refactor”,或需要集成测试的场景。
限制
资料未提供该技能的具体安装命令、平台支持、收费方式或价格信息。