然而,尽管编写没有bug的软件是如此的重要,许多时间还是花费在消除bug而不是花在如何防止它们的出现这一更重要的步骤上。在单元测试(Unit Test)中,绝大多数开发者在完成单元之后才开始进行测试,而不是开发代码的同时进行测试。没有人可以责怪程序员,因为项目计划常常给代码编写安排了最少的时间。之所以这样,是由于人们常常相信他们的计划非常完善,因此编写代码也就很简单。不幸的是,实际情况往往并不是这样的。
测试驱动的开发(Test-driven development,TDD)提供了一些新特性。TDD认为测试是一个在开发代码过程中的主要工作之一,是一个需要连续执行的过程。TDD一直需要与单元测试打交道,直到开发者在单元测试中确信他(她)的代码工作良好且可以保持这种良好的工作状态为止。TDD本质上是一种不依赖于任何特定工具的思想。它当然并不局限于Java,这一概念也可以应用于其它编程语言。不过,TDD在Java中用的最为广泛,因此在下文中我将仅结合Java介绍TDD。
在开始开发之前需要创建测试计划,TDD和普通方法的根本区别就是TDD并不会像后者那样往往成为一份被遗忘的Word或者Excel文档。使用TDD,如果你开发一个包含有复杂逻辑的Java类,那么测试代码(开发者负责编写测试代码)并不会也变得复杂起来。开发者常常抱怨他们不得不与Word和Excel打交道,但是在测试Java的情况下,甚至最挑剔的开发者编写测试也没有问题。
Kent Beck在他的《测试驱动的开发:实例》一书中描述了下面的TDD步骤: