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

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

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

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

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