tdd
1. Bilingual SKILL.md
左右滑动可直接切换英文版与中文版;两种语言按段落自动对齐。英文中的蓝色虚线词语可点击查看解释。共标记 12 处。
Entry SHA-256: cb01f66bebfaa25fa1f88e6b7e769cd9fd9f35b1120b8563749820738814c927
2. Why This Skill Is Clever
一句话核心机制
把 TDD 压缩为受约束的“一个已确认边界、一个行为测试、一个最小实现”反馈循环,并用独立真值、公共接口和纵向切片保证测试长期有价值。
触发与调用边界
直接来源: frontmatter 把触发范围限定为用户明确要求 test-first、提到 “red-green-refactor”,或需要 integration tests 的场景。正文又要求每次循环前后都持续参考本技能,而不是完成实现后才补看规则。
直接来源: 写任何测试前必须先写下测试 seam 并与用户确认;若公共接口本身尚未确定,技能只调用 codebase-design 作为词汇参考,而不是启动另一个完整工作流。
解释: 这使技能适合已经准备进入实现、但需要先确定“从哪里观察行为”的任务。若用户尚未决定功能目标,或当前工作只是探索方案,应该先完成需求与接口设计,而不是立刻写测试。
信息架构 / 执行顺序
- 读取领域语境: 若存在
CONTEXT.md,用其中的领域语言命名测试,并尊重相关 ADR。 - 定义好测试: 只通过公共接口验证行为,让测试像规格说明并能经受内部重构。
- 确认 seam: 写下候选公共边界,与用户确认测试投入应落在哪些关键路径。
- 排除反模式: 检查实现耦合、同义反复和横向批量切片。
- 执行单轮循环: 先写一个失败测试,再写恰好足够的实现使其通过。
- 吸收反馈并重复: 把上一轮测试当作 tracer bullet,用新理解决定下一条纵向切片。
- 推迟重构: 当前技能只负责 red → green;重构进入后续
code-review阶段。
最巧妙的设计点
1. 先确认观察边界,再允许产生测试
“Test only at pre-agreed seams.”
直接来源: seam 不是执行者私下选择的实现细节,而是写测试前必须与用户确认的公共观察点。这样把“测什么”从低层编码动作提升为资源分配决策:有限测试投入优先落在关键路径和复杂逻辑。
2. 用“独立真值”识别看似合理的空测试
“Expected values must come from an independent source of truth”
直接来源: 技能不仅防止常见的私有方法测试,还单独定义 tautological test:如果期望值用与实现相同的方式重新计算,测试就会 pass by construction。已知字面值、推导示例或规格才是能与实现发生分歧的真值来源。
3. 把每个循环做成学习探针,而不是批量承诺
“each test a tracer bullet”
直接来源: 纵向切片要求“一条测试 → 一个实现 → 重复”,下一轮必须响应上一轮学到的事实。这避免先写完大量针对“想象行为”的测试,再被迫让实现迁就早期猜测。
4. 对最小实现设置明确的负面边界
“Don't anticipate future tests or add speculative features.”
直接来源: “只写够通过的代码”容易被宽松解释;这条规则进一步禁止预测未来测试和顺手加入猜测功能,使 green 阶段保持可审计的最小范围。
5. 把重构从循环中显式移出
“Refactoring is not part of the loop.”
直接来源: 与经典 red-green-refactor 口号不同,本技能明确把 refactoring 交给 code-review。它用阶段所有权避免在行为尚未逐片验证时同时改变结构,减少一个循环内的变量数量。
解释: 这是有意的流程取舍,而不是 TDD 的普遍定义;迁移到其他团队时必须确认其 review 阶段真的会承担重构,否则技术债会被持续推迟。
6. 让参考资料细化原则,但不污染主循环
“See tests.md for examples and mocking.md for mocking guidelines.”
支持性上下文: tests.md 用好坏示例具体化“WHAT not HOW”和独立字面真值;mocking.md 把 mock 限制到系统边界,并推荐依赖注入和具体 SDK 风格接口。主 SKILL.md 保持短小,执行者只在需要例子或 mock 决策时下钻。
防失败机制与显式不变量
直接来源:
- 测试必须经由公共接口验证行为,不得绑定内部实现;
- 未经用户确认的 seam 上不得写测试;
- 期望值必须来自独立真值,不能复制实现算法;
- 每轮只允许一个 seam、一个测试和一个最小实现;
- 必须先看到 red,再写 green;
- 不得预测未来测试或加入 speculative features;
- 不得先批量写所有测试再批量实现;
- 重构不属于本循环,交给
code-review阶段。
取舍、可移植风险与宿主假设
解释: 强制用户逐个确认 seam 能提升测试投资质量,但在无人值守、批量修复或已有成熟测试策略的仓库中会增加交互成本。“公共接口”也可能过粗:只做端到端测试会降低故障定位速度,因此团队仍需定义哪些模块边界算作稳定 seam。技能假设宿主能读取 CONTEXT.md、ADR,并能通过 Skill tool 找到 codebase-design 与 code-review;换到不支持这些约定的 harness 时需要映射替代入口。最后,把 refactor 延后能保持循环纯度,却依赖 review 阶段可靠发生,否则最小实现会累积成结构债务。
可迁移原则
- 在产生工件前确认观察边界。 先约定从哪里判断成功,再决定具体测试。
- 要求验证证据独立于被验证算法。 任何与实现同源的期望值都可能制造假安全感。
- 用完整的微小纵向切片换取快速反馈。 每轮贯穿测试和实现,不提前批量承诺结构。
- 为“最小”写出禁止清单。 明确禁止预测未来和附带功能,比只说“少写代码”更可执行。
- 为每个阶段指定唯一所有者。 若重构不在实现循环,就必须明确由哪个后续阶段接管。
今日实践题
假设你要为“用户可以用有效购物车结账”写第一条测试:你会先与用户确认哪个公共 seam、采用什么独立期望值,并把哪些内部调用细节明确排除在断言之外?
Evidence note
本文关于触发条件、公共接口、seam 确认、三类反模式、纵向切片和 red → green 规则的结论来自所选 SKILL.md。tests.md 与 mocking.md 只作为支持性上下文,用于解释示例和 mock 边界,未作为所选原文展示。关于交互成本、测试粒度、harness 依赖和重构延后风险属于设计解释。
Source & provenance
- Repository path
- skills/engineering/tdd/SKILL.md
- Generated
- 2026-08-22 08:22 Asia/Shanghai
- Upstream commit
- 5b15a47f2d7150f545fbcacbfe381787fc0230dc
- Source
- View on GitHub