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