您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit測(cè)試教程
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/8/26 14:42:48 ] 推薦標(biāo)簽:

安裝
首先你要獲取JUnit的軟件包,從JUnit下載新的軟件包(截至寫作本文時(shí),JUnit的新版本是3.7)。將其在適當(dāng)?shù)哪夸浵陆獍。這樣在安裝目錄(也是你所選擇的解包的目錄)下你找到一個(gè)名為junit.jar的文件。將這個(gè)jar文件加入你的CLASSPATH系統(tǒng)變量。(IDE的設(shè)置會(huì)有所不同,參看你所喜愛(ài)的IDE的配置指南)JUnit安裝完了。太easy了!
你一旦安裝完JUnit,有可能想試試我們的Car和testCar類,沒(méi)問(wèn)題,我已經(jīng)運(yùn)行過(guò)了,你得到的結(jié)果應(yīng)該和我列出的結(jié)果類似。(以防新版JUnit使我的文章過(guò)時(shí))
接下來(lái),你可能會(huì)先寫測(cè)試代碼,再寫工作代碼,或者相反,先寫工作代碼,再寫測(cè)試代碼。我更贊成使用前一種方法:先寫測(cè)試代碼,再寫工作代碼。因?yàn)檫@樣可以使我們編寫工作代碼時(shí)清晰地了解工作類的行為。
要注意編寫一定能通過(guò)的測(cè)試代碼(如文中的例子)并沒(méi)有任何意義,只有測(cè)試代碼能幫助我們發(fā)現(xiàn)bug,測(cè)試代碼才有其價(jià)值。此外測(cè)試代碼還應(yīng)該對(duì)工作代碼進(jìn)行全面的測(cè)試。如給方法調(diào)用的參數(shù)傳入空值、錯(cuò)誤值和正確的值,看看方法的行為是否如你所期望的那樣。
你現(xiàn)在已經(jīng)知道了編寫測(cè)試類的基本步驟:
1>擴(kuò)展TestCase類;
2>覆蓋runTest()方法(可選);
3>寫一些testXXXXX()方法;

Fixture
解下來(lái)的問(wèn)題是,如果你要對(duì)一個(gè)或若干個(gè)的類執(zhí)行多個(gè)測(cè)試,該怎么辦?JUnit對(duì)此有特殊的解決辦法。
如果需要在一個(gè)或若干個(gè)的類執(zhí)行多個(gè)測(cè)試,這些類成為了測(cè)試的context。在JUnit中被稱為Fixture(如testCar類中的 myCar 和 expectedWheels )。當(dāng)你編寫測(cè)試代碼時(shí),你會(huì)發(fā)現(xiàn)你花費(fèi)了很多時(shí)間配置/初始化相關(guān)測(cè)試的Fixture。將配置Fixture的代碼放入測(cè)試類的構(gòu)造方法中并不可取,因?yàn)槲覀円髨?zhí)行多個(gè)測(cè)試,我并不希望某個(gè)測(cè)試的結(jié)果意外地(如果這是你要求的,那另當(dāng)別論了)影響其他測(cè)試的結(jié)果。通常若干個(gè)測(cè)試會(huì)使用相同的Fixture,而每個(gè)測(cè)試又各有自己需要改變的地方。
為此,JUnit提供了兩個(gè)方法,定義在TestCase類中。
protected void setUp() throws java.lang.Exception
protected void tearDown() throws java.lang.Exception
覆蓋setUp()方法,初始化所有測(cè)試的Fixture(你甚至可以在setUp中建立網(wǎng)絡(luò)連接),將每個(gè)測(cè)試略有不同的地方在testXXX()方法中進(jìn)行配置。
覆蓋tearDown()(我總想起一首叫雨滴的吉他曲),釋放你在setUp()中分配的性資源,如數(shù)據(jù)庫(kù)連接。
當(dāng)JUnit執(zhí)行測(cè)試時(shí),它在執(zhí)行每個(gè)testXXXXX()方法前都調(diào)用setUp(),而在執(zhí)行每個(gè)testXXXXX()方法后都調(diào)用tearDown()方法,由此保證了測(cè)試不會(huì)相互影響。

TestCase
需要提醒一下,在junit.work.Assert類中定義了相當(dāng)多的assert方法,主要有assert(), assert(), assertEquals(), assertNull(), assertSame(), assertTrue(), fail()等方法。如果你需要比較自己定義的類,如Car。assert方法需要你覆蓋Object類的equals()方法,以比較兩個(gè)對(duì)象的不同。實(shí)踐表明:如果你覆蓋了Object類的equals()方法,好也覆蓋Object類的hashCode()方法。再進(jìn)一步,連帶Object類的toString()方法也一并覆蓋。這樣可以使測(cè)試結(jié)果更具可讀性。
當(dāng)你設(shè)置好了Fixture后,下一步是編寫所需的testXXX()方法。一定要保證testXXX()方法的public屬性,否則無(wú)法通過(guò)內(nèi)。╮eflection)對(duì)該測(cè)試進(jìn)行調(diào)用。
每個(gè)擴(kuò)展的TestCase類(也是你編寫的測(cè)試類)會(huì)有多個(gè)testXXX()方法。一個(gè)testXXX()方法是一個(gè)測(cè)試。要想運(yùn)行這個(gè)測(cè)試,你必須定義如何運(yùn)行該測(cè)試。如果你有多個(gè)testXXX()方法,你要定義多次。JUnit支持兩種運(yùn)行單個(gè)測(cè)試的方法:靜態(tài)的和動(dòng)態(tài)的方法。
靜態(tài)的方法是覆蓋TestCase類的runTest()方法,一般是采用內(nèi)部類的方式創(chuàng)建一個(gè)測(cè)試實(shí)例:
TestCase test01 = new testCar("test getWheels") {
public void runTest() {
testGetWheels();
}
}
采用靜態(tài)的方法要注意要給每個(gè)測(cè)試一個(gè)名字(這個(gè)名字可以任意起,但你肯定希望這個(gè)名字有某種意義),這樣你可以區(qū)分那個(gè)測(cè)試失敗了。
動(dòng)態(tài)的方法是用內(nèi)省來(lái)實(shí)現(xiàn)runTest()以創(chuàng)建一個(gè)測(cè)試實(shí)例。這要求測(cè)試的名字是需要調(diào)用的測(cè)試方法的名字:
TestCase test01 = new testCar("testGetWheels");
JUnit會(huì)動(dòng)態(tài)查找并調(diào)用指定的測(cè)試方法。動(dòng)態(tài)的方法很簡(jiǎn)潔,但如果你鍵入了錯(cuò)誤的名字會(huì)得到一個(gè)令人奇怪的NoSuchMethodException異常。動(dòng)態(tài)的方法和靜態(tài)的方法都很好,你可以按照自己的喜好來(lái)選擇。(先別著急選擇,后面還有一種更酷的方法等著你呢。)

上一頁(yè)123456下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd