參數(shù)化測試的編寫稍微有點(diǎn)麻煩(當(dāng)然這是相對于 JUnit 中其它特性而言):
為準(zhǔn)備使用參數(shù)化測試的測試類指定特殊的運(yùn)行器 org.junit.runners.Parameterized。
為測試類聲明幾個變量,分別用于存放期望值和測試所用數(shù)據(jù)。
為測試類聲明一個使用注解 org.junit.runners.Parameterized.Parameters 修飾的,返回值為 java.util.Collection 的公共靜態(tài)方法,并在此方法中初始化所有需要測試的參數(shù)對。
為測試類聲明一個帶有參數(shù)的公共構(gòu)造函數(shù),并在其中為第二個環(huán)節(jié)中聲明的幾個變量賦值。
編寫測試方法,使用定義的變量作為參數(shù)進(jìn)行測試。
我們按照這個標(biāo)準(zhǔn),重新改造一番我們的單元測試代碼:
Java代碼 復(fù)制代碼
package com.ai92.cooljunit;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {
private String expected;
private String target;
@Parameters
public static Collection words(){
return Arrays.asList(new Object[][]{
{"employee_info", "employeeInfo"}, //測試一般的處理情況
{null, null}, //測試 null 時的處理情況
{"", ""}, //測試空字符串時的處理情況
{"employee_info", "EmployeeInfo"}, //測試當(dāng)首字母大寫時的情況
{"employee_info_a", "employeeInfoA"}, //測試當(dāng)尾字母為大寫時的情況
{"employee_a_info", "employeeAInfo"} //測試多個相連字母大寫時的情況
});
}
/**
* 參數(shù)化測試必須的構(gòu)造函數(shù)
* @param expected 期望的測試結(jié)果,對應(yīng)參數(shù)集中的第一個參數(shù)
* @param target 測試數(shù)據(jù),對應(yīng)參數(shù)集中的第二個參數(shù)
*/
public TestWordDealUtilWithParam(String expected , String target){
this.expected = expected;
this.target = target;
}
/**
* 測試將 Java 對象名稱到數(shù)據(jù)庫名稱的轉(zhuǎn)換
*/
@Test public void wordFormat4DB(){
assertEquals(expected, WordDealUtil.wordFormat4DB(target));
}
}
很明顯,代碼瘦身了。在靜態(tài)方法 words 中,我們使用二維數(shù)組來構(gòu)建測試所需要的參數(shù)列表,其中每個數(shù)組中的元素的放置順序并沒有什么要求,只要和構(gòu)造函數(shù)中的順序保持一致可以了,F(xiàn)在如果再增加一種測試情況,只需要在靜態(tài)方法 words 中添加相應(yīng)的數(shù)組即可,不再需要復(fù)制粘貼出一個新的方法出來了。
JUnit 和 Ant
隨著項目的進(jìn)展,項目的規(guī)模在不斷的膨脹,為了保證項目的質(zhì)量,有計劃的執(zhí)行全面的單元測試是非常有必要的。但單靠JUnit提供的測試套件很難勝任這項工作,因為項目中單元測試類的個數(shù)在不停的增加,測試套件卻無法動態(tài)的識別新加入的單元測試類,需要手動修改測試套件,這是一個很容易遺忘得步驟,稍有疏忽會影響全面單元測試的覆蓋率。
當(dāng)然解決的方法有多種多樣,其中將 JUnit 與構(gòu)建利器 Ant 結(jié)合使用可以很簡單的解決這個問題。Ant —— 備受贊譽(yù)的 Java 構(gòu)建工具。它憑借出色的易用性、平臺無關(guān)性以及對項目自動測試和自動部署的支持,成為眾多項目構(gòu)建過程中不可或缺的獨(dú)立工具,并已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn)。Ant 內(nèi)置了對 JUnit 的支持,它提供了兩個 Task:junit 和 junitreport,分別用于執(zhí)行 JUnit 單元測試和生成測試結(jié)果報告。使用這兩個 Task 編寫構(gòu)建腳本,可以很簡單的完成每次全面單元測試的任務(wù)。
不過,在使用 Ant 運(yùn)行 JUnit 之前,您需要稍作一些配置。打開 Eclipse 項界面,選擇 Ant -> Runtime 項(見圖7),將 JUnit 4.1 的 JAR 文件添加到 Classpath Tab 頁中的 Global Entries 設(shè)置項里。記得檢查一下 Ant Home Entries 設(shè)置項中的 Ant 版本是否在 1.7.0 之上,如果不是請?zhí)鎿Q為新版本的 Ant JAR 文件。
圖7 Ant Runtime 項