tdd的核心是用测试定义行为、约束实现、倒逼设计,通过红-绿-重构循环(每轮5–10分钟)驱动开发,以jest等工具保障快速反馈与稳定测试,并强调测试需可读、独立、聚焦边界,最终使测试成为设计说明书。

在 JavaScript 中用单元测试驱动开发(TDD)编写高质量代码,核心不是“先写测试”,而是用测试来定义行为、约束实现、倒逼设计。它让代码从一开始就被使用场景所校准,而不是被开发者主观想象所主导。
红-绿-重构:每个循环都是一次微小的设计决策
这个三步循环是 TDD 的实操骨架,每轮控制在 5–10 分钟内完成,确保节奏紧凑、反馈即时:
-
红阶段:只写一个明确失败的测试,描述一个具体行为(比如
sum([1,2]) 应该返回 3)。不写任何实现,甚至函数都还没定义。目标是看到报错——说明测试真实有效,也确认需求已被准确捕捉。 -
绿阶段:用最简方式让测试通过。可以硬编码
return 3,只要能过就行。这一步拒绝过度设计,避免把未来可能的需求提前塞进来。 - 重构阶段:在测试全绿的前提下,清理重复、拆分函数、重命名变量、提取常量。所有改动都以“测试仍通过”为唯一验收标准,这是安全重构的底气。
用 Jest 快速落地 TDD 工作流
Jest 是当前 JS 生态中对 TDD 友好度最高的框架,零配置起步,自带断言、模拟、覆盖率,适合快速验证想法:
- 安装后直接运行
npx jest --watch,开启监听模式,保存即自动跑测试,实现秒级反馈。 - 异步逻辑(如 API 调用)用
async/await+jest.mock()模拟依赖,不碰真实网络,保障测试稳定与速度。 - 对 React 组件,配合
@testing-library/react写用户视角的测试(例如 “点击按钮后显示成功提示”),而非测试内部状态或渲染细节。
写出真正有用、可持续的测试
好测试不是越多越好,而是要具备三个特质:
-
可读:测试名用完整句子描述行为,如
should return false when password is shorter than 8 chars,一眼看懂意图。 -
独立:每个测试不依赖全局状态、不共享变量、不按顺序执行。用
beforeEach重置环境,失败时能单独运行定位问题。 -
聚焦边界:优先覆盖空值、极值、错误输入等易出错场景(如
parseInt('')、filter(null)),比穷举正常值更有价值。
TDD 不是写测试,是在写设计说明书
当你先写 expect(calculator.add(2, 3)).toBe(5),你其实已经决定了这个模块叫什么、怎么调用、返回什么类型、如何处理错误。接口在测试里定型,实现只是后续填充。这种“使用者先行”的思维,自然产出高内聚、低耦合、易于替换和组合的代码结构。NASA 和微软的数据反复印证:坚持 TDD 的项目,缺陷率下降 40–90%,维护成本降低超三分之一——因为质量不是测出来的,是从第一行测试开始建起来的。











