l

2013年3月21日 星期四

JUnit4的參數化測試案例(上)

Mar. 20 15:03~17:10

image

前一陣子Kay跟Teddy談到JUnit 4的一些新功能,回想起來好一陣子都沒有關注JUnit 4的發展,最近抽空看了一下,發現JUnit 4有支援了「參數化測試案例」這個Teddy好久以前就一直想要使用的功能。今天介紹一下JUnit 4參數化測試案例的使用方法。

鄉民甲:什麼是參數化測試案例?

先不要管參數化測試案例,你聽過氨粒嗎…XD。

參數化測試案例就是使用同一個測試案例,利用帶入不同參數的方式(控制輸入值),達到測試待測程式不同執行路徑的目的。如果還是看不懂等一下看範例就知道了。

 

使用Annotation

忘了從哪一版的JUnit開始就慢慢採用annotation作為擴充測試框架的一種機制。早期的JUnit規定測試案例(test method)命名方式一定要test開頭,例如testPrime(),後來只要在測試案例前面加上@Test這個annotation,測試案例要如何取名就沒有限制。JUnit 4也是利用annotation來支援參數化測試案例。

要支援參數化測試案例,會使用到兩個新的annotation:

  • @RunWith
  • @Parameters

請看範例:

螢幕快照 2013-03-20 下午4.49.48

@RunWith 這個annotation加在測試類別(test case)身上,它用來告訴JUnit要採用哪一個Test Runner去執行測試案例。所以@RunWith(value = Parameterized.class) 告訴JUnit請用Parameterized這個類別來執行測試案例。到JUnit的官方網站可以查到Parameterized是Runner的子類別。

螢幕快照 2013-03-20 下午4.29.48

以上都看不懂也沒關系,總之要實作參數化測試案例的第一步就是要在測試類別加上@RunWith(value = Parameterized.class)這個annotation。

***

接下來要準備測試參數,測試參數必須放在一個public static List[]裡面,以下面程式碼為例,準備了四組測試案例,分別是1, 2, 3, 4挑眉質疑。在這組測試上面加上@Parameters這個annotation,這樣子JUnit就知道這裡面的資料要當作測試用的參數。

螢幕快照 2013-03-20 下午4.51.19

 

將測試參數對應到instance variable

看到這邊鄉民們可能會想,要如何在測試案例中逐一使用剛剛設定好的測試參數呢?答案很簡單,為每一組測試案例宣告一個instance variable,然後透過constructor設定這個instance variable的值。如下圖所示:

螢幕快照 2013-03-20 下午4.55.55

之後JUnit執行這個測試類別裡面有所有測試案例(測試方法)時,便會自動將測試參數的值(上一個步驟所宣告的public static List[])逐一設定給mArgument這個instance variable。接下來鄉民們就可以在測試案例中使用mArgument當作測試資料。

 

測試案例與執行結果

以下兩個例子單純把mArgument的值給印出來,看看是否執行這個測試類別之後,會印出1,2,3,4。

螢幕快照 2013-03-20 下午5.06.15

 

從Eclipse中執行這個測試類別:

螢幕快照 2013-03-20 下午5.09.43

 

以下是執行結果,由此可知每一個測試案例會被執行N次(N等於測試參數的個數)。

螢幕快照 2013-03-20 下午5.08.16

***

看到這邊鄉民們應該了解參數化測試案例的寫法,但是一組測試資料裡面只有一筆資料的這種「參數」其實派不上什麼用場,因為在寫測試案例時,每一個assertion至少也要準備expected result與一組餵給待測程式的參數。也就是說,每一組測試參數通常都需要兩筆資料,例如{1, 5}或是{true, 7}。至於在一組參數中設定多筆測試資料下集再繼續介紹。

***

友藏內心獨白:這一集也寫太久了吧不要告訴別人

沒有留言:

張貼留言