1. 程式人生 > >Java單元測試工具:JUnit4(四)——JUnit測試套件使用及引數化設定

Java單元測試工具:JUnit4(四)——JUnit測試套件使用及引數化設定

(四)JUnit測試套件使用及引數化設定

        這篇筆記記錄JUnit測試套件的使用,即批量執行測試類;以及JUnit中的引數化設定。         @RunWith
  當類被@RunWith註解修飾,或者類繼承了一個被該註解修飾的類,JUnit將會使用這個註解所指明的執行器(runner)來執行測試,而不是JUnit預設的執行器。

1.JUnit測試套件

        如果在測試類不端增加的情況下,如何執行所有的單元測試程式碼類?一個個測試類的執行嗎?顯然繁瑣且費勁。
        將要執行的測試類整合在我們的測試套件中,比如一個系統功能對應一個測試套件,一個測試套件中包含多個測試類,每次測試系統功能時,只要執行一次測試套件就可以了。

1.1 測試類及測試套件程式碼

        新建3個測試任務類: [java]   view plain  copy
  1. package jtzen9.util;  
  2. import org.junit.Test;  
  3. public class TaskTest1 {  
  4.   
  5.     @Test  
  6.     public void test() {  
  7.         System.out.println("this is TaskTest1...");  
  8.     }  
  9.   
  10. }  
  11.   
  12.   
  13. package jtzen9.util;  
  14. import org.junit.Test;  
  15. public class TaskTest2 {  
  16.   
  17.     @Test  
  18.     public void test() {  
  19.         System.out.println("this is TaskTest2...");  
  20.     }  
  21.   
  22. }  
  23.   
  24.   
  25. package jtzen9.util;  
  26. import org.junit.Test;  
  27. public class TaskTest3 {  
  28.   
  29.     @Test  
  30.     public void test() {  
  31.         System.out.println("this is TaskTest3...");  
  32.     }  
  33. }  
        新建一個套件類,包含以上三個任務類: [java]   view plain  copy
  1. package jtzen9.util;  
  2.   
  3. import org.junit.runner.RunWith;  
  4. import org.junit.runners.Suite;  
  5.   
  6. @RunWith(Suite.class)  
  7. @Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})  
  8. public class SuiteTest {  
  9.     /* 
  10.      * 1.測試套件就是組織測試類一起執行的 
  11.      *  
  12.      * 寫一個作為測試套件的入口類,這個類裡不包含其他的方法 
  13.      * 更改測試執行器Suite.class 
  14.      * 將要測試的類作為陣列傳入到Suite.SuiteClasses({}) 
  15.      */  
  16. }  
執行結果:

1.2 說明

        ①使用@RunWith註解,修改測試執行器。例如@RunWith(Suite.class),這個類就成為測試套件的入口類。         ②@Suite.SuiteClasses()中放入測試套件的測試類,以陣列的形式{class1,class2,......}作為引數

2.JUnit引數化設定

        如果測試程式碼大同小異,程式碼結構都是相同的,不同的只是測試的資料和預期值,那麼有沒有更好的辦法將相同的程式碼結構提取出來,提高程式碼的重用度呢?
        解決:進行引數化測試。         步驟:   ①要進行引數化測試,需要在類上面指定如下的執行器:@RunWith (Parameterized.class)
  ②然後,在提供資料的方法上加上一個@Parameters註解,這個方法必須是靜態static的,並且返回一個集合Collection。
  ③在測試類的構造方法中為各個引數賦值,(構造方法是由JUnit呼叫的),最後編寫測試類,它會根據引數的組數來執行測試多次。

2.1 程式碼:

[java]   view plain  copy
  1. package jtzen9.util;  
  2.   
  3. import static org.junit.Assert.*;  
  4.   
  5. import java.util.Arrays;  
  6. import java.util.Collection;  
  7.   
  8. import org.junit.Test;  
  9. import org.junit.runner.RunWith;  
  10. import org.junit.runners.Parameterized;  
  11. import org.junit.runners.Parameterized.Parameters;  
  12.   
  13. @RunWith(Parameterized.class)   //1.更改預設的測試執行器為RunWith(Parameterized.class)  
  14. public class ParameterTest {  
  15.       
  16.     //2.宣告變數存放預期值和測試資料  
  17.     int expected =0;  
  18.     int input1 = 0;  
  19.     int input2 = 0;  
  20.       
  21.     //3.宣告一個返回值 為Collection的公共靜態方法,並使用@Parameters進行修飾  
  22.     @Parameters  
  23.     public static Collection<Object[]><object> data() {  
  24.         return Arrays.asList(new Object[][]{  
  25.                 {3,1,2},  
  26.                 {4,2,2}  
  27.         }) ;  
  28.     }  
  29.       
  30.     //4.為測試類宣告一個帶有引數的公共建構函式,並在其中為之宣告變數賦值  
  31.     public ParameterTest(int expected,int input1,int input2) {  
  32.         this.expected = expected;  
  33.         this.input1 = input1;  
  34.         this.input2 = input2;  
  35.     }  
  36.       
  37.     //5.執行測試方法,即可完成對多組資料的測試  
  38.     @Test  
  39.     public void testAdd() {  
  40.         assertEquals(expected, new Calculate().add(input1, input2));  
  41.     }  
  42.   
  43. }</object>  

2.2 執行結果




看了慕課網的JUnit視訊教程: http://www.imooc.com/learn/356,總結筆記。

結束語:

        以前測試自己寫的程式碼都是新建一個main方法,然後sysout輸出控制檯觀察結果,繁瑣又麻煩!學習了JUnit測試之後,感覺方便了很多,當然JUnit還有很多方法需要在使用的過程中不斷的總結。