使用JUnit時,您主要都是透過繼承TestCase類別來撰寫測試案例,預設上您可以使用testXXX() 名稱來撰寫單元測試。
在測試一個單元方法時,有時您會需要給它一些物件作為運行時的資料,例如您撰寫下面這個測試案例:
MaxMinTest.java
1 package onlyfun.caterpillar.test;
2
3 import onlyfun.caterpillar.MaxMinTool;
4 import junit.framework.TestCase;
5
6 public class MaxMinTest extends TestCase {
7 public void testMax() {
8 int[] arr = {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
9 assertEquals(5, MaxMinTool.getMax(arr));
10 }
11
12 public void testMin() {
13 int[] arr = {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
14 assertEquals(-5, MaxMinTool.getMin(arr));
15 }
16
17 public static void main(String[] args) {
18 junit.swingui.TestRunner.run(MaxMinTest.class);
19 }
20 }
您將設計的MaxMinTool包括靜態方法getMax()與getMin(),當您給它一個整數陣列,它們將個別傳回陣列中的最大值與最小值,顯然
的,您所準備的陣列重複出現在兩個單元測試之中,重複的程式碼在設計中可以減少就儘量減少,在這兩個單元測試中,整數陣列的準備是單元方法所需要的資源,
我們稱之為fixture,也就是一個測試時所需要的資源集合。
fixture必須與上下文(Context)無關,也就是與程式執行前後無關,這樣才符合單元測試的意涵,為此,通常將所需的fixture撰寫在單元方法之中,如此在單元測試開始時創建fixture,並於結束後銷毀fixture。
然而對於重複出現在各個單元測試中的fixture,您可以集中加以管理,您可以在繼承TestCase之後,重新定義
setUp()與
tearDown()方法,將數個單元測試所需要的fixture在setUp()中創建,並在tearDown()中銷毀,例如:
MaxMinTest.java
1 package onlyfun.caterpillar.test;
2
3 import onlyfun.caterpillar.MaxMinTool;
4 import junit.framework.TestCase;
5
6 public class MaxMinTest extends TestCase {
7 private int[] arr;
8
9 protected void setUp() throws Exception {
10 super.setUp();
11 arr = new int[]{-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
12 }
13
14 protected void tearDown() throws Exception {
15 super.tearDown();
16 arr = null;
17 }
18
19 public void testMax() {
20 assertEquals(5, MaxMinTool.getMax(arr));
21 }
22
23 public void testMin() {
24 assertEquals(-5, MaxMinTool.getMin(arr));
25 }
26
27 public static void main(String[] args) {
28 junit.swingui.TestRunner.run(MaxMinTest.class);
29 }
30 }
setUp()方法會在每一個單元測試testXXX()方法開始前被呼叫,因而整數陣列會被建立,而tearDown()會在每一個單元測試
testXXX()方法結束後被呼叫,因而整數陣列參考名稱將會參考至null,如此一來,您可以將fixture的管理集中在
setUp()與tearDown()方法之後。
最後按照測試案例的內容,您完成MaxMinTool類別:
MaxMinTool.java
1 package onlyfun.caterpillar;
2
3 public class MaxMinTool {
4 public static int getMax(int[] arr) {
5 int max = Integer.MIN_VALUE;
6
7 for(int i = 0; i < arr.length; i++) {
8 if(arr[i] > max)
9 max = arr[i];
10 }
11
12 return max;
13 }
14
15 public static int getMin(int[] arr) {
16 int min = Integer.MAX_VALUE;
17
18 for(int i = 0; i < arr.length; i++) {
19 if(arr[i] < min)
20 min = arr[i];
21 }
22
23 return min;
24 }
25 }
Swing介面的TestRunner在測試失敗時會顯示紅色的棒子,而在測試成功後會顯示綠色的棒子,而
"Keep the bar green to keep the code clean." 正是JUnit的名言,也是測試的最終目的。