测试驱动开发
极限编程(eXtreme Programming,简称XP)是敏捷方法中最著名的一个。它由一系列简单却相互依赖的时间组成。这些实践结合在一起形成了一个胜于部分结合的整体。其中一个非常重要的,当前也受到格外重视的实践就是TDD(测试驱动的开发方法)。
在测试驱动的开发方法中,编写所有的代码的目的都是为了使失败的单元测试能够通过。首先编写一个单元测试,由于它要测试的功能还在,所以它会运行失败。然后编写代码使测试通过。
编写测试用例和代码之间的更迭速度是很快的,基本上几分钟左右。测试用例和代码共同演化,其中测试用例循序渐进地对代码的编写进行指导。作为结果,一个非常完整的测试用例集和代码一起发展起来。
测试粗略的可以分为单元测试和验收测试。单元测试是用来验证系统中个别机制的白盒测试。
单元测试用来验证系统的小的组成单元应该按照所期望的方式工作,但是它们没有验证系统作为一个整体时工作的正确性。所以,单元测试是必要的,但是不够充分。
验收测试是用来验证系统满足客户需求的黑盒测试。验收测试由不了解系统内部机制的人编写。验收测试是程序,因此是可运行的。通常通过使用专门为应用程序的客户创建的脚本语言来编写验收测试。正如单元测试作为可编译、运行的有关系统内部结构的文档那样,验收测试是有关系统特性的可编译、执行的文档。
编写代码前就编写单元测试会带来四个很明显的好处:
1、首先编写测试使得程序中的每一项功能都有测试来验证它的操作的正确性。这就可以给以后的开发提供支援,使我们可以更自由地对程序进行更改,因为测试可以告诉我们程序仍然具有正确的行为。
2、首先编写测试迫使我们必须从程序调用者的有利视角去观察我们将要编写的程序。这样,我们就会在关注程序的功能的同时,直接关注它的接口,我们也就可以设计出便于调用的软件。
3、首先编写测试迫使我们把程序设计为可测试的。为了把程序设计为易于调用和可测试的,程序必须和它周边环境解耦。这样首先编写测试迫使我们解除软件中的耦合。面向对象设计的原则在进行这种解除耦合方面具有巨大的帮助作用。
4、首先编写测试的另一个重要效果是,测试可以作为一种无价的文档形式。测试就像一套范例,它帮助其他程序员了解如何使用代码。这份文档是可编译、可运行的。它保持最新。它不会撒谎。
首先编写验收测试的行为对于系统的架构方面具有深远的影响。为了使系统具有可测试性,就必须要在很高的系统架构层面对系统进行解耦合。正如单元测试可以促使你在小的方面可以做出优良的设计决策一样,验收测试可以促使你在大的方面做出优良的系统架构决策。