標籤:
首先來複習一下幾個重要知識點,然後接著進行一些介紹。在上一篇文章中,我曾經貼過下面這張圖片:
在Which method stubs would you like to create?這裡,現在結合4個標註的含義來說明一下:
@BeforeClass 標註的方法會在類載入的時候執行一次,且僅此一次,該方法必須是public和static的
@AfterClass 標註的方法會在類銷毀的時候執行一次,且僅此一次,該方法必須是public和static的
@Before 標註的方法會在每個測試方法執行前先執行一次
@After 標註的方法會在每個測試方法執行結束後執行一次
以上四個標註,對應了那個勾選列表中的四個方法,可以在建立測試類別時根據具體情況進行勾選。
在測試過程中,可能需要針對一個方法的不同臨界值進行多組資料的測試。下面給出這種情況下的測試方法:
在上一遍文章中的例子 中,Calculator類的square方法需要針對正數、負數、零3種情況進行測試。所以我們如下進行,首先在Calculator類上右鍵new一 個JUint Test Case,起名為CalculatorSquareTest,然後該類的代碼修改如下:
1 package org.logback.test; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 import java.util.Collection; 7 8 import org.junit.Before; 9 import org.junit.Test;10 import org.junit.runner.RunWith;11 import org.junit.runners.Parameterized;12 import org.junit.runners.Parameterized.Parameters;13 14 @RunWith(Parameterized. class )15 public class CalculatorSquareTest {16 17 private static Calculator example = new Calculator(); 18 19 private int param;20 21 private int result;22 23 @Parameters//定義測試資料集合,前者param後者result24 public static Collection data(){25 return Arrays.asList(new Object[][]{26 {2,4},27 {0,0},28 {-3,9},29 });30 }31 32 @Before33 public void setUp() throws Exception {34 example.clear();35 }36 37 @Test38 public void testSquare() {39 example.square(param);40 assertEquals(result, example.getResult());41 }42 43 //建構函式,對變數進行初始化,注意參數順序應與定義的測試集合的參數順序一致44 public CalculatorSquareTest(int param,int result){45 this.param = param;46 this.result = result;47 }48 49 }
14行設定了本測試類別的運行器為Parameterized.class,因為此類需要多組資料,所以不能採用預設的運行器。
23-30行是定義測試資料集合,此處的2元組資料的順序要統一,並且與建構函式的參數順序要一致。
44-47行是建構函式,通過定義的資料集合和建構函式,將要測試的情況傳遞給測試類別,然後進行測試。
也就是說,執行了3次該測試類別,依次採用了資料集合中的資料。此例中資料集合的順序順序為{處理值,預期處理結果}。
結果如下:
可以看到runs那裡是3/3。
OK,此時我們的測試類別數量就已經上升為2個了,如果分別運行2個測試類別再觀察結果可能比較麻煩。或者有人覺得這還不算什麼,那要是有10個測試類別呢?所以就引出了打包測試的概念,我們可以通過JUnit提供的機制,一次性把之前的2個測試類別都執行了。
在Calculator類上右鍵new一個JUnit Test Case,方法處什麼都不勾選,然後點擊Finish。將代碼改為如下:
1 package org.logback.test; 2 3 import static org.junit.Assert.*; 4 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.junit.runners.Suite; 8 9 @RunWith(Suite.class)10 @Suite.SuiteClasses({11 CalculatorSquareTest.class,12 CalculatorTest.class13 })14 public class CalculatorAllTest {15 }
9行指定了此測試類別的運行器
10-13行指定了要同時運行哪些測試類別
該測試類別並無實際實現
下面只要將此類run as JUnit Test即可,得到結果:
可以發現,我們上一遍文章的測試類別,和這篇文章的測試類別都同時執行了,並且列出了詳細結果。
以上就是我對於JUnit的研究結果,我感覺一般的工作這些技巧就可以應付了,當然如果哪位Geek有更進階方便的用法也歡迎分享。
java知識積累——單元測試和JUnit(二)