什么是 TDD?

TDD 是一种简单的软件开发方法,在开始编写解决问题的实际代码之前,我们先思考并确定程序的结果。

TDD 是一种软件开发过程,在编写解决问题的实际代码之前,首先开发测试用例。测试用例将以 PHP 代码的形式编写,使用或调用开发人员将要构建的解决方案代码。您构建的测试用例代码将触发您为解决问题而编写的解决方案代码的开发。

在我看来,这种文字描述会让很多开发人员失去应用这一流程的动力。TDD 是一个过程,也是一种思维方式。它不仅仅是编写单元测试那么简单。

你编写的测试程序在第一次运行时总是会失败,因为你还没有构建测试需要通过的程序。然后,你基本上必须构建测试程序将使用的解决方案代码,直到测试程序本身从你的解决方案代码中获得预期的结果。从字面上看,失败的测试将促使你编写代码以通过测试—​这就是 TDD 一词的由来。也许你甚至可以称其为失败的 TDD。这就好比说 "我写了一个测试让我的代码失败了,现在我需要修正它"

TDD 中,我认为首先编写失败测试有四个主要原因:

  • 首先,你要编写一个失败的测试,并确保你的测试框架应用程序能够识别它。这能确保你的开发环境配置正确,并能运行你的测试程序。

  • 其次,失败测试将帮助您确定要编写的解决方案或功能代码,以及测试通过的预期条件。这将有助于你作为开发人员,将你的思想集中到你正在编写的功能代码的目的上。

  • 第三,你编写的失败测试会提醒你需要完成哪些其他程序。

  • 第四,先编写测试有助于确保自动测试覆盖你的解决方案代码。

通过努力使解决方案代码可进行单元测试,有时会在无意中降低代码的耦合度—​这就像一个循环。当您继续编写松散耦合的代码时,您会发现您的代码开始变得更有条理,不再是一团乱麻。当你继续按照 TDD 流程编写解决方案代码时,它将不断帮助你发现产品中的紧密耦合之处,有时还会鼓励你重构和解耦代码,以使其具有单元测试性。还有一些软件开发原则可以帮助你进一步改进代码,例如 "单一责任原则"(Single-Responsibility Principle),这将在第 8 章 "使用 TDD 与 SOLID 原则" 中详细讨论。

既然我们已经定义并简要了解了什么是 TDD,那么让我们来看看与之相关的一些常见误解。