qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          JUnit中的測試套件和參數化測試

          JUnit4.x的測試運行器
            JUnit單元測試提供了默認的測試運行器,它的測試方法都是由它負責執行的
            我們也可以定制自己的運行器,所有的運行器都繼承自org.junit.runner.Runner
            還可以使用org.junit.runer.RunWith注解 為每個測試類指定使用具體的運行器
            一般情況下,默認測試運行器可以應對絕大多數的單元測試要求
            當使用JUnit提供的一些高級特性,或者針對特殊需求定制JUnit測試方式時
            顯式的聲明測試運行就必不可少了
            JUnit4.x測試套件的創建步驟
            ① 創建一個空類作為測試套件的入口
            ② 使用org.junit.runner.RunWith 和org.junit.runners.Suite.SuiteClasses注解 修飾該空類
            ③ 將org.junit.runners.Suite 作為參數傳入RunWith注解,即使用套件運行器執行此類
            ④ 將需要放入此測試套件的測試類組成數組,作為SuiteClasses注解的參數
            ⑤ 保證這個空類使用public 修飾,而且存在公開的不帶有任何參數的構造函數
            下面是JUnit4.x中創建測試套件類的示例代碼
          package com.jadyer.junit4;
          import org.junit.runner.RunWith;
          import org.junit.runners.Suite;
          import org.junit.runners.Suite.SuiteClasses;
          /**
          * JUnit4.x測試套件的舉例
          * @see 下面的CalculatorTest.class和ParameterTest.class均為我們自己編寫的JUnit4單元測試類
          */
          @RunWith(Suite.class)
          @SuiteClasses({CalculatorTest.class, ParameterTest.class})
          public class TestAll {}
            下面是JUnit3.8中創建測試套件類的示例代碼
          package com.jadyer.junit3;
          import junit.framework.Test;
          import junit.framework.TestCase;
          import junit.framework.TestSuite;
          /**
          * JUnit3.8中批量運行所有的測試類。。直接在該類上Run As JUnit Test即可
          * @see 這里就用到了設計模式中典型的組合模式,即將不同的東西組合起來
          * @see 組合之后的東西,即可以包含本身,又可以包含組成它的某一部分
          * @see TestSuite本身是由TestCase來組成的,那么TestSuite里面就可以包含TestCase
          * @see 同時TestSuite里面還可以繼續包含TestSuite,形成一種遞歸的關系
          * @see 這里就體現出來了,所以這是一種非常非常好的設計模式,一種好的策略
          */
          public class TestAll extends TestCase {
          //方法名固定的,必須為public static Test suite()
          public static Test suite() {
          //TestSuite類實現了Test接口
          TestSuite suite = new TestSuite();
          //這里傳遞的是測試類的Class對象。該方法還可以接收TestSuite類型對象
          suite.addTestSuite(CalculatorTest.class);
          suite.addTestSuite(MyStackTest.class);
          return suite;
          }
          }


          JUnit4.X的參數化測試
            為保證單元測試的嚴謹性,通常會模擬不同的測試數據來測試方法的處理能力
            為此我們需要編寫大量的單元測試的方法,可是這些測試方法都是大同小異的
            它們的代碼結構都是相同的,不同的僅僅是測試數據和期望值
            這時可以使用JUnit4的參數化測試,提取測試方法中相同代碼 ,提高代碼重用度
            而JUnit3.8對于此類問題,并沒有很好的解決方法,JUnit4.x彌補了JUnit3.8的不足
            參數化測試的要點
            ① 準備使用參數化測試的測試類必須由org.junit.runners.Parameterized 運行器修飾
            ② 準備數據。數據的準備需要在一個方法中進行,該方法需要滿足的要求如下
            1) 該方法必須由org.junit.runners.Parameterized.Parameters注解 修飾
            2) 該方法必須為返回值是java.util.Collection 類型的public  static方法
            3) 該方法沒有參數 ,方法名可隨意 。并且該方法是在該類實例化之前執行的
            ③ 為測試類聲明幾個變量 ,分別用于存放期望值和測試所用的數據
            ④ 為測試類聲明一個帶有參數的公共構造函數 ,并在其中為③ 中聲明的變量賦值
            ⑤ 編寫測試方法,使用定義的變量作為參數進行測試
            參數化測試的缺點
            一般來說,在一個類里面只執行一個測試方法。因為所準備的數據是無法共用的
            這就要求,所要測試的方法是大數據量的方法,所以才有必要寫一個參數化測試
            而在實際開發中,參數化測試用到的并不是特別多
            下面是JUnit4.x中參數化測試的示例代碼
            首先是Calculator.java
          package com.jadyer.junit4;
          /**
          * 數學計算-->加法
          */
          public class Calculator {
          public int add(int a, int b) {
          return a + b;
          }
          }
            然后是JUnit4.x的參數化測試類ParameterTest.java
          package com.jadyer.junit4;
          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;
          import com.jadyer.junit4.Calculator;
          /**
          * JUnit4的參數化測試
          */
          @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(){
          //該二維數組的類型必須是Object類型的
          //該二維數組中的數據是為測試Calculator中的add()方法而準備的
          //該二維數組中的每一個元素中的數據都對應著構造方法ParameterTest()中的參數的位置
          //所以依據構造方法的參數位置判斷,該二維數組中的第一個元素里面的第一個數據等于后兩個數據的和
          //有關這種具體的使用規則,請參考JUnit4的API文檔中的org.junit.runners.Parameterized類的說明
          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));
          }
          }
          /********************【該測試的執行流程】************************************************************************/
          //1..首先會執行prepareData()方法,將準備好的數據作為一個Collection返回
          //2..接下來根據準備好的數據調用構造方法。Collection中有幾個元素,該構造方法就會被調用幾次
          //   我們這里Collection中有4個元素,所以ParameterTest()構造方法會被調用4次,于是會產生4個該測試類的對象
          //   對于每一個測試類的對象,都會去執行testAdd()方法
          //   而Collection中的數據是由JUnit傳給ParameterTest(int expected, int input11, int input22)構造方法的
          //   于是testAdd()用到的三個私有參數,就被ParameterTest()構造方法設置好值了,而它們三個的值就來自于Collection
          /************************************************************************************************************/

          posted on 2014-12-23 00:07 順其自然EVO 閱讀(685) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西宁市| 滕州市| 广东省| 广灵县| 龙口市| 宜兰县| 清涧县| 齐齐哈尔市| 铁岭县| 山东省| 小金县| 武鸣县| 锦屏县| 遂宁市| 永寿县| 广汉市| 资兴市| 咸丰县| 维西| 恭城| 广南县| 泰兴市| 报价| 昌江| 尼木县| 新民市| 宜川县| 三门县| 日土县| 鄂尔多斯市| 张家口市| 蒙山县| 平定县| 闸北区| 毕节市| 甘肃省| 曲水县| 拜城县| 都安| 玛曲县| 乐亭县|