qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          JUnit中的測(cè)試套件和參數(shù)化測(cè)試

          JUnit4.x的測(cè)試運(yùn)行器
            JUnit單元測(cè)試提供了默認(rèn)的測(cè)試運(yùn)行器,它的測(cè)試方法都是由它負(fù)責(zé)執(zhí)行的
            我們也可以定制自己的運(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í)專欄

          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 罗源县| 巴彦县| 屏边| 佛学| 寿光市| 延寿县| 内丘县| 丹巴县| 东丰县| 荔浦县| 前郭尔| 修水县| 许昌县| 九寨沟县| 涟水县| 广灵县| 平潭县| 苍南县| 会同县| 彭山县| 江永县| 桦南县| 沁源县| 陕西省| 佛山市| 霍山县| 神池县| 什邡市| 延吉市| 丰镇市| 澄江县| 青田县| 嵩明县| 松原市| 卓尼县| 双辽市| 永州市| 阜康市| 普兰店市| 万宁市| 蒲城县|