您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
探索JUnit 4.4特性
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/3/12 16:00:38 ] 推薦標(biāo)簽:

    假設(shè)機(jī)制(Assumption)

    理想情況下,寫(xiě)測(cè)試用例的開(kāi)發(fā)人員可以明確的知道所有導(dǎo)致他們所寫(xiě)的測(cè)試用例不通過(guò)的地方,但是有的時(shí)候,這些導(dǎo)致測(cè)試用例不通過(guò)的地方并不是很容易的被發(fā)現(xiàn),可能隱藏得很深,從而導(dǎo)致開(kāi)發(fā)人員在寫(xiě)測(cè)試用例時(shí)很難預(yù)測(cè)到這些因素,而且往往這些因素并不是開(kāi)發(fā)人員當(dāng)初設(shè)計(jì)測(cè)試用例時(shí)真正目的,他們的測(cè)試點(diǎn)是希望測(cè)試出被測(cè)代碼中別的出錯(cuò)地方。

    比如,一個(gè)測(cè)試用例運(yùn)行的 locale(如:Locale.US)與之前開(kāi)發(fā)人員設(shè)計(jì)該測(cè)試用例時(shí)所設(shè)想的不同(如:Locale.UK),這樣會(huì)導(dǎo)致測(cè)試不通過(guò),但是這可能并不是開(kāi)發(fā)人員之前設(shè)計(jì)測(cè)試用例時(shí)所設(shè)想的測(cè)試出來(lái)的有用的失敗結(jié)果(測(cè)試點(diǎn)并不是此,比如測(cè)試的真正目的是想判斷函數(shù)的返回值是否為 true,返回 false 則測(cè)試失。@時(shí)開(kāi)發(fā)人員可以通過(guò)編寫(xiě)一些額外的代碼來(lái)消除這些影響(比如將 locale 作為參數(shù)傳入到測(cè)試用例中,每次運(yùn)行測(cè)試用例時(shí),明確指定 locale),但是花費(fèi)時(shí)間和精力來(lái)編寫(xiě)這些不是測(cè)試用例根本目的的額外代碼其實(shí)是種浪費(fèi),這時(shí)可以使用 Assumption 假設(shè)機(jī)制來(lái)輕松達(dá)到額外代碼的目的。編寫(xiě)該測(cè)試用例時(shí),首先假設(shè) locale 必須是 Locale.UK,如果運(yùn)行時(shí) locale 是 Locale.UK,則繼續(xù)執(zhí)行該測(cè)試用例函數(shù),如果是其它的 locale,則跳過(guò)該測(cè)試用例函數(shù),執(zhí)行該測(cè)試用例函數(shù)以外的代碼,這樣不會(huì)因?yàn)?locale 的問(wèn)題導(dǎo)致測(cè)試出錯(cuò)。

    JUnit 4.4 結(jié)合 Hamcrest 庫(kù)提供了 assumeThat 語(yǔ)句,開(kāi)發(fā)人員可以使用其配合匹配符 Matcher 設(shè)計(jì)所有的假設(shè)條件(語(yǔ)法和 assertThat 一樣)。同樣為了方便使用,JUnit 4.4 還專門(mén)提供了 assumeTrue,assumeNotNull 和 assumeNoException 語(yǔ)句。

    假設(shè)機(jī)制(Assumption)的優(yōu)點(diǎn)

    優(yōu)點(diǎn) 1:通過(guò)對(duì) runtime 變量進(jìn)行取值假設(shè),從而不會(huì)因?yàn)橐粋(gè)測(cè)試用例的不通過(guò)而導(dǎo)致整個(gè)測(cè)試失敗而中斷(the test passes),使得測(cè)試更加連貫。

    開(kāi)發(fā)人員編寫(xiě)單元測(cè)試時(shí),經(jīng)常會(huì)在一個(gè)測(cè)試中包含若干個(gè)測(cè)試用例函數(shù),這時(shí)若是遇到某個(gè)測(cè)試用例函數(shù)不通過(guò),整個(gè)單元測(cè)試會(huì)終止。這將導(dǎo)致測(cè)試不連貫,因?yàn)殚_(kāi)發(fā)人員往往希望一次能運(yùn)行多個(gè)測(cè)試用例函數(shù),不通過(guò)的測(cè)試用例函數(shù)不要影響到剩下的測(cè)試用例函數(shù)的運(yùn)行,否則會(huì)給 debug 調(diào)試帶來(lái)很大的難度。

    開(kāi)發(fā)人員編寫(xiě)單元測(cè)試時(shí),有時(shí)是預(yù)測(cè)不了傳入到單元測(cè)試方法中的變量值的,而且這些值有時(shí)并不是開(kāi)發(fā)人員所期望的,因?yàn)樗麄儠?huì)導(dǎo)致測(cè)試用例不通過(guò)并中斷整個(gè)測(cè)試,所以開(kāi)發(fā)人員需要跳過(guò)這些導(dǎo)致測(cè)試用例函數(shù)不通過(guò)的異常情況。

    清單 6 假設(shè)機(jī)制優(yōu)點(diǎn) 1 舉例

//@Test 注釋表明接下來(lái)的函數(shù)是 JUnit4 及其以后版本的測(cè)試用例函數(shù)
@Test
public void testAssumptions() {
    //假設(shè)進(jìn)入testAssumptions時(shí),變量i的值為10,如果該假設(shè)不滿足,程序不會(huì)執(zhí)行assumeThat后面的語(yǔ)句
    assumeThat( i, is(10) );
    //如果之前的假設(shè)成立,會(huì)打印"assumption is true!"到控制臺(tái),否則直接調(diào)出,執(zhí)行下一個(gè)測(cè)試用例函數(shù)
    System.out.println( "assumption is true!" );
}

    優(yōu)點(diǎn) 2:利用假設(shè)可以控制某個(gè)測(cè)試用例的運(yùn)行時(shí)間,讓其在自己期望的時(shí)候運(yùn)行(run at a given time)。

    清單 7 假設(shè)機(jī)制優(yōu)點(diǎn) 2 舉例

@Test
//測(cè)試用例函數(shù)veryLongTest()執(zhí)行需要很長(zhǎng)時(shí)間,所以開(kāi)發(fā)人員不是每次都想運(yùn)行它,可以通過(guò)判斷是否定義了
//”DEV”環(huán)境變量來(lái)選擇性地執(zhí)行該測(cè)試用例
public void veryLongTest() throws Exception {
    //假設(shè)環(huán)境變量”DEV”為空,即如果之前通過(guò)System.setProperty定義過(guò)”DEV”環(huán)境變量(不為空),則自動(dòng)跳過(guò)
    //veryLongTest中假設(shè)后剩下的語(yǔ)句,去執(zhí)行下一個(gè)JUnit測(cè)試用例,否則執(zhí)行假設(shè)后接下來(lái)的語(yǔ)句
    assumeThat( System.getProperty( "DEV" ), nullValue() );

    System.out.println("running a long test");
    Thread.sleep( 90 * 1000 );
}

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