原文发表于2007-12-26
英文源文档:http://www-128.ibm.com/developerworks/library/j-test.html
如需转载请联系译者chdwu@bestreme.com
由于受到极限编程的影响,在最近的几年时间里单元测试逐渐成为我软件开发过程中一个不可或缺的重要组成部分。极限编程要求我们对我们所完成的每一项功能都要进行单元测试并且要很好的管理这些测试,我们不应该在所有的单元测试通过之前去集成任何新的功能。这种做法的好处就是可以让开发人员对自己所写的代码充满信心(而不是盲目的毫无根据的自负)。
最开始我认为既然已经有了单元测试了,就没有必要再去花时间在功能测试上了,可我现在知道这是一个错误的想法:单元测试和功能测试是有很大的不同的。我花了很长的时间才了解到单元测试和功能测试的差异所在,我也知道了怎样更好的运用单元测试和功能测试来完善我们的软件开发流程。
这篇文章探究了单元测试和功能测试的不同点以及我们可以怎样运用这两种测试来支持我们的软件开发。
测试和软件开发过程
作为一个开发人员来讲,测试是相当重要的,我们必须要坚持在整个软件开发流程中测试我们的代码,而不仅仅把测试作为软件开发的一个特殊阶段的产物:测试绝对不应该成为你在软件提交前一天才开始的一个例行公事。你怎么才能知道我们的软件已经可以发布了?你怎么知道我修正了这个小bug的时候没有引发一个更严重的系统bug?你怎么知道当前的系统是否可以扩展一些现在没有想到功能呢?测试!单元测试和功能测试必须成为我们在软件开发流程中的一个有机组成部分。
单元测试应该成为你写代码的一个核心部分,尤其是在项目时间比较紧张但是我们仍然要保证质量的时候。单元测试十分重要,你甚至应该在你的代码写出来之前就应该完成单元测试。
单元测试:
-》有助于尽可能地重现最有效的设计
-》有助于提供一个最佳的文件组织结构
-》有助于确定一个类是否完成
-》让开发人员对自己的代码充满信心
-》是快速重构的基础
单元测试有助于形成系统化的并可以不断改进的设计文档,这些文档在软件开发的过程中有着极其重要的意义。大多时候将用例文档化形成一个类要比仅仅罗列一大堆编码的实际用例好,看看单元测试:它提供一系列有规律的输入或数据,用一系列的实际用例来告诉我们所写的类做了些什么。这样的话这个设计文档就总是最新的,因为我们必须通过单元测试。
你应该在写代码之前写单元测试,这样做的好处就是为自己提供了一个可以测试的设计方案,这就可以帮助你想的更加完善,这样会使设计变得简单。你不必担心将来会怎样,也不必花时间去实现一些不必要的功能。首先写单元测试还有助于帮你了解代码在什么时候完成:当所有的测试都通过之后,我们的任务也就完成了。
最后,单元测试让你对自己代码有高度的自信,这有助于我们做出更加好的产品。当你修改了自己的代码之后,我们来运行我们的测试,如果有问题的话我们可以迅速找出来我们的修改产生了在什么地方哪些破坏。
功能测试甚至比单元测试更加重要,因为它是用来检测我们的系统是否达到可以发布的要求。功能测试是用来确定我们的系统是否是一个可用的系统。
功能测试:
-》确定是否实现用户需求的一个有效方法
-》让用户和开发人员了解到我们的系统已经实现了这些用户需求
传统的开发过程是从实际使用中确定是否实现用户需求的,通常人们需要花费大力气才可以搞清楚这些实际用例并设法概括它们,当他们完成了这些工作之后他们手中无非多了一张纸而已,而功能测试就像是自己确定实际用例一样。极限编程阐述了这些观念,极限编程需要提前定义这些功能(这一过程需要项目组和用户共同完成),而功能测试就是它的产物,如果没有功能测试的话,我们不可能完成的很漂亮。
功能测试可以检查出单元测试遗留下的一些软件缺陷,让开发人员对自己的代码更加有信心,因为单元测试仍然会遗留下很多bug,它可能会覆盖到代码的各个部分但是却不能覆盖到系统的各个部分。功能测试可以揭露一些单元测试没有涉及的问题。当然一个自动化的可持续运行的功能测试不可能找出系统中的所有问题,但它可以找出更多的单元测试找不到的bug。