核心判断
TDD 不是“多写测试”,而是把需求理解、任务分解、架构共识和实现验证都落到可重复的自动化测试里程碑上。它用测试替代开发过程中大量隐性的手动验证与手动排查,从而提高工程效能。
在“理解需求,明白架构”是一切工程化软件开发的前提,那么 TDD 就是目前已知的工程效能最高的办法。
这个主题下我目前知道的内容
TDD 要替代的是隐性测试成本
程序员在日常开发中其实一直在测试,只是这些测试经常是隐性的、手动的、不可重复的:
- 验证性测试:为了知道代码有没有错误,临时写一个测试应用、加入大量输出逻辑、在本地环境跑一下,再从浏览器或控制台观察结果。
- 定位性测试:当错误发生时,通过断点和 debug 去定位问题发生在哪里。
这类“无计划的手动验证”和“手动的启发式排查”效率很低,因为它们不可重复。下一个人如果要继续开发,就必须重新花时间复现前一个人的验证流程;一旦没有复现,就很容易出现“做了 A 功能,结果 B 功能坏了”的问题。
TDD 的价值,是把这些低效测试手段替换成有计划的自动化验证和有计划的逐模块自动化排查。所以不是“程序员要不要写测试”,而是:如果没有留下自动化验证,就等于没有真正把活干完。
相关概念:TDD 降低程序员的隐性测试成本、TDD 的测试里程碑
TDD 的核心是先理解需求,再把理解变成可验证任务
测试驱动体现的是深层分析性思考能力:先理解需求、分析需求,形成大致任务列表,再把任务列表进一步分解为可测试的任务。
TDD 不只是告诉我们“怎么写测试”,也不是为了“消除测试人员”或“让开发人员多干一份活”。它是一种以测试为里程碑点的工程化研发过程,追求的是功能覆盖率,而不是单纯的代码行覆盖率。
TDD 如何提升工程效能
从团队协作角度看,TDD 不只表示“我理解了需求”,还通过测试向其他人证明“我的确理解了这个需求”。在协作中,能留下可运行、可验证的测试,是证明开发者靠谱的基本方式。
从长期稳定角度看,团队越不敢修改祖传代码,往往是因为一旦改错,就难以定位究竟哪里出了问题。TDD 中由任务列表产生的测试,既是实现过程的记录,也能帮助团队发现问题、定位问题。
从持续提高水平角度看,TDD 会迫使开发者持续澄清需求与架构;而需求和架构的清晰度,会直接反映在任务列表、功能上下文和测试拆分上。
相关概念:TDD 证明开发者理解了需求
TDD 与 Vibe coding 的差异
Vibe coding 是一种几乎与 TDD 相反的实践:把需求告诉 AI,让 AI 实现;如果运行错误,就把控制台报错贴给 AI 修复,然后循环往复。
这和“跑一下、看看效果、再修改”的 debug 编码模式没有本质区别。开发者始终停留在 Complicated 认知模式1中,没有真正理解业务和代码。很多人追求给 AI 输入更多上下文,但如果一个功能需要查询大量上下文代码才能修改,往往说明任务分解不到位,或开发者对代码库并不熟悉。
相关概念:Vibe coding 与 TDD 的核心差异的定义
TDD 的工作流程
一个简易例子:restful web service spike
- 将需求分解为功能点,也就是把需求转化为一系列可验证的里程碑点。
- 如果已经存在架构或架构愿景,则依据架构中定义的组件与交互,将功能点分解为不同的功能上下文。
- 如果尚不存在架构愿景,则可以先将功能点作为功能上下文。
- 将功能点按照功能上下文继续分解为任务项,也就是把可验证的里程碑点拆成具体上下文中的可验证任务。
- 将任务转化为自动化测试,进入红 / 绿 / 重构循环,驱动功能上下文内的功能实现。
- 如果重构涉及功能上下文的重新划分,即提取 / 合并组件,就视作对架构的重构与梳理,并调整后续功能点、功能上下文和任务项的划分。
- 如此往复,直到所有功能完成。
可以用 TDD 观察团队的哪些能力
- 看测试:判断一个人是否真正理解了需求。写不出测试,通常就是还没有理解需求;否则团队只能通过大量拉通会议反复宣讲确认。
- 看测试:降低进入探索模式的成本。在有限时间内判断需求是否被正确理解,并通过可管控的工程方式交付,从而低成本及时止损。
- 看功能上下文拆分:判断团队是否对架构愿景达成共识。对于同一个功能点,团队成员拆分出的功能上下文应该大体一致,否则所谓架构愿景可能只是空话。
- 看功能上下文拆分:判断当前架构是否能实现当前需求。如果无法拆出合理的功能上下文和任务项,说明这个需求可能不容易被当前架构承载,需要通过重构抽取架构要素,演进式调整架构。
相关概念 / 下层卡片
暂时结论
TDD 的关键不是测试本身,而是把“我理解了什么、准备怎么做、如何证明它完成了、出了问题怎么定位”全部外化为可重复运行的工程资产。它让测试从临时手段变成研发过程的骨架。
后续还可以继续探索合适的 AI 协作模式:如何让 AI 不是替代需求理解,而是参与功能点拆解、测试生成和红 / 绿 / 重构循环。
