在Eclipse中使用JUnit進行
單元測試
目錄
1.JUnit簡介
JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成爲源於Kent Beck的sUnit的xUnit家族中最爲成功的一個。 JUnit有它自己的JUnit擴展生態圈。多數Java的開發環境都已經集成了JUnit作爲單元測試的工具。
JUnit是由 Erich Gamma 和Kent Beck 編寫的一個迴歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因爲程序員知道被測試的軟件如何(How)完成功能和完成什麼樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。
2.JUnit優點
junit是在極限編程和重構(refactor)中被極力推薦使用的工具,因爲在實現自動單元測試的情況下可以大大的提高開發的效率,但是實際上編寫測試代碼也是需要耗費很多的時間和精力的,那麼使用這個東東好處到底在哪裏呢?筆者認爲是這樣的:
極限編程
要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩定,那麼你需要同時維護測試代碼和實際代碼,這個工作量就會大大增加。因此在極限編程中,基本過程是這樣的:構思-> 編寫測試代碼-> 編寫代碼-> 測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以後的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。
重構
其好處和極限編程中是類似的,因爲重構也是要求改一點測一點,減少迴歸錯誤造成的時間消耗。
其他情況
我們在開發的時候使用junit寫一些適當的測試也是有必要的,因爲一般我們也是需要編寫測試的代碼的,可能原來不是使用的junit,如果使用junit,而且針對接口(方法)編寫測試代碼會減少以後的維護工作,例如以後對方法內部的修改(這個就是相當於重構的工作了)。另外就是因爲junit有斷言功能,如果測試結果不通過會告訴我們哪個測試不通過,爲什麼,而如果是像以前的一般做法是寫一些測試代碼看其輸出結果,然後再由自己來判斷結果是否正確,使用junit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。
3.JUnit特性
JUnit是一個開放源代碼的Java測試框架,用於編寫和運行可重複的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。它包括以下特性:
1、用於測試期望結果的斷言(Assertion)
2、用於共享共同測試數據的測試工具
3、用於方便的組織和運行測試的測試套件
4、圖形和文本的測試運行器
4.JUnit運用
第一步:下載JUnit的jar包,下載地址:https://github.com/junit-team/junit/releases/download/r4.12/junit-4.12.jar;
第二步:安裝Eclipse安裝程序,已經安裝好!
第三步:利用junit在eclipse中開發自動化腳本;
JUnit可以和很多開發工具進行集成來進行單元測試,我們這裏選取較常用的java開發工具Eclipse來使用JUnit4進行單元測試。如何在開發工具Eclipse裏 進行單元測試?
第四步:首先啓動Eclipse,並在Eclipse中建立一個java項目,項目名稱爲JNuit_test1。如下圖所示:
單擊【完成】即可;
第五步:在建立好的項目名稱(JNuit_test)上右鍵單擊【屬性】,系統彈出如下圖所示:
第六步:選擇java構建路徑→庫→我們這裏選擇前面下載的junit-4.12.jar包,故單擊【添加外部JAR(X)】按鈕,系統彈出如下對話框,選擇junit-4.12.jar包後,單擊【打開】鍵,如下圖所示:
第七步:在建立好的項目名稱(JNuittest)上右鍵單擊【新建】→【包】,取包名稱爲andycpp,系統彈出如下圖所示:
第八步:在建立好的類名稱【andycpp】上右鍵單擊【新建】→類,取名稱爲【Calculator】,如下圖所示:
第九步:我們在此編寫一個類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然後對這些功能進行單元測試。這個類並不是很完美,我們故意保留了一些Bug用於演示,這些Bug在註釋中都有說明。該類代碼如下:
package andycpp;
publicclass Calculator {
privatestaticintresult; // 靜態變量,用於存儲運行結果
publicvoid add(int n) {
result = result + n;
}
publicvoid substract(int n)
{
result = result - 1; //Bug: 正確的應該是 result =result-n
}
publicvoid multiply(int n)
{
} // 此方法尚未寫好
publicvoid divide(int n)
{
result = result / n;
}
publicvoid square(int n)
{
result = n * n;
}
publicvoid squareRoot(int n)
{
for (; ; ) ; //Bug : 死循環
}
publicvoid clear()
{ // 將結果清零
result = 0;
}
publicint getResult()
{
returnresult;
}
}
第十步:生成JUnit測試框架,選中已經編好的類,單擊右鍵【新建】→JUnit測試用例,如下圖所示:
單擊【下一步】顯示測試方法,下面我們只選擇四項,如下圖所示:
單擊【完成】鍵,系統創建了一個測試類,類名稱爲CalculatorTest.java;代碼如下:
第十一步:對上面測試類代碼進行完善,代碼如下圖所示:
package andycpp;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
publicclass CalculatorTest extends TestCase{
privatestatic Calculator calculator = new Calculator();
@Before
publicvoid setUp() throws Exception
{
calculator.clear();
}
publicvoid testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
@Test
publicvoid testSubstract()
{
calculator.add(10);
calculator.substract(8);
System.out.println(calculator.getResult());
assertEquals(9, calculator.getResult());
}
@Test
publicvoid testMultiply() {
System.out.println("");
}
@Test
publicvoid testDivide()
{
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
}
}
第十二步:對上面的測試類進行完善後,右鍵單擊【CalculatorTest.java】→【運行方式】→【JUnit測試】,測試結果如下:
第十三步:爲了查詢這兩個錯誤,可以雙擊對應錯誤結果,在右側對應方法有顯示,如下圖所示:
上面的期望結果,若改爲【5】,測試加的結果通過,如下圖所示:
接着我們看看第二個錯誤的原因,重新運行測試,如下圖所示:
通過上圖分析,是程序邏輯存在錯誤,故查看Calculator.java類,發現Substract的邏輯爲如下圖所示:
修改程序的邏輯表達式爲result=result-n,再次執行測試用例,如下圖所示:
以上是一個簡單的加減乘除運算的邏輯程序,通過這個程序演示了JUnit測試框架在Eclipse中的運用。
5.JUnit重要元素
A、@TEST
方法的前面使用@Test標註,以表明這是一個測試方法。對於方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須爲void,而且不能有任何參數。
@Test
publicvoid testAdd() {
calculator.add(2);
calculator.add(3);
System.out.println(calculator.getResult());
assertEquals(5, calculator.getResult());
}
B、@Before
註解:在每個測試方法之前執行;
C、@After
註解:在每個測試方法之後執行;
D、@BeforeClass
註解:在所有方法執行之前執行;
E、@AfterClass
註解:在所有方法執行之後執行;
F、@Test(timeout = xxx)
註解:設置當前測試方法在一定時間內運行完,否則返回錯誤;
G、@Test(expected = Exception.class)
註解:設置被測試的方法是否有異常拋出。拋出異常類型爲:Exception.class;
H、@Ignore
註解:註釋掉一個測試方法或一個類,被註釋的方法或類,不會被執行。
參考資料:
http://www.blogjava.net/jnbzwm/archive/2010/12/15/340801.html
http://blog.csdn.net/wangpeng047/article/details/9627527;