8.1 JUnit介绍
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。
8.1.1 JUnit简介
JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。
下面是JUnit一些特性的总结:
— 提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。
— 提供了多种方式来显示测试结果,而且可以扩展。
— 提供了单元测试批量运行的功能,而且可以和Ant很容易地整合。
— 对不同性质的被测对象,如Class,JSP,Servlet等,JUnit有不同的测试方法。
8.1.2 为什么要使用JUnit
以前,开发人员写一个方法,如下代码所示:
//******* AddAndSub.java**************
public Class AddAndSub {
public static int add(int m, int n) {
int num = m + n;
return num;
}
public static int sub(int m, int n) {
int num = m - n;
return num;
}
}
如果要对AddAndSub类的add和sub方法进行测试,通常要在main里编写相应的测试方法,如下代码所示:
//******* MathComputer.java**************
public Class AddAndSub {
public static int add(int m, int n) {
int num = m + n;
return num;
}
public static int sub(int m, int n) {
int num = m - n;
return num;
}
public static void main(String args[]) {
if (add (4, 6) == 10)) {
System.out.println(“Test Ok”);
} else {
System.out.println(“Test Fail”);
}
if (sub (6, 4) ==2)) {
System.out.println(“Test Ok”);
} else {
System.out.println(“Test Fail”);
}
}
}
从上面的测试可以看出,业务代码和测试代码放在一起,对于复杂的业务逻辑,一方面代码量会非常庞大,另一方面测试代码会显得比较凌乱,而JUnit就能改变这样的状况,它提供了更好的方法来进行单元测试。使用JUnit来测试前面代码的示例如下:
//******* TestAddAndSub.java**************
import junit.framework.TestCase;
public Class TestAddAndSub extends TestCase {
public void testadd() {
//断言计算结果与10是否相等
assertEquals(10, AddAndSub.add(4, 6));
}
public void testsub() {
//断言计算结果与2是否相等
assertEquals(2, AddAndSub.sub(6, 4));
}
public static void main(String args[]){
junit.textui.TestRunner.run(TestAddAndSub .class); }
}
这里先不对JUnit的使用方法进行讲解,从上可以看到,测试代码和业务代码分离开,使得代码比较清晰,如果将JUnit放在Eclipse中,测试起来将会更加方便。
8.2 建立JUnit的开发环境
为了不使读者在环节配置上浪费太多时间,这里将一步一步地讲解如何下载和配置JUnit。具体步骤如下:
8.2.1 下载JUnit
从www.junit.org可以进入到JUnit的首页,JUnit的首页画面如图8.1所示。
本书使用的版本是4.3版本,单击“Junit4.3.zip”即可进入下载JUnit的画面,如图8.2所示。
下载Junit4.3.zip,下载后解压缩即可。
8.2.2 配置JUnit
下载Junit4.3.zip完毕,并解压缩到D盘根目录下后,即可开始配置环境变量。用前面介绍的设定系统变量的方法,设定ClassPath,ClassPath=***;D:"junit"junit.jar,如图8.3所示。
图8.1 JUnit的首页画面
图8.2 下载JUnit的画面
查看是否配置好JUnit,在类里添加如下语句:
import junit.framework.TestCase;
图8.3 设定系统变量ClassPath
如果编译没有错误,则说明配置成功。
8.3 JUnit的使用方法
JUnit的使用非常简单,共有3步:第一步、编写测试类,使其继承TestCase;第二步、编写测试方法,使用test+×××的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用setUp,tearDown方法。
8.3.1 继承TestCase
如果要使用JUnit,则测试类都必须继承TestCase。当然目前的最新版JUnit是不需要继承它的,但并不是说TestCase类就没有用了,它仍然是JUnit工作的基础。这里先讲述继承TestCase类的方式,稍后再介绍不继承的方式。
下面是前面使用JUnit进行测试AddAndSub类的代码,这里进行详细的分析:
//******* TestAddAndSub.java**************
import junit.framework.TestCase;
public Class TestAddAndSub extends TestCase {
public void testadd() {
//断言计算结果与10是否相等
assertEquals(10, AddAndSub.add(4, 6));
}
public void testsub() {
//断言计算结果与2是否相等
assertEquals(2, AddAndSub.sub(6, 4));
}
public static void main(String args[]){
junit.textui.TestRunner.run(TestAddAndSub .class); }
}
代码说明:
— 这里继承TestCase,表示该类是一个测试类。
— 然后使用junit.textui.TestRunner.run方法来执行这个测试类。
这里给出TestCase的源代码:
//******* TestCase.java**************
package junit.framework;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public abstract class TestCase extends Assert implements Test {
/**测试案例的名称*/
private String fName;
/**构造函数
*/
public TestCase() {
fName= null;
}
/**带参数的构造函数
*/
public TestCase(String name) {
fName= name;
}
/**获取被run执行的测试案例的数量
*/
public int countTestCases() {
re