使用JUnit可以大量減少Java代碼中程序錯誤的個數,JUnit是一種流行的單元測試框架,用于在發布代碼之前對其進行單元測試。現在讓我們來詳細研究如何使用諸如JUnit、Ant和Oracle9i JDeveloper等工具來編寫和運行單元測試。
為什么使用JUnit?
多數開發人員都同意在發布代碼之前應當對其進行測試,并利用工具進行回歸(regression)測試。做這項工作的一個簡單方法是在所有Java類中以main()方法實施測試。例如,假設使用ISO格式(這意味著有一個以這一格式作為參數的構造器和返回一個格式化的ISO字符串的toString()方法)以及一個GMT時區來編寫一個Date的子類。清單1 是這個類的一個簡單實現。
不過,這種測試方法并不需要單元測試限定語(qualifier),原因如下:
在一個類中進行測試的小單元是方法,你應當對每個方法進行單獨測試,以準確地找出哪些方法工作正常,哪些方法工作不正常。
即使前面的測試失敗,也應當對各個方法進行測試。在此實施中,如果單個測試失敗,后面的測試將根本不會運行。這意味著你不會知道不良代碼在你的實施中所占的百分比。
測試代碼會出現在生成的類中。這在類的大小方面可能不是什么問題,但卻可能會成為安全性因素之一:例如,如果你的測試嵌入了數據庫連接密碼,那么這一信息將很容易用于已發布的類中。
沒有框架可以自動啟動這一測試,你必須編寫一個腳本來啟動每一個測試。
在編寫一個報告時,你必須編寫自己的實現,并定義規則,以方便地報告錯誤。
JUnit框架是設計用來解決這些問題的。這一框架主要是所有測試實例(稱為"TestCase")的一個父類,并提供工具來運行所編寫的測試、生成報告及定義測試包(test suite)。
讓我們為IsoDate類編寫一個測試:這個IsoDateTest類類似于:
import java.text.ParseException;
import junit.framework.TestCase;
/**
* Test case for <code>IsoDate</code>.
*/
public class IsoDateTest extends TestCase {
public void testIsoDate() throws
Exception {
IsoDate epoch=new IsoDate(
"1970-01-01 00:00:00 GMT");
assertEquals(0,epoch.getTime());
IsoDate eon=new IsoDate(
"2001-09-09 01:46:40 GMT");
assertEquals(
1000000000L*1000,eon.getTime());
}
public void testToString() throws
ParseException {
IsoDate epoch=new IsoDate(0);
assertEquals("1970-01-01
00:00:00 GMT",epoch.toString());
IsoDate eon=new IsoDate(
1000000000L*1000);
assertEquals("2001-09-09
01:46:40 GMT",eon.toString());
}
}
本例中要注意的重點是已經編寫了一個用于測試的獨立類,因此可以對這些文件進行過濾,以避免將這一代碼嵌入到將要發布的文檔中。另外,本例還為你希望在你的代碼中測試的每個方法編寫了一個專用測試方法,因此你將確切地知道需要對哪些方法進行測試、哪些方法工作正常以及哪些方法工作不正常。如果在編寫實施文檔之前已經編寫了該測試,你可以利用它來衡量工作的進展情況。
安裝并運行JUnit
要運行此示例測試實例,必須首先下載并安裝JUnit。JUnit的新版本可以在JUnit的網站www.junit.org免費下載。該軟件包很小(約400KB),但其中包括了源代碼和文檔。要安裝此程序,應首先對該軟件包進行解壓縮(junitxxx.zip)。它將創建一個目錄(junitxxx),在此目錄下有文檔(在doc目錄中)、框架的應用編程接口(API)文檔(在javadoc目錄中)、運行程序的庫文件(junit.jar)以及示例測試實例(在junit目錄中)。截至我撰寫本文時,JUnit的新版本為3.8.1,我是在此版本上對示例進行測試的。