JUnit中的測試套件和參數化測試
JUnit4.x的測試運行器
我們也可以定制自己的運行器,所有的運行器都繼承自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) 編輯 收藏 所屬分類: 測試學習專欄