From Gossip@caterpillar

JUnit Gossip: 測試驅動

大多數的程式設計人員,都習慣先將程式寫好,運行它,然後觀看結果是否正確,懂得在設計好程式後,撰寫專門的測試程式的設計人員已經算是難能可貴。

測試驅動開發(Test-Driven Development, TDD)鼓勵您在撰寫程式之前,就先將測試程式完成,之後再根據測試程式的要求,逐步實現您所要設計的程式。

舉個例子來說,今天您要設計一個計算最大公因數的單元,在測試驅動開發中,您會先撰寫下面的測試程式:

  • UnitTestDemo.java
package onlyfun.caterpillar.test;

import onlyfun.caterpillar.MathTool;

public class UnitTestDemo {
public static void main(String[] args) {
if(MathTool.gcd(10, 5) == 5) {
System.out.println("GCD Test OK!");
}
else {
System.out.println("GCD Test Fail!");
}
}
}

您第一個所想到的是,這個程式有什麼作用?根本不能編譯!其實要讓這個程式能夠編譯並不是難事,先寫個空殼就可以了:
  • MathTool.java
package onlyfun.caterpillar;

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

現在程式可以編譯了,當然,當您運行測試程式時,只會一直顯示"GCD Test Fail!"的訊息,為了通過測試,您再來依測試程式的設計完成最大公因數的演算內容:
  • 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;
}
}

現在編譯測試程式,然後運行它,您就可以得到"GCD Test OK!"的訊息,您已經通過測試了。

先寫測試的好處是,測試程式本身即是您的設計藍圖,您依據這個藍圖撰寫您的單元,為了符合測試程式的要求,您的單元必須設計的可以測試,這迫使您設計程式時,考慮到單元的低耦合。