使用JUnit可以大量減少Java代碼中程序錯誤的個數(shù),JUnit是一種流行的單元測試框架,用于在發(fā)布代碼之前對其進(jìn)行單元測試,F(xiàn)在讓我們來詳細(xì)研究如何使用諸如JUnit、Ant和Oracle9i JDeveloper等工具來編寫和運(yùn)行單元測試。
為什么使用JUnit?
多數(shù)開發(fā)人員都同意在發(fā)布代碼之前應(yīng)當(dāng)對其進(jìn)行測試,并利用工具進(jìn)行回歸(regression)測試。做這項(xiàng)工作的一個簡單方法是在所有Java類中以main()方法實(shí)施測試。例如,假設(shè)使用ISO格式(這意味著有一個以這一格式作為參數(shù)的構(gòu)造器和返回一個格式化的ISO字符串的toString()方法)以及一個GMT時區(qū)來編寫一個Date的子類。清單1 是這個類的一個簡單實(shí)現(xiàn)。
不過,這種測試方法并不需要單元測試限定語(qualifier),原因如下:
在一個類中進(jìn)行測試的小單元是方法,你應(yīng)當(dāng)對每個方法進(jìn)行單獨(dú)測試,以準(zhǔn)確地找出哪些方法工作正常,哪些方法工作不正常。
即使前面的測試失敗,也應(yīng)當(dāng)對各個方法進(jìn)行測試。在此實(shí)施中,如果單個測試失敗,后面的測試將根本不會運(yùn)行。這意味著你不會知道不良代碼在你的實(shí)施中所占的百分比。
測試代碼會出現(xiàn)在生成的類中。這在類的大小方面可能不是什么問題,但卻可能會成為安全性因素之一:例如,如果你的測試嵌入了數(shù)據(jù)庫連接密碼,那么這一信息將很容易用于已發(fā)布的類中。
沒有框架可以自動啟動這一測試,你必須編寫一個腳本來啟動每一個測試。
在編寫一個報告時,你必須編寫自己的實(shí)現(xiàn),并定義規(guī)則,以方便地報告錯誤。
JUnit框架是設(shè)計用來解決這些問題的。這一框架主要是所有測試實(shí)例(稱為"TestCase")的一個父類,并提供工具來運(yùn)行所編寫的測試、生成報告及定義測試包(test suite)。
讓我們?yōu)镮soDate類編寫一個測試:這個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());
}
}
本例中要注意的重點(diǎn)是已經(jīng)編寫了一個用于測試的獨(dú)立類,因此可以對這些文件進(jìn)行過濾,以避免將這一代碼嵌入到將要發(fā)布的文檔中。另外,本例還為你希望在你的代碼中測試的每個方法編寫了一個專用測試方法,因此你將確切地知道需要對哪些方法進(jìn)行測試、哪些方法工作正常以及哪些方法工作不正常。如果在編寫實(shí)施文檔之前已經(jīng)編寫了該測試,你可以利用它來衡量工作的進(jìn)展情況。
安裝并運(yùn)行JUnit
要運(yùn)行此示例測試實(shí)例,必須首先下載并安裝JUnit。JUnit的新版本可以在JUnit的網(wǎng)站www.junit.org免費(fèi)下載。該軟件包很。s400KB),但其中包括了源代碼和文檔。要安裝此程序,應(yīng)首先對該軟件包進(jìn)行解壓縮(junitxxx.zip)。它將創(chuàng)建一個目錄(junitxxx),在此目錄下有文檔(在doc目錄中)、框架的應(yīng)用編程接口(API)文檔(在javadoc目錄中)、運(yùn)行程序的庫文件(junit.jar)以及示例測試實(shí)例(在junit目錄中)。截至我撰寫本文時,JUnit的新版本為3.8.1,我是在此版本上對示例進(jìn)行測試的。