您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit使用經(jīng)驗(yàn)(轉(zhuǎn)自PMT雜志)
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/1/17 13:59:06 ] 推薦標(biāo)簽:

原作:Andy Schneider Richard Dallaway 等
編譯:PMT 測(cè)試工作組
譯者注:

很多測(cè)試人員都有過(guò)編寫(xiě)測(cè)試框架的經(jīng)歷,JUnit的出現(xiàn)避免了其中的大量重復(fù)勞動(dòng)。但如同其他的工具一樣用得好和用得差的結(jié)果是截然不同的。我們編輯這樣一個(gè)JUnit的系列希望能夠幫助越來(lái)越多的JUnit使用者用好JUnit。我們也希望讀者們能夠把自己的一些經(jīng)驗(yàn)所得和大家分享。

經(jīng)驗(yàn)一、不要在測(cè)試用例的構(gòu)造函數(shù)中做初始化

當(dāng)我們需要增加一個(gè)測(cè)試時(shí),我們要書(shū)寫(xiě)一個(gè)自己的測(cè)試用例,比如SomeTest。如果你喜歡在SomeTest的構(gòu)造函數(shù)中做有關(guān)的初始化工作,這可不是個(gè)好習(xí)慣。如下例:
public class SomeTest extends TestCase{
public SomeTest(String testName){
super(testName);
//初始化代碼
}
}
一旦初始化代碼產(chǎn)生異常,比如IllegalStateException,JUnit隨之將產(chǎn)生一個(gè)AssertionFailedError,并顯示類(lèi)似下面的出錯(cuò)信息:
j u n i t . f r a m e w o r k . A s s e r t i o n F a i l e d E r r o r : C a n n o t i n s t a n t i a t e t e s t c a s e : t e s t 1 a t
j u n i t . f r a m e w o r k . A s s e r t . f a i l ( A s s e r t . j a v a : 1 4 3 ) a t
j u n i t . f r a m e w o r k . T e s t S u i t e $ 1 . r u n T e s t ( T e s t S u i t e . j a v a : 1 7 8 ) a t
j u n i t . f r a m e w o r k . T e s t C a s e . r u n B a r e ( T e s t C a s e . j a v a : 1 2 9 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t $ 1 . p r o t e c t ( T e s t R e s u l t . j a v a : 1 0 0 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t . r u n P r o t e c t e d ( T e s t R e s u l t . j a v a : 1 1 7 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t . r u n ( T e s t R e s u l t . j a v a : 1 0 3 ) a t
j u n i t . f r a m e w o r k . T e s t C a s e . r u n ( T e s t C a s e . j a v a : 1 2 0 ) a t
j u n i t . f r a m e w o r k . T e s t S u i t e . r u n ( T e s t S u i t e . j a v a , C o m p i l e d C o d e ) a t
j u n i t . u i . T e s t R u n n e r $ 1 2 . r u n ( T e s t R u n n e r . j a v a : 4 2 9 )

這一大堆出錯(cuò)信息只會(huì)讓人一頭霧水,我們只知道JUnit無(wú)法實(shí)例化某個(gè)測(cè)試用例,到底出了什么問(wèn)題,在哪兒出錯(cuò)了呢?不知道!那么好的做法是怎樣呢?

答案是重載測(cè)試用例的setUp()方法進(jìn)行初始化。當(dāng)setUp()中的初始化代碼產(chǎn)生異常時(shí)我們得到的是類(lèi)似下面的出錯(cuò)信息:

j a v a . l a n g . I l l e g a l S t a t e E x c e p t i o n : O o p s a t b p . D T C . s e t U p ( D T C . j a v a : 3 4 ) a t
j u n i t . f r a m e w o r k . T e s t C a s e . r u n B a r e ( T e s t C a s e . j a v a : 1 2 7 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t $ 1 . p r o t e c t ( T e s t R e s u l t . j a v a : 1 0 0 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t . r u n P r o t e c t e d ( T e s t R e s u l t . j a v a : 1 1 7 ) a t
j u n i t . f r a m e w o r k . T e s t R e s u l t . r u n ( T e s t R e s u l t . j a v a : 1 0 3 )
...

顯然這要清楚得多我們一下子可以知道是在DTC.java 的第34 行產(chǎn)生了IllegalStateException

經(jīng)驗(yàn)二、不要假定測(cè)試用例中測(cè)試的執(zhí)行次序
我們知道在一個(gè)JUnit 的測(cè)試用例類(lèi)中可以包含多個(gè)測(cè)試,每個(gè)測(cè)試其實(shí)是一個(gè)method。在下面的例子中有兩個(gè)不同的測(cè)試,盡管testDoThisFirst()在位置上先于testDoThisSecond(),但我們不能此假定testDoThisFirst()會(huì)先執(zhí)行。

public class SomeTestCase extends TestCase{
public SomeTestCase(String testName){
super(testName);
}
public void testDoThisFirst(){
...
}
public void testDoThisSecond(){
}
}

由于JUnit 內(nèi)部使用一個(gè)Vector 來(lái)存儲(chǔ)所有的test,因此在不同的操作系統(tǒng)和Java 虛擬機(jī)上,test 的執(zhí)行次序是不可預(yù)測(cè)的。好的習(xí)慣是保持測(cè)試之間的獨(dú)立性,使得它們?cè)谌魏未涡蛳聢?zhí)行的結(jié)果都是相同的。如果真得需要某些測(cè)試按照特定的次序執(zhí)行,我們可以借助addTest 來(lái)實(shí)現(xiàn)。如下例:

public static Testsuite(){
suite.addTest(new SomeTestCase(“testDoThisFirst”;));
suite.addTest(new SomeTestCase(“testDoThisSecond”;));
return suite;
}

這樣我們可以確保JUnit先執(zhí)行testDoThisFirst(),然后執(zhí)行testDoThisSecond()。

經(jīng)驗(yàn)三、測(cè)試要避免人工干預(yù)

如果某段測(cè)試代碼需要人工干預(yù),那至少有兩個(gè)不良后果:一則不能被包括在自動(dòng)測(cè)試中,比如夜間的回歸測(cè)試;二則不能被重復(fù)執(zhí)行,例如數(shù)據(jù)刪除的測(cè)試不能做完刪除萬(wàn)事大吉,比較好的做法是自動(dòng)補(bǔ)上刪除掉的數(shù)據(jù)。經(jīng)驗(yàn)二講的是不同的測(cè)試要避免相關(guān)性,而經(jīng)驗(yàn)三講的其實(shí)是測(cè)試要避免自相關(guān)。

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