JUnit中的測(cè)試套件和參數(shù)化測(cè)試
JUnit4.x的測(cè)試運(yùn)行器
我們也可以定制自己的運(yùn)行器,所有的運(yùn)行器都繼承自org.junit.runner.Runner
還可以使用org.junit.runer.RunWith注解 為每個(gè)測(cè)試類指定使用具體的運(yùn)行器
一般情況下,默認(rèn)測(cè)試運(yùn)行器可以應(yīng)對(duì)絕大多數(shù)的單元測(cè)試要求
當(dāng)使用JUnit提供的一些高級(jí)特性,或者針對(duì)特殊需求定制JUnit測(cè)試方式時(shí)
顯式的聲明測(cè)試運(yùn)行就必不可少了
JUnit4.x測(cè)試套件的創(chuàng)建步驟
① 創(chuàng)建一個(gè)空類作為測(cè)試套件的入口
② 使用org.junit.runner.RunWith 和org.junit.runners.Suite.SuiteClasses注解 修飾該空類
③ 將org.junit.runners.Suite 作為參數(shù)傳入RunWith注解,即使用套件運(yùn)行器執(zhí)行此類
④ 將需要放入此測(cè)試套件的測(cè)試類組成數(shù)組,作為SuiteClasses注解的參數(shù)
⑤ 保證這個(gè)空類使用public 修飾,而且存在公開(kāi)的不帶有任何參數(shù)的構(gòu)造函數(shù)
下面是JUnit4.x中創(chuàng)建測(cè)試套件類的示例代碼
package com.jadyer.junit4; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; /** * JUnit4.x測(cè)試套件的舉例 * @see 下面的CalculatorTest.class和ParameterTest.class均為我們自己編寫(xiě)的JUnit4單元測(cè)試類 */ @RunWith(Suite.class) @SuiteClasses({CalculatorTest.class, ParameterTest.class}) public class TestAll {} 下面是JUnit3.8中創(chuàng)建測(cè)試套件類的示例代碼 package com.jadyer.junit3; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * JUnit3.8中批量運(yùn)行所有的測(cè)試類。。直接在該類上Run As JUnit Test即可 * @see 這里就用到了設(shè)計(jì)模式中典型的組合模式,即將不同的東西組合起來(lái) * @see 組合之后的東西,即可以包含本身,又可以包含組成它的某一部分 * @see TestSuite本身是由TestCase來(lái)組成的,那么TestSuite里面就可以包含TestCase * @see 同時(shí)TestSuite里面還可以繼續(xù)包含TestSuite,形成一種遞歸的關(guān)系 * @see 這里就體現(xiàn)出來(lái)了,所以這是一種非常非常好的設(shè)計(jì)模式,一種好的策略 */ public class TestAll extends TestCase { //方法名固定的,必須為public static Test suite() public static Test suite() { //TestSuite類實(shí)現(xiàn)了Test接口 TestSuite suite = new TestSuite(); //這里傳遞的是測(cè)試類的Class對(duì)象。該方法還可以接收TestSuite類型對(duì)象 suite.addTestSuite(CalculatorTest.class); suite.addTestSuite(MyStackTest.class); return suite; } } |
JUnit4.X的參數(shù)化測(cè)試
為保證單元測(cè)試的嚴(yán)謹(jǐn)性,通常會(huì)模擬不同的測(cè)試數(shù)據(jù)來(lái)測(cè)試方法的處理能力
為此我們需要編寫(xiě)大量的單元測(cè)試的方法,可是這些測(cè)試方法都是大同小異的
它們的代碼結(jié)構(gòu)都是相同的,不同的僅僅是測(cè)試數(shù)據(jù)和期望值
這時(shí)可以使用JUnit4的參數(shù)化測(cè)試,提取測(cè)試方法中相同代碼 ,提高代碼重用度
而JUnit3.8對(duì)于此類問(wèn)題,并沒(méi)有很好的解決方法,JUnit4.x彌補(bǔ)了JUnit3.8的不足
參數(shù)化測(cè)試的要點(diǎn)
① 準(zhǔn)備使用參數(shù)化測(cè)試的測(cè)試類必須由org.junit.runners.Parameterized 運(yùn)行器修飾
② 準(zhǔn)備數(shù)據(jù)。數(shù)據(jù)的準(zhǔn)備需要在一個(gè)方法中進(jìn)行,該方法需要滿足的要求如下
1) 該方法必須由org.junit.runners.Parameterized.Parameters注解 修飾
2) 該方法必須為返回值是java.util.Collection 類型的public static方法
3) 該方法沒(méi)有參數(shù) ,方法名可隨意 。并且該方法是在該類實(shí)例化之前執(zhí)行的
③ 為測(cè)試類聲明幾個(gè)變量 ,分別用于存放期望值和測(cè)試所用的數(shù)據(jù)
④ 為測(cè)試類聲明一個(gè)帶有參數(shù)的公共構(gòu)造函數(shù) ,并在其中為③ 中聲明的變量賦值
⑤ 編寫(xiě)測(cè)試方法,使用定義的變量作為參數(shù)進(jìn)行測(cè)試
參數(shù)化測(cè)試的缺點(diǎn)
一般來(lái)說(shuō),在一個(gè)類里面只執(zhí)行一個(gè)測(cè)試方法。因?yàn)樗鶞?zhǔn)備的數(shù)據(jù)是無(wú)法共用的
這就要求,所要測(cè)試的方法是大數(shù)據(jù)量的方法,所以才有必要寫(xiě)一個(gè)參數(shù)化測(cè)試
而在實(shí)際開(kāi)發(fā)中,參數(shù)化測(cè)試用到的并不是特別多
下面是JUnit4.x中參數(shù)化測(cè)試的示例代碼
首先是Calculator.java
package com.jadyer.junit4; /** * 數(shù)學(xué)計(jì)算-->加法 */ public class Calculator { public int add(int a, int b) { return a + b; } } |
然后是JUnit4.x的參數(shù)化測(cè)試類ParameterTest.java
package com.jadyer.junit4; import static org.junit.Assert.assertEquals; //靜態(tài)導(dǎo)入 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; import com.jadyer.junit4.Calculator; /** * JUnit4的參數(shù)化測(cè)試 */ @RunWith(Parameterized.class) public class ParameterTest { private int expected; private int input11; private int input22; public ParameterTest(int expected, int input11, int input22){ this.expected = expected; this.input11 = input11; this.input22 = input22; } @Parameters public static Collection prepareData(){ //該二維數(shù)組的類型必須是Object類型的 //該二維數(shù)組中的數(shù)據(jù)是為測(cè)試Calculator中的add()方法而準(zhǔn)備的 //該二維數(shù)組中的每一個(gè)元素中的數(shù)據(jù)都對(duì)應(yīng)著構(gòu)造方法ParameterTest()中的參數(shù)的位置 //所以依據(jù)構(gòu)造方法的參數(shù)位置判斷,該二維數(shù)組中的第一個(gè)元素里面的第一個(gè)數(shù)據(jù)等于后兩個(gè)數(shù)據(jù)的和 //有關(guān)這種具體的使用規(guī)則,請(qǐng)參考JUnit4的API文檔中的org.junit.runners.Parameterized類的說(shuō)明 Object[][] object = {{3,1,2}, {0,0,0}, {-4,-1,-3}, {6,-3,9}}; return Arrays.asList(object); } @Test public void testAdd(){ Calculator cal = new Calculator(); assertEquals(expected, cal.add(input11, input22)); } } /********************【該測(cè)試的執(zhí)行流程】************************************************************************/ //1..首先會(huì)執(zhí)行prepareData()方法,將準(zhǔn)備好的數(shù)據(jù)作為一個(gè)Collection返回 //2..接下來(lái)根據(jù)準(zhǔn)備好的數(shù)據(jù)調(diào)用構(gòu)造方法。Collection中有幾個(gè)元素,該構(gòu)造方法就會(huì)被調(diào)用幾次 // 我們這里Collection中有4個(gè)元素,所以ParameterTest()構(gòu)造方法會(huì)被調(diào)用4次,于是會(huì)產(chǎn)生4個(gè)該測(cè)試類的對(duì)象 // 對(duì)于每一個(gè)測(cè)試類的對(duì)象,都會(huì)去執(zhí)行testAdd()方法 // 而Collection中的數(shù)據(jù)是由JUnit傳給ParameterTest(int expected, int input11, int input22)構(gòu)造方法的 // 于是testAdd()用到的三個(gè)私有參數(shù),就被ParameterTest()構(gòu)造方法設(shè)置好值了,而它們?nèi)齻€(gè)的值就來(lái)自于Collection /************************************************************************************************************/ |
posted on 2014-12-23 00:07 順其自然EVO 閱讀(685) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄