使用最流行的开放资源测试框架之一学习单元测试基础。
使用JUnit可以大量减少Java代码中程序错误的个数,JUnit是一种流行的单元测试框架,用于在发布代码之前对其进行单元测试。现在让我们来具体研究如何使用诸如JUnit、Ant和Oracle9i JDeveloper等工具来编写和运行单元测试。
为什么使用JUnit?
多数开发人员都同意在发布代码之前应当对其进行测试,并利用工具进行回归(regression)测试。做这项工作的一个简单方法是在所有Java类中以main()方法实施测试。例如,假设使用ISO格式(这意味着有一个以这一格式作为参数的构造器和返回一个格式化的ISO字符串的toString()方法)以及一个GMT时区来编写一个Date的子类。清单1 就是这个类的一个简单实现。
不过,这种测试方法并不需要单元测试限定语(qualifier),原因如下:
在一个类中进行测试的最小单元是方法,你应当对每个方法进行单独测试,以准确地找出哪些方法工作正常,哪些方法工作不正常。
即使前面的测试失败,也应当对各个方法进行测试。在此实施中,假如单个测试失败,后面的测试将根本不会运行。这就意味着你不会知道不良代码在你的实施中所占的百分比。
测试代码会出现在生成的类中。这在类的大小方面可能不是什么问题,但却可能会成为安全性因素之一:例如,假如你的测试嵌入了数据库连接密码,那么这一信息将很轻易用于已发布的类中。
没有框架可以自动启动这一测试,你必须编写一个脚本来启动每一个测试。
在编写一个报告时,你必须编写自己的实现,并定义规则,以方便地报告错误。
JUnit框架就是设计用来解决这些问题的。这一框架主要是所有测试实例(称为"TestCase")的一个父类,并提供工具来运行所编写的测试、生成报告及定义测试包(test suite)。
让我们为IsoDate类编写一个测试:这个IsoDateTest类类似于:
import java.text.ParseException;
import junit.framework.TestCase;
/**
* Test case for <code>IsoDate</code>.
*/
public class IsoDateTest extends TestCase {
public void testIsoDate() throws
Exception {
IsoDate epoch=new IsoDate(
"1970-01-01 00:00:00 GMT");
assertEquals(0,epoch.getTime());
IsoDate eon=new IsoDate(
"2001-09-09 01:46:40 GMT");
assertEquals(
1000000000L*1000,eon.getTime());
}
public void testToString() throws
ParseException {
IsoDate epoch=new IsoDate(0);
assertEquals("1970-01-01
00:00:00 GMT",epoch.toString());
IsoDate eon=new IsoDate(
1000000000L*1000);
assertEquals("2001-09-09
01:46:40 GMT",eon.toString());
}
}
本例中要注重的重点是已经编写了一个用于测试的独立类,因此可以对这些文件进行过滤,以避免将这一代码嵌入到将要发布的文档中。另外,本例还为你希望在你的代码中测试的每个方法编写了一个专用测试方法,因此你将确切地知道需要对哪些方法进行测试、哪些方法工作正常以及哪些方法工作不正常。假如在编写实施文档之前已经编写了该测试,你就可以利用它来衡量工作的进展情况。
安装并运行JUnit
要运行此示例测试实例,必须首先下载并安装JUnit。JUnit的最新版本可以在JUnit的网站 www.junit.org免费下载。该软件包很小(约400KB),但其中包括了源代码和文档。要安装此程序,应首先对该软件包进行解压缩(junitxxx.zip)。它将创建一个目录(junitxxx),在此目录下有文档(在doc目录中)、框架的应用编程接口(API)文档(在javadoc目录中)、运行程序的库文件(junit.jar)以及示例测试实例(在junit目录中)。截至我撰写本文时,JUnit的最新版本为3.8.1,我是在此版本上对示例进行测试的。
图1 运行IsoDate测试
要运行此测试实例,将源文件(IsoDate.java和IsoDateTest.java)拷贝到Junit的安装目录下,打开终端,进入该目录,然后输入以下命令行(假如你正在使用UNIX):
eXPort CLASSPATH=.:./junit.jar
javac *.java
或者,假如你正在Windows,输入以下命令行
set CLASSPATH=.;junit.jar
javac *.java
这些命令行对CLASSPATH进行设置,使其包含当前目录中的类和junit.jar库,并编译Java源文件。
要在终端上运行该测试,输入以下命令行: