為了簡(jiǎn)化類似的測(cè)試,JUnit4提出了“參數(shù)化測(cè)試”的概念,只寫一個(gè)測(cè)試函數(shù),把這若干種情況作為參數(shù)傳遞進(jìn)去,一次性的完成測(cè)試。代碼如下:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class SquareTest ...{
private static Calculator calculator = new Calculator();
private int param;
private int result;
@Parameters
public static Collection data() ...{
return Arrays.asList(new Object[][]...{
...{2, 4},
...{0, 0},
...{-3, 9},
});
}
//構(gòu)造函數(shù),對(duì)變量進(jìn)行初始化
public SquareTest(int param, int result) ...{
this.param = param;
this.result = result;
}
@Test
public void square() ...{
calculator.square(param);
assertEquals(result, calculator.getResult());
}
}
下面我們對(duì)上述代碼進(jìn)行分析。首先,你要為這種測(cè)試專門生成一個(gè)新的類,而不能與其他測(cè)試共用同一個(gè)類,此例中我們定義了一個(gè)SquareTest類。然后,你要為這個(gè)類指定一個(gè)Runner,而不能使用默認(rèn)的Runner了,因?yàn)樘厥獾墓δ芤锰厥獾腞unner嘛。@RunWith(Parameterized.class)這條語句是為這個(gè)類指定了一個(gè)ParameterizedRunner。第二步,定義一個(gè)待測(cè)試的類,并且定義兩個(gè)變量,一個(gè)用于存放參數(shù),一個(gè)用于存放期待的結(jié)果。接下來,定義測(cè)試數(shù)據(jù)的集合,也是上述的data()方法,該方法可以任意命名,但是必須使用@Parameters標(biāo)注進(jìn)行修飾。這個(gè)方法的框架不予解釋了,大家只需要注意其中的數(shù)據(jù),是一個(gè)二維數(shù)組,數(shù)據(jù)兩兩一組,每組中的這兩個(gè)數(shù)據(jù),一個(gè)是參數(shù),一個(gè)是你預(yù)期的結(jié)果。比如我們的第一組{2, 4},2是參數(shù),4是預(yù)期的結(jié)果。這兩個(gè)數(shù)據(jù)的順序無所謂,誰前誰后都可以。之后是構(gòu)造函數(shù),其功能是對(duì)先前定義的兩個(gè)參數(shù)進(jìn)行初始化。在這里你可要注意一下參數(shù)的順序了,要和上面的數(shù)據(jù)集合的順序保持一致。如果前面的順序是{參數(shù),期待的結(jié)果},那么你構(gòu)造函數(shù)的順序也要是“構(gòu)造函數(shù)(參數(shù), 期待的結(jié)果)”,反之亦然。后是寫一個(gè)簡(jiǎn)單的測(cè)試?yán),和前面介紹過的寫法完全一樣,在此不多說。
六、 打包測(cè)試。
通過前面的介紹我們可以感覺到,在一個(gè)項(xiàng)目中,只寫一個(gè)測(cè)試類是不可能的,我們會(huì)寫出很多很多個(gè)測(cè)試類?墒沁@些測(cè)試類必須一個(gè)一個(gè)的執(zhí)行,也是比較麻煩的事情。鑒于此,JUnit為我們提供了打包測(cè)試的功能,將所有需要運(yùn)行的測(cè)試類集中起來,一次性的運(yùn)行完畢,大大的方便了我們的測(cè)試工作。具體代碼如下:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses(...{CalculatorTest.class, SquareTest.class})
public class AllCalculatorTests ...{}
大家可以看到,這個(gè)功能也需要使用一個(gè)特殊的Runner,因此我們需要向@RunWith標(biāo)注傳遞一個(gè)參數(shù)Suite.class。同時(shí),我們還需要另外一個(gè)標(biāo)注@Suite.SuiteClasses,來表明這個(gè)類是一個(gè)打包測(cè)試類。我們把需要打包的類作為參數(shù)傳遞給該標(biāo)注可以了。有了這兩個(gè)標(biāo)注之后,已經(jīng)完整的表達(dá)了所有的含義,因此下面的類已經(jīng)無關(guān)緊要,隨便起一個(gè)類名,內(nèi)容全部為空既可。