1、簡單介紹
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的大門吧!
2、下載
點擊http://www.junit.org可以下載到最新版本號的JUnit,本文使用的爲
這樣,你的系統中就可以使用JUnit編寫單元測試代碼了(是否是很是easy)!
3、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!而且你在這個測試類中有增長多少個測試方法,就會執行多少個測試方法。
4、向前一步
學完了HelloWorld,你已經可以編寫標準的單元測試用例了。但是另外一些細節,這裏還要說明一下。不要急,很是快的!
你在看上面的代碼的時候,是否是注意到每個TestXXX方法中都有一條SampleCalculator初始化語句?這很是明顯不符合編碼規範。你可能正要將它提取出來放到構造函數裏面去。且慢!在JUnit中的初始化是建議在Setup方法中做的。JUnit提供了一對方法,一個在執行測試方法前初始化一些必備條件而還有一個就是測試完成後去掉初始化的條件(見下圖)。
另外你是否注意到,上面彈出窗體的一個細節,在綠條如下有Errors、Failures統計。這二者有何差異呢?
Failures做爲單元測試所指望發生的錯誤,它預示你的代碼有bug,只是也多是你的單元測試代碼有邏輯錯誤(注意是邏輯錯誤)。Errors不是你所期待的,發生了Error你可以依照如下的順序來檢查:
檢查測試所需的環境,如:數據庫鏈接
檢查單元測試代碼
檢查你的系統代碼
5、成批執行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必須嚴格遵照上面的寫法!
6、TestRunner
在JUnit中已經給出了三種方式表示的TestRunner。你可以分別執行體驗下他們的不一樣。
junit.swingui.TestRunner
junit.awtui.TestRunner
junit.textui.TestRunner
7、總結
本文輕鬆簡要的介紹了JUnit使用的入門知識。全然沒有涉及到深刻的技巧和使用規範。而這些請關注我關於JUnit高級使用、JUnit源碼分析的文章。