Bootstrap

测试驱动开发(TDD)

你将能够定义测试驱动开发(TDD),描述 TDD 如何产出更高质量的代码,阐述 “红、绿、重构” 工作流程,以及说明 TDD 对 DevOps 的重要性。
这是我最喜欢的名言之一:“如果某件事值得去构建,那它就值得去测试。如果它不值得测试,那你为什么还要在上面浪费时间呢?”
编写测试用例对于证明你的代码按预期运行至关重要。
什么是测试驱动开发?
测试驱动开发(TDD)意味着测试用例驱动代码的设计与开发。你不是先编写代码再进行测试,而是先编写测试用例。先为你期望拥有的代码编写测试,然后再编写能让这些测试通过的代码。
这听起来可能有悖常理。我怎么能为还没编写的代码写测试用例呢?你又怎么能为还没编写的代码进行设计呢?在设计中,你描述代码应该如何表现,然后编写具有那种表现的代码。TDD 也是如此,测试用例描述了你希望代码具备的行为。这能让你专注于代码的目的,即它应该做什么。在开始编写任何代码之前,你绝对应该能够明确这一点。否则,你怎么知道要写什么呢?
这也能让你关注调用你代码的用户。我做了大量后端开发工作,喜欢创建供他人使用的服务。有一天,我在创建一个我确信很棒的服务,它有出色的应用程序编程接口(API)。在深入编写代码时,我需要一些信息,所以我将其作为参数添加到了 API 中。接着我又需要其他东西,就又添加了一个参数。最后,需要的东西越来越多,我也都把它们作为参数加了进去。
现在到了为我的代码编写测试用例的时候。当时,我没有遵循 TDD。当我开始编写测试用例时,我突然意识到我没有我的参数所需要的一半信息。我原本觉得很棒的 API 糟糕透顶!怎么会这么差呢?我哪里做错了?因为我没有遵循 TDD,所以没有考虑调用我代码的人。
TDD 能让你站在调用者的角度思考。它让你在编写代码之前,就能探索希望如何调用代码。它促使你思考:“作为调用者,我知道哪些信息可以传进去并得到答案呢?” 拥有这种视角对于编写优质代码至关重要。如果没人能调用,代码就毫无用处。
为什么开发人员不编写测试用例呢?
我一直听到这些借口。第一个借口是:我已经知道我的代码能正常工作!没错,但未来接手你代码的人,包括未来的你自己,都无法确定是否破坏了某些功能。我告诉程序员,每次从代码仓库克隆或拉取代码后,首先要做的就是运行测试用例。不然你怎么知道是你破坏了某些功能,还是在你修改之前代码就已经有问题了呢?测试用例为你提供了一个基准,让其他人知道代码仍然能正常运行。
我还听到另一个借口:我写的代码不会有问题!也许你写的代码没有问题,但开发环境在不断变化。漏洞在被修复,新的库在升级,所以你的代码可能不再正常工作。有人可能会说:“我们的 Apache Struts 库存在一个漏洞。我们能在服务器上更新它吗?” 除非你有测试用例来测试代码,确保它在库的新版本下能正常工作,否则你可能不应该更新。而且,就像你可能从 Equifax 发生的漏洞事件中了解到的那样,不这么做可能会带来灾难性后果!你必须编写测试用例,这样你才能自信地说:“让我运行一下测试套件…… 可以,Struts 的新版本运行良好。把它部署到生产环境吧。”
我最喜欢的借口是:我没时间!这是最糟糕的借口,因为从长远来看,测试实际上能节省时间。你现在花时间编写几个测试用例,日后能节省数小时的调试时间。相信我。你不知道未来谁会使用你的代码,你肯定希望确保代码是可靠的。TDD 能让你编写可靠的代码。
这就是 TDD 工作流程。先为你期望拥有的代码编写一个会失败的测试用例,然后编写刚好能让测试通过的代码。代码不必完美,也不必美观,但必须让测试通过。接着重构代码,让它变得更好,提高代码质量。最后,重复这个过程。这就是所谓的 “红、绿、重构”。许多测试工具都遵循这个模式,这些工具将失败的测试用例显示为红色,通过的测试用例显示为绿色。这就是 “红、绿、重构” 名称的由来。
那么,为什么 TDD 对 DevOps 很重要呢?首先,TDD 在开发过程中能节省时间。当你为代码添加新功能或修改现有功能时,测试用例会快速告诉你是否有地方出了问题。它能让你编码速度更快,因为你更有信心。你不必担心刚刚做的修改是否破坏了某些功能。当你重构代码时,你可以更快地进行,因为你知道测试用例会捕捉到行为上的任何变化。
TDD 确保代码按你预期的那样工作。如果你先编写测试用例来定义你想要的行为,那么当测试通过时,你就知道已经实现了那种行为。这也意味着未来的修改不会破坏代码。失败的测试用例会立即提醒你有人引入了破坏代码的内容。
最后,也是最重要的一点,为了创建一个 DevOps 管道(持续集成 / 持续交付管道),所有测试都必须自动化,除非你想更快地将漏洞推送到生产环境。很多公司不理解这一点。他们想要使用持续集成(CI)和持续交付(CD)实现自动化,但却不自动化测试。不幸的是,如果不自动化测试,就无法构建持续集成 / 持续交付管道。
在本视频中,你了解到:TDD 意味着测试用例驱动代码的设计和开发;TDD 能让你开发速度更快、更有信心;“红、绿、重构” 工作流程与红色表示失败、绿色表示通过有关,它能提高代码质量;为了创建 DevOps 持续集成 / 持续交付管道,你必须首先实现测试自动化。

;