2008年11月26日 星期三

TestDriven with JUnit


一般程式開發人員的習慣是撰寫完一段功能後再加以測試, 也就是說先由開發者角度去創建系統。但測試驅動開發(Test-Driven-Development)卻是從使用的角度開始, 反向讓開發人員回頭撰寫正確執行的程式。

----------------- 何謂測試驅動開發TDD -----------------

你可能會覺得連內容都沒有要怎麼測試呢?沒錯, 測試驅動的用意即是如此!
例如我希望有一個功能是將輸入的兩個數字相加。那測試端就必須事先模擬ex: a = 1, b = 2 。期望值為兩數相加將會等於3, 假設我的方法沒有將處理結果等於3即為錯誤。
一開始主程式的方法只是一個框架:

public int add(int a, int b) {  
     // 尚無任何內容  
     return 0;  
}

測試框架則是已經寫完使用情形:

public int testAdd(){  
     int a = 1;  
     int b = 2;  
     int expect = a + b;     // 期望值  
     if(expect == add(a, b)){  
          System.out.println("Testing success");  
     }else{  
          System.out.println("Testing failed");  
     }  
}

到目前為止測試框架的結果絕對都是Testing failed, 因為主程式add還沒有計算的過程。
現在讓我們回過頭來編寫 add 方法:

public int add(int a, int b){  
     return a + b;  
}

再去測試一次得到Testing success, 大功告成!!
所以測試驅動開發能讓開發者模擬任何情況, 例如最常見的輸入null值等等作相對應的處理, 並且強迫設計程式時,去考慮到物件的低耦合。
上述的範例只是告知各位測試驅動的原理, 事實上 JUnit 並不需要把測試環境寫在同一個類別中, 而是獨立出來的, 所以開發者可以放心使用, 不必擔心程式碼到後期很難管理。

----------------- JUnit簡介 -----------------

JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立並包括了以下的特性:

1. 對預期結果作斷言
2. 提供測試裝備的生成與銷毀
3. 易於組織與執行測試
4. 圖型與文字介面的測試器

來自JUnit的體驗對測試驅動開發是很重要的,所以一些 JUnit知識經常 和測試驅動開發的討論融合在一起。可以參考Kent Beck的 《Test-Driven Development: By Example》一書(有中文版)。

JUnit 的測試主要由 TestCase、TestSuit 與 TestRunner 三部份架構起來。

詳細請參閱良葛格學習筆記:
TestSuite: http://caterpillar.onlyfun.net/Gossip/JUnit/TestSuite.htm
TestCase: http://caterpillar.onlyfun.net/Gossip/JUnit/TestCase.htm
Failure、Error: http://caterpillar.onlyfun.net/Gossip/JUnit/FailureError.htm

----------------- 相關教學 -----------------

以下網址收錄了詳細的影音教學, 而Eclipse 3.1以後即預設支援JUnit test case, 所以使用Eclipse的朋友們可以事半功倍的來實現測試框架。

JUnit 官網: http://www.junit.org/
影片教學(with Eclipse & NetBeans): http://www.blogjava.net/beansoft/archive/2007/10/29/156650.html
文字教學: http://caterpillar.onlyfun.net/Gossip/JUnit/JUnitGossip.htm

沒有留言:

張貼留言