Coursera 笔记

Module 02 · DevOps & CI/CD开发运维与持续集成·持续交付

Test Driven Development什么是测试驱动开发(TDD)?

Coursera ↗

学习目标

观看本视频后,你将能够:

  • 定义 测试驱动开发(TDD),
  • 描述 TDD 如何生成更高质量的代码,
  • 解释 红绿重构(Red, Green, Refactor) 工作流程,
  • 说明 TDD 对 DevOps 的重要性。

经典名言

“如果它值得构建,那就值得测试。如果它不值得测试,为什么要浪费时间去开发它?”

这句话很好地阐释了 编写测试用例 对于验证代码是否按预期工作的关键性。


什么是测试驱动开发(TDD)?

测试驱动开发(TDD) 是指:
测试用例驱动代码设计和开发。与传统的开发方式不同,你不是先写代码再进行测试,而是先编写测试用例。
具体来说,先写测试,然后为通过测试编写代码。

这个过程可能听起来有些违反直觉——“我怎么能为还没有写出来的代码编写测试用例呢?”
但其实,设计代码时,你就已经描述了代码应如何运行,TDD 的方式也是如此:测试用例描述了代码的预期行为,然后你写出能通过测试的代码。

为什么TDD有助于提高代码质量?

TDD 让你专注于代码的 目标,即它需要完成什么任务。
在你写代码之前,你就应该能清晰地定义出代码的行为,否则,你怎么知道自己该写什么呢?

TDD 让你从 调用者 的角度出发来考虑代码 —— 如何调用代码并获得预期的结果。这种角度帮助你编写出更易于被调用的代码。


TDD 实际案例

我做过很多后台开发工作,喜欢为别人开发可以使用的服务。有一天,我在开发一个我认为会非常棒的服务,并打算为它设计一个 优秀的API。
开始时,我把需要的几个参数添加到了API中,但随着需求的变化,我又不断添加新的参数。最终,API变得异常复杂。

在我开始写测试用例时,我才意识到,我甚至缺少了很多参数所需的信息!我的API根本不适用,甚至可以说是 糟糕透了。为什么会这样呢?
原因是我没有遵循TDD,忽略了 调用者的需求。TDD 强迫你从用户角度去看待代码的设计,确保你所编写的代码能够满足调用者的需求。


为什么开发者不编写测试用例?

许多开发者拒绝编写测试用例时常会给出各种理由,下面是最常见的几个借口:

1. 我已经知道我的代码能工作!

是的,你可能知道当前代码能运行,但其他人(包括未来的你)在修改代码时,很难知道他们是否破坏了某些功能。
解决方法:每次从代码库克隆或拉取代码时,首先 运行测试用例,确保没有破坏现有功能。

2. 我不写坏代码!

你可能不写坏代码,但环境在不断变化。随着漏洞修补、库升级,你的代码可能会变得 不再兼容。
例如,如果Apache Struts库有漏洞,是否可以直接更新?
解决方法:如果你没有编写测试用例,无法确保新版本与现有代码兼容,那就不应该轻易更新。
否则,像 Equifax 这样的漏洞事故就会发生,后果可能是灾难性的!

3. 我没有时间!

这是最糟糕的借口,因为 编写测试用例实际上能节省时间。
通过编写一些简单的测试用例,可以节省未来调试的数小时。你无法预测未来会有哪些人使用你的代码,所以要确保你的代码是健壮的。TDD 会帮助你 写出高质量的代码。


TDD 工作流程

TDD 的工作流程被称为 红绿重构(Red, Green, Refactor):

  1. 红色(Red):首先编写一个失败的测试用例,它描述你期望的代码行为。
  2. 绿色(Green):然后编写足够的代码以让测试通过。代码不必完美,只需要让测试通过即可。
  3. 重构(Refactor):在确保测试通过后,优化和重构代码,提高其质量。

许多测试工具遵循这个工作流程,失败的测试用例用 红色 显示,成功的测试用例用 绿色 显示,因此这个流程得名“红绿重构”。


TDD对DevOps的重要性

1. 节省开发时间

TDD 帮助你在开发过程中 快速发现问题。当你添加新功能或修改现有功能时,测试用例会迅速告知你是否破坏了其他功能。
你可以更加 自信 地开发代码,而不必担心修改是否会引入错误。

2. 确保代码行为的预期一致

通过写测试用例来定义所需的行为,你就能知道当测试通过时,你已经实现了预期的功能。
同时,TDD 确保 未来的修改不会破坏现有代码,如果测试失败,意味着代码有问题,立刻可以修复。

3. 自动化测试是DevOps CI/CD管道的基础

为了构建一个 DevOps CI/CD 管道,所有的测试必须被 自动化,否则就等于在加速将缺陷推送到生产环境。
很多公司在自动化 CI 和 CD 时忽视了自动化测试,但没有自动化测试的CI/CD管道根本无法正常运作。


总结回顾

在本视频中,你学到了:

  • TDD是通过编写测试用例来驱动代码设计与开发。
  • TDD 让你开发得更快,且更有信心。
  • 红绿重构(Red, Green, Refactor)工作流程帮助提高代码质量。
  • 要创建一个DevOps CI/CD管道,必须 自动化测试。

TDD 不仅是编写测试,它是 提升代码质量、加速开发 和 确保长期可维护性的关键实践。