人人都会AI编程

24.4 测试驱动开发(TDD)基础理念

更新时间:2026-07-12

测试驱动开发(Test-Driven Development)是一种先写测试、再写实现代码的开发方法,核心理念可以浓缩为一句断言:没有测试的代码就是不存在的功能

TDD 三步循环:红—绿—重构

TDD 的工作流程遵循一个短周期循环:

  1. 红(Red):先写一个会失败的测试。此时你还没有写实现代码,运行测试当然失败,这验证了测试本身是有效的。
  2. 绿(Green):用最少的代码让测试通过,哪怕写得很“丑”、很直接。目标是快速让测试变绿,不要在这个阶段纠结设计完美。
  3. 重构(Refactor):在有测试保护的前提下,优化代码结构、消除重复、提高可读性。重构过程中随时跑测试,确保行为不变。

然后进入下一个测试,如此反复,每次只增加一点点可验证的功能。

这样写代码有什么实际好处?

  • 强迫你提前思考接口设计:写测试时你必须先想清楚函数名、参数、返回值,这会自然推动你设计出更清晰、更易用的 API。
  • 测试即文档:测试用例用代码清晰地描述了“这个模块该怎么用”“预期行为是什么”,比注释更可靠,因为它会随着重构自动更新。
  • 重构安全网:有了一套通过率 100% 的测试集,你就可以放心地调整实现细节、优化性能,只要测试绿着,就说明功能没坏。
  • 减少调试时间:TDD 的步长很小,每次只增加一点点逻辑,出问题时排查范围非常窄,很少出现“一调一下午”的情况。

真实项目中的适用边界

TDD 不是银弹,也不是在每个场景都值得严格遵循:

  • 十分适合
  • 业务逻辑层:如订单计算、折扣规则、数据校验逻辑。
  • 工具函数:字符串处理、日期计算、格式转换。
  • API 接口:给定输入,期望输出或状态码。
  • 不太适合或需要灵活调整
  • 探索性数据分析:你还没想清楚要分析什么,很难先写好测试。
  • 原型验证:快速试错阶段,代码可能很快被丢弃,全面测试反而拖慢速度。
  • UI 布局、可视化图表:测试这类“看起来对不对”的成本极高,通常用截图对比或人工验收更实际。

实用打法:轻量级 TDD

在实际工作中,更推荐“有选择的 TDD”:

  1. 接手一个新模块时,先列出核心功能的测试用例列表(测试清单),不用一次写完,但心里有数。
  2. 对关键算法、容易出错的逻辑采用严格的“红—绿—重构”循环。
  3. 对 CRUD、脚手架代码,可以事后补测试,保证整体覆盖率在一个合理水平即可(通常项目 70%-80% 已足够)。
  4. 测试写的好不好,看一个标准:如果测试全绿,你是否敢直接部署? 这个直觉就是 TDD 追求的信心。

TDD 最终不是一种束缚,而是一种“设计工具”和“信心来源”。当你习惯先想清“这个东西该怎么用”再动手,代码质量就已经在不知不觉中提升了一档。