按阶段进行测试是一种基本的测试策略,单元测试是测试执行过程的第一个阶段。软件系统是由许多单元构成的,这些单元可能是一个对象或是一个类,也可能是一个函数,也可能是一个更大的单元——组件或模块。要保证软件系统的质量,首先就要保证构成系统的单元的质量,也就是要开展单元测试活动。通过充分的单元测试活,发现并修正单元中的问题,从而为系统的质量打下基础。

单元测试一般针对程序代码进行测试,这决定了其测试工具和特定的编程语言密切相关,所以单元测试工具基本是相对不同的编程语言而存在,多数集成开发环境(如Microsoft Visual Studio、Eclipse)会提供单元测试工具,甚至提供测试驱动开发方法所需要的环境。

JUnit是一个开放源代码的Java测试框架,用在编写和运行可重复的测试脚本之上。它是单元测试框架体系xUnit的一个实例。JUnit框架功能强大,目前已成为Java单元测试的事实标准,如果与Mock对象、HttpUnit、DBUnit等配合使用,基本上能满足日常的测试要求。JUnit主要特性如下。

(1)可以是测试代码与产品代码分开,这更有利于代码的打包发布和测试代码的管理。

(2)针对某一个类的测试代码,以较少的改动便可以应用另一个类的测试,JUnit提供了一个编写测试类的框架,使测试代码的编写更加方便。

(3)易于集成到程序中构建过程中,JUnit和Ant的结合还可以实施增量开发。

(4)JUnit的源代码是公开的,故而可以进行二次开发。

(5)JUnit具有很强的扩展性,可以方便地对JUnit进行扩展。

JUnit一共有七个包,其核心的包是junit.framework和junit.runner。framework包负责整个测试对象构建,runner负责测试驱动,JUnit有4个重要的类,分别是TestSuite、TestCase、TestResult 和 TestRunner。另外,JUnit还包括Test 和 TestListener接口和Assert类。

(1)Assert类用来验证条件是否成立,当条件成立时,asset类方法保持沉默,若条件不成立时就抛出异常。

(2)Test接口用来测试和手机测试的结果,Test接口用来测试和收集测试的结果,Test接口采用了Composite设计模式,它是单独的测试用例,聚合的测试模式以及测试扩展的共同接口。

(3)TestCase抽象类用来定义测试中的固定方法,TestCase是Test接口的抽象实现,由于TeatCase是一个抽象类,因此不能被实例化,只能被继承。其构造函数可以根据输入的测试名称来创建一个测试用例,提供测试名的目的在于方便测试失败时查找失败的测试用例。

(5)TestResult负责收集TestCase所执行的结果,它将结果分类,分为客户可预测的错误和没有预测的错误,它还将测试结果转发到TestListener处理。

(6)TestRunner是客户对象调用的起点,它负责对整个测试过程进行跟踪。它能够显示测试结果,并报告测试的进度。

(7)TestListener包括4个方法:addError(),addFailure(),startTest()和endTest()。它是对测试结果的处理和对测试驱动过程的工作特征进行提取。

当然,JUnit也存在一些缺陷。如仅支持同步的测试。