TDD 人人都听说过,但 AI 编码代理实践它时最容易走样:一口气写完所有测试再闷头实现、测试钉死实现细节、一重构测试全红。这个技能把 TDD 拆成代理能严格执行的循环纪律。本文按"概述 → 垂直切片 → 行为测试与接缝 → 循环规则 → 重构纪律 → 对比 Superpowers → 注意事项 → 总结"组织全文。
1、概述
skills.sh 页面对 tdd 的定位原文是:"Test-driven development with vertical slices, behavior-focused tests, and incremental red-green-refactor cycles"——垂直切片、面向行为的测试、渐进式红绿重构循环。单个技能安装量 1.0M,首见于 2026 年 2 月,通过 Agent Trust Hub、Socket、Snyk 三项安全审计。
它与 grill-with-docs 有个关键区别:grill 系列是用户调用型(你主动发起拷问),而 tdd 是模型调用型技能——不需要记命令,代理进入写码场景即自动生效。仓库里的 implement 编排器在实现阶段也会显式驱动它。
只装这一个技能的命令如下:
npx skills add https://github.com/mattpocock/skills --skill tdd
解读:整仓库安装与初始化方式与上一篇 grill-with-docs 完全相同(claude plugins install mattpocock-skills 或 npx skills@latest add mattpocock/skills),此处不再重复。
2、垂直切片循环
对 TDD 最常见的误解是"先把所有测试写完,再一次性实现"。tdd 技能明确禁止这种节奏,它规定的循环是:一条测试 → 一段实现 → 再下一条,如此往复。
这个粒度控制防的是两种病:
- 测试套件庞大而脆:实现任何小改动都触发大面积红
- 测试对行为不敏感:测的是内部结构而不是对外承诺
切片循环让每条测试都对应一条可观察的行为,红绿信号始终清晰。循环本身仍是经典的 red → green → refactor,只是步幅被严格切到"一次一条行为"。
3、行为测试与接缝
技能的核心信条是:测试只通过公共接口验证行为,绝不触及实现细节。直接收益写在规则里——好的测试"survive refactors unchanged",重构怎么动,测试都不用改。
实现这一点的关键概念是接缝(seam):受测代码暴露的公共边界。技能为此立了一条硬规则:
"Test only at pre-agreed seams."——只在事先约定的接缝处测试。
接缝必须先写下来、与用户确认,然后才允许写第一条测试。动手前代理必问的问题是:"公共接口是什么,该在哪些接缝上测?"这条规则把"测哪里"从随写随定的侥幸,变成了显式的设计决策。
4、循环规则与模块化
SKILL.md 里有一句容易被忽略但很关键的要求:所有规则"在循环之前与循环之中生效,而不是事后"。也就是说技能不是出错后的解释器,而是每一圈都要对照的检查单。
两个工程细节值得注意:
- 探索代码库时先读
GLOSSARY.md(若存在),让测试命名与领域语言一致,并遵守所触碰区域的 ADR - 示例与 mock 规范外置在
tests.md与mocking.md两个参考文件里,SKILL.md 本体只留规则
第一点尤其妙:GLOSSARY.md 正是 grill-with-docs 在拷问阶段沉淀的产物——上一个技能的输出,成了这个技能的输入,术语表是两个技能之间的共享数据结构。第二点则延续了仓库"小而组合"的一贯风格:规则常驻,细节按需加载。
5、重构纪律
refactor 阶段被严格放在"全绿之后":先证明行为没坏,再动结构。重构手法明确了三类——提取重复、加深模块(deep modules)、SOLID 原则。
"加深模块"的说法源自 Ousterhout 的《A Software Design Philosophy》一派:接口窄而功能深,正是接缝纪律的自然延伸。先约定窄接缝,再在接缝内加深实现,两件事是同一设计观的两面。
6、与 Superpowers 的对比
Superpowers 也有一个 test-driven-development 技能,同样主张 RED-GREEN-REFACTOR。两者定位差异如下:
| 维度 | mattpocock tdd | Superpowers TDD |
|---|---|---|
| 角色 | 专注 TDD 本身的纪律 | 全流程方法论的一环 |
| 循环粒度 | 垂直切片,一次一条行为 | 经典红绿重构循环 |
| 测试位置 | 事先约定的接缝 | 由计划与任务拆解决定 |
| 命名依据 | 读 GLOSSARY.md 对齐领域语言 |
无域语言约定 |
| 文档组织 | 规则 + tests.md/mocking.md 外置参考 |
技能内自含 |
简单说:Superpowers 把 TDD 当作"想法到交付"链条上的一站,mattpocock 则把 TDD 这一站本身做精,补上了切片粒度、接缝约定与领域命名三层细节。两者不冲突,甚至可以叠加使用。
7、注意事项
- 安装量 1.0M 与首见日期均来自 skills.sh 页面快照,以实时数据为准
- 接缝需要与用户确认,全自动流水线场景要预先备好接缝文档,否则代理会停下来问
- 测试命名依赖
GLOSSARY.md,术语表空缺时先跑一次 grill-with-docs 补课 - 模型调用型技能依赖宿主平台的技能触发机制,弱宿主上效果打折
8、总结
mattpocock 的 tdd 技能把 TDD 从口号拆成可执行纪律:垂直切片规定"一次只做一条行为",接缝规则规定"只在事先约定的公共边界测试",行为信条保证测试在重构下不动,规则在循环前与循环中生效,示例与 mock 规范外置保持本体精瘦。它与 grill-with-docs 通过 GLOSSARY.md 首尾咬合,一个负责把领域语言磨清,一个负责用这套语言写测试。
对于正在让代理写代码的 developer,建议在下一个新模块上把两个技能连起来用:先 grill 出术语表与接缝清单,再让 tdd 按清单逐条推进。让 AI 守住红绿循环的关键从来不是提醒它"记得写测试",而是给它一套它无法跳过的规则——这个技能做的正是这件事。