{title="📊 页面导航"]

适用角色与上手难度

角色推荐度上手难度
🛠️ 开发★★★★★★★☆☆☆
🧪 测试★★★★★★★☆☆☆
📦 产品★★☆☆☆★★★☆☆

🎯 学习产出: 掌握红绿重构循环和好测试标准,能写出值得保留的测试

🚀 AI 能力提升: 代码生成、质量保证

tdd

预计阅读时间: 4 分钟

测试驱动开发。红 → 绿 循环的参考实现,让循环产出值得保留的测试:什么是好测试、测试放哪、反模式、循环规则。每个循环都适用——循环前和循环中查阅,不是事后

概述

核心信念:测试通过公共接口验证行为,而不是实现细节。代码可以彻底改变,测试不该变。好测试读起来像规格说明——"用户能用有效购物车结算"精确描述了存在的能力,重构不破坏它,因为它不关心内部结构。

探索代码库时先读 CONTEXT.md,让测试名和接口词汇匹配项目领域语言,尊重改动区域的 ADR。

日常使用

> 用 tdd 实现一个购物车结算功能
> 用 tdd 修这个 bug

实战

接缝:测试放哪

接缝是观察行为的公共边界——测试在接缝上,绝不测内部。

只在预先商定的接缝上测试。写任何测试前,写下要测的接缝并和用户确认。没有确认的接缝不写测试。你测不了所有东西,事先商定接缝就是让测试精力落在关键路径和复杂逻辑上,而不是每个边界情况。

问:"公共接口是什么?我们该测哪些接缝?"接口形状本身存疑(模块多深、接缝在哪、接口暴露什么)时,调 "codebase-design" 拿词汇——它是模块/接口/深度/接缝/适配器/杠杆/局部性术语的共享来源,是要查阅的参考,不是要跑的会话

三大反模式

反模式特征后果
实现耦合mock 内部协作者、测私有方法、走旁路(查数据库代替走接口)重构就碎,行为没变
同义反复断言用和代码一样的方式重算期望值(expect(add(a,b)).toBe(a+b)、按同样方式手工推出的快照、断言等于自身的常量)恒通过,永不与代码矛盾
水平切片先写完全部测试再写全部实现测的是想象的形状而非用户行为,测试对真实变化不敏感

期望值必须来自独立事实来源:已知正确的字面量、算过的例子、规格。

循环规则

  • 先红后绿:先写失败测试,再只写刚好够过的代码。不预支未来测试,不加投机性功能
  • 一次一个切片:一个接缝、一个测试、一个最小实现
  • 重构不属于循环:它属于审查阶段(code-review),不是红绿实现循环

与其它技能的关系

  • 内部/implement 用它在商定接缝上构建
  • 词汇:接口形状存疑时查阅 codebase-design
  • 审查:重构交给 code-review