一、简单介绍
JUnit是一个开源的java单元測试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完毕。这两个牛人中 Erich Gamma 是 GOF 之中的一个;Kent Beck 则在 XP 中有重要的贡献(你认为眼熟一点都不奇怪)。
正如常言道:“麻雀虽小,五脏俱全。” JUnit设计的很小巧,可是功能却很强大。
以下是JUnit一些特性的总结:
1) 提供的API能够让你写出測试结果明白的可重用单元測试用例
2) 提供了三种方式来显示你的測试结果,并且还能够扩展
3) 提供了单元測试用例成批执行的功能
4) 超轻量级并且使用简单,没有商业性的欺骗和没用的向导
5) 整个框架设计良好,易扩展
对不同性质的被測对象,如Class,Jsp,Servlet,Ejb等,Junit有不同的使用技巧。因为本文的性质,下面仅以Class測试为例。
以下我们就叩开JUnit的大门吧!
二、下载
点击http://www.junit.org能够下载到最新版本号的JUnit,本文使用的为
这样,你的系统中就能够使用JUnit编写单元測试代码了(是不是非常easy)!
三、HelloWorld
记得在差点儿每本语言教学书上都能找到HelloWorld这个入门代码。今天在这里,我们也从一个简单到根本不用单元測试的样例入手。这是一个仅仅会做两数加减的超级简单的计算器(小学一年级必备极品)。代码例如以下:
public class SampleCalculator
{
public int add(int augend , int addend)
{
return augend + addend ;
}
public int subtration(int minuend , int subtrahend)
{
return minuend - subtrahend ;
}
}
将上面的代码编译通过。以下就是我为上面程序写的一个单元測试用例:
//请注意这个程序里面类名和方法名的特征
public class TestSample extends TestCase
{
public void testAdd()
{
SampleCalculator calculator = new SampleCalculator();
int result = calculator.add(50 , 20);
assertEquals(70 , result);
}
public void testSubtration()
{
SampleCalculator calculator = new SampleCalculator();
int result = calculator.subtration(50 , 20);
assertEquals(30 , result);
}
}
好了,在DOS命令行里面输入javac -classpath .;junit.jar TestSample.java 将測试类编译通过。然后再输入 java -classpath .;junit.jar junit.swingui.TestRunner TestSample 执行測试类,你会看到例如以下的窗体。
上图中,绿色说明单元測试通过,没有错误产生;假设是红色的,则就是说測试失败了。这样一个简单的单元測试就完毕了,是不是非常easy啊?
依照框架规定:编写的全部測试类,必须继承自junit.framework.TestCase类;里面的測试方法,命名应该以Test开头,必须是public void 并且不能有參数;并且为了測试查错方便,尽量一个TestXXX方法对一个功能单一的方法进行測试;使用assertEquals等junit.framework.TestCase中的断言方法来推断測试结果正确与否。
你能够对照着上面測试类中的实现来体会下规定——非常easy!并且你在这个測试类中有增加多少个測试方法,就会执行多少个測试方法。
四、向前一步
学完了HelloWorld,你已经能够编写标准的单元測试用例了。可是另一些细节,这里还要说明一下。不要急,非常快的!
你在看上面的代码的时候,是不是注意到每一个TestXXX方法中都有一条SampleCalculator初始化语句?这非常明显不符合编码规范。你可能正要将它提取出来放到构造函数里面去。且慢!在JUnit中的初始化是建议在Setup方法中作的。JUnit提供了一对方法,一个在执行測试方法前初始化一些必备条件而还有一个就是測试完成后去掉初始化的条件(见下图)。
另外你是否注意到,上面弹出窗体的一个细节,在绿条以下有Errors、Failures统计。这两者有何差别呢?
Failures作为单元測试所期望发生的错误,它预示你的代码有bug,只是也可能是你的单元測试代码有逻辑错误(注意是逻辑错误)。Errors不是你所期待的,发生了Error你能够依照以下的顺序来检查:
检查測试所需的环境,如:数据库连接
检查单元測试代码
检查你的系统代码
五、成批执行test case
这是前面提到的JUnit特性之中的一个。它方便于系统单元測试的成批执行。使用起来也是很easy,先看下使用代码:
import junit.framework.Test;
import junit.framework.TestSuite;
public class TestAll{
public static Test suite(){
TestSuite suite = new TestSuite("TestSuite Test");
suite.addTestSuite( TestSample.class);
return suite;
}
}
这个測试程序的编译、执行,和上面TestSample的方式是一样的。
javac -classpath .;junit.jar TestAll.java
java -classpath .;junit.jar junit.swingui.TestRunner TestAll
怎么样?这样你在suite方法里面加入几个TestCase就会执行几个,并且它也能够加入TestSuite来将小一点的集合加入大的集合中来,方便了对于不断添加的TestCase的管理和维护。
呵呵,你认为suite方法的作用是不是于java应用程序的main非常相似?而且这里的suite必须严格遵守上面的写法!
六、TestRunner
在JUnit中已经给出了三种方式表示的TestRunner。你能够分别执行体验下他们的不同。
junit.swingui.TestRunner
junit.awtui.TestRunner
junit.textui.TestRunner
七、总结
本文轻松简要的介绍了JUnit使用的入门知识。全然没有涉及到深入的技巧和使用规范。而这些请关注我关于JUnit高级使用、JUnit源码分析的文章。