From Gossip@caterpillar

JUnit Gossip: 第一個 JUnit 測試

要進行測試,首先要設計測試案例(Test Case),一個案例是對程式給予假定條件,然後運行程式看看在給定的條件之下,是否符合預期結果。

在JUnit下,您可以繼承 TestCase 來撰寫測試案例,並定義您的測試方法,每一個測試方法是以testXXX()作為命名,一個例子如下所示:

  • MathToolTest.java
package onlyfun.caterpillar.test;

import onlyfun.caterpillar.MathTool;
import junit.framework.TestCase;

public class MathToolTest extends TestCase {
public void testGcd() {
assertEquals(5, MathTool.gcd(10, 5));
}

public static void main(String[] args) {
junit.textui.TestRunner.run(MathToolTest.class);
}
}

assertEquals()方法用來斷定您希望的預期結果與單元方法實際的傳回結果是否相同,如果不同則丟出例外,TestRunner會捕捉例外,並提取當中的相關訊息報告測試結果,這邊使用的是文字模式的TestRunner。

接下來根據測試案例撰寫實際的程式,首先試著讓測試案例能通過編譯:

  • MathTool.java
package onlyfun.caterpillar;

public class MathTool {
public static int gcd(int num1, int num2) {
return 0;
}
}

編譯完成程式之後,接著運行測試案例,您會得到以下的結果:
.F
Time: 0
There was 1 failure:
 1) testGcd(onlyfun.caterpillar.test.MathToolTest)
junit.framework.AssertionFailedError: expected:<5> but was:<0>
    at
onlyfun.caterpillar.test.MathToolTest.testGcd(MathToolTest.java:7)
    at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(
Unknown Source)
    at
nlyfun.caterpillar.test.MathToolTest.main(MathToolTest.java:11)

FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0


在測試驅動中,測試案例所回報的結果會是以測試失敗作為開始,您要一步步消除這些失敗的訊息,接下來我們根據測試案例,完成所設計的程式:
  • MathTool.java
package onlyfun.caterpillar;

public class MathTool {
public static int gcd(int num1, int num2) {
int r = 0;
while(num2 != 0) {
r = num1 % num2;
num1 = num2;
num2 = r;
}
return num1;
}
}

再次運行測試案例,您會得到以下的結果:
0 1 2  .
Time: 0

OK (1 test)


這次運行沒有問題,測試已經通過!