在前面的文章里,我讨论了测试包的创建问题,所谓测试包就是把单独的测试或者各个类的测试组织起来的集合。在以上两种测试情况下我都创建了名为Junit测试的应用程序。不过,当你在开始创建新测试时,你必须先确定是否用手工的方法还是用自动化工具创建测试包来决定运行哪些测试。手工维护应用程序测试包当然也是可以采用的措施之一,不过这种做法需要重新编译应用程序才能添加新的测试。手工措施在选择特定测试的场合下还是必要的。清单A显示了一个简单的测试运行器,该运行器负责创建测试包,首先添加各个测试然后添加整个测试包。
另一种选择就是创建测试的动态表。就这个例子来说,我创建了一个运行目录下所有测试的测试运行器,并把结果屏幕显示。我们动态创建的测试包假定所有的测试都要运行而且按照从目录中以字母顺序读取的顺序运行。不对将执行的测试进行选择也是一种可能的测试需求,不过,在这种情况下你就只能手工地把测试加到测试包里。
在清单B中,我创建了一个应用程序,它从命令行上读取测试目录,遍历整个目录寻找扩展名为“.class”的文件,然后把它们加到测试包里。
我们的测试运行器采用Java类装载器导入类,所以装载器要装载的类一定要位于类路径下。测试运行器的输出结果就是测试结果,同先前的示例一样,清单C显示了对测试目录的测试结果。
Junit执行一个较大测试单元中的测试。清单C的输出结果表示测试运行了4个测试类,每个测试类执行一个测试。因为输出结果表示了目录下所有测试的状态,所以这种测试对我们的开发工作很有帮助。
如果能在你的应用程序建立系统中集成单元测试,那么你的测试任务甚至会变得更加流程化。Ant就是能完成这一任务的Java工具,该软件可以从The Jakarta Project下载。集成Junit的Ant可以帮助你快速地测试系统的变动。幸而,Jakarta
Project给Ant创建了集成Junit的任务。这些任务可以自动地运行测试同时产生输出结果和报告。一开始,你需要安装Ant和可选的Ant任务,两者都可以从Jakarta 网站获得。安装Ant之后即在$ANT_HOME/lib/
目录下安装optional.jar文件。该文件包含了Junit集成任务。为了用到这些任务,你还得安装Junit随带Junit.jar包。它也得安装在$ANT_HOME/lib/
目录下。
在清单D中,我们创建了一个简单的Ant build文件,由该文件把src目录下的测试案例编译到 build目录下(这就是我们在前一篇文章的XMLTest示例中用到的build文件)。
一旦建立了测试案例就可以运行它们了。Ant提供了junit任务来运行测试,该任务取代了创建测试包和测试运行器的必要,从而极大地简化了测试过程。测试运行器中包含的内容现在可以直接在Ant
build文件中进行配置。清单E显示运行单一测试的情况。
JUnit任务可以配制为遇到错误即停止或者执行所有的测试最后总结错误信息。运行测试需要设置类的路径,因此我们使用了classpath指示符来增加我们需要的目录和jar文件。我们的测试包含在xmltest包内,因此我们需要在测试中显式声明包的名字。输出结果可以采用文本格式或XML格式。采用XML格式输出结果的优点是最后可以生成总报告。
Ant Junit任务用两种方式执行测试。你可以像清单E那样手工定义各个测试,也可以执行批处理测试。Batchtest指示符如清单F所示,它用在单独测试、混合测试乃至匹配测试的场合下。
在清单F中,batchtest用于运行build目录及其子目录下的所有测试。由于我们不打算测试任何非Java代码的文件,所以我们告诉fileset显式添加以Test.class名称结尾的文件。采用fileset还可以让我们显式地排除不参加测试的文件。在运行Ant任务时的输出结果见清单G。
例子中的输出信息包含在test_output目录中。每个测试类输出到不同的文件。SimpleTest的输出如清单H所示.
采用Ant任务还有个额外的好处,那就是它们有一个内置的任务可以生成报告。Junitreport任务采用了The Apache XML Project开发的XSLT包Xalan。不过你需要下载Xalan-j包并把xalan.jar和bsf.jar文件以及Xerces
XML parser的一份拷贝安装在$ANT_HOME/lib目录下,
报告配置很简单,如清单I所示,你必须告诉 junitreport在测试报告中包括哪些XML文件以及哪些目录的输出结果。报告软件会进行测试,按照时间和是否成功提交结果。最终产生的报告是如图A所示的帧格式HTML网页。
图A
不管你是手工还是自动地创建测试包,测试包都令涵盖程序多方面的单元测试变得容易多了。在程序创建系统中集成单元测试能测试更具效率而还有助于增加软件工程的质量。在Ant程序建立系统中集成JUnit单元测试令你更方便地创造出一个测试程序代码的简单系统。