如何使用JUnit寫測試?
簡單的范例如下:
1、創(chuàng)建一個TestCase的子類:
package junitfaq;
import java.util.*;
import junit.framework.*;
public class SimpleTest extends TestCase {
public SimpleTest(String name) {
super(name);
}
2、寫一個測試方法斷言期望的結(jié)果:
public void testEmptyCollection() {
Collection collection = new ArrayList();
assertTrue(collection.isEmpty());
}
注意:JUnit推薦的做法是以test作為待測試的方法的開頭,這樣這些方法可以被自動找到并被測試。
3、寫一個suite()方法,它會使用反射動態(tài)的創(chuàng)建一個包含所有的testXxxx方法的測試套件:
public static Test suite() {
return new TestSuite(SimpleTest.class);
}
4、寫一個main()方法以文本運行器的方式方便的運行測試:
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}
5、運行測試:
以文本方式運行:
java junitfaq.SimpleTest
通過的測試結(jié)果是:
.
Time: 0
OK (1 tests)
Time上的小點表示測試個數(shù),如果測試通過則顯示OK。否則在小點的后邊標(biāo)上F,表示該測試失敗。
每次的測試結(jié)果都應(yīng)該是OK的,這樣才能說明測試是成功的,如果不成功要馬上根據(jù)提示信息進(jìn)行修正了。
如果JUnit報告了測試沒有成功,它會區(qū)分失。╢ailures)和錯誤(errors)。失敗是你的代碼中的assert方法失敗引起的;而錯誤則是代碼異常引起的,例如ArrayIndexOutOfBoundsException。
以圖形方式運行:
java junit.swingui.TestRunner junitfaq.SimpleTest
通過的測試結(jié)果在圖形界面的綠色條部分。
以上是簡單的測試樣例,在實際的測試中我們測試某個類的功能是常常需要執(zhí)行一些共同的操作,完成以后需要銷毀所占用的資源(例如網(wǎng)絡(luò)連接、數(shù)據(jù)庫連接,關(guān)閉打開的文件等),TestCase類給我們提供了setUp方法和tearDown方法,setUp方法的內(nèi)容在測試你編寫的TestCase子類的每個testXxxx方法之前都會運行,而tearDown方法的內(nèi)容在每個testXxxx方法結(jié)束以后都會執(zhí)行。這個既共享了初始化代碼,又消除了各個測試代碼之間可能產(chǎn)生的相互影響。
JUnit是什么?
JUnit是一個開發(fā)源代碼的Java測試框架,用于編寫和運行可重復(fù)的測試。他是用于單元測試框架體系xUnit的一個實例(用于java語言)。它包括以下特性:
1、用于測試期望結(jié)果的斷言(Assertion)
2、用于共享共同測試數(shù)據(jù)的測試工具
3、用于方便的組織和運行測試的測試套件
4、圖形和文本的測試運行器
JUnit初是由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驅(qū)之一)編寫的.
需要說明的是junit一般是用來進(jìn)行單元測試的,因此需要了解被測試代碼的內(nèi)部結(jié)構(gòu)(即所謂的白盒測試),另外junit是在xp編程和重構(gòu)(refactor)中被極力推薦使用的工具,因為在實現(xiàn)自動單元測試的情況下可以大大的提高開發(fā)的效率,但是實際上編寫測試代碼也是需要耗費很多的時間和精力的,那么使用這個東東好處到底在哪里呢?筆者認(rèn)為是這樣的:
1、對于xp編程而言,要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩(wěn)定,那么你需要同時維護(hù)測試代碼和實際代碼,這個工作量會大大增加。因此在xp編程中,基本過程是這樣的:構(gòu)思-》編寫測試代碼-》編寫代碼-》測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以后的代碼中如果發(fā)現(xiàn)問題可以較塊的追蹤到問題的原因,減小回歸錯誤的糾錯難度
2、對于重構(gòu)而言,其好處和xp編程中是類似的,因為重構(gòu)也是要求改一點測一點,減少回歸錯誤造成的時間消耗。
3、對于非以上兩種情況,我們在開發(fā)的時候使用junit寫一些適當(dāng)?shù)臏y試也是有必要的,因為一般我們也是需要編寫測試的代碼的,可能原來不是使用的junit,如果使用junit,而且針對接口(方法)編寫測試代碼會減少以后的維護(hù)工作,例如以后對方法內(nèi)部的修改(這個是相當(dāng)于重構(gòu)的工作了)。另外是因為junit有斷言功能,如果測試結(jié)果不通過會告訴我們那個測試不通過,為什么,而如果是想以前的一般做法是寫一些測試代碼看其輸出結(jié)果,然后再由自己來判斷結(jié)果使用正確,使用junit的好處是這個結(jié)果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結(jié)果是否正確可以了,在一般情況下會大大提高效率。