這里setUp和tearDown方法沒什么好說的,是執(zhí)行了對(duì)book對(duì)象的初始化和清理,不過testId和testName需要說明一下。前者是在對(duì)book的id屬性進(jìn)行測(cè)試,首先賦值為”001”,然后使用Assert的assertEquals方法查看id屬性中存放的值是否是期待的值,由于我的期待值也是”001”,所以執(zhí)行后這個(gè)用例應(yīng)該是成功的;后者則是對(duì)book的name屬性進(jìn)行測(cè)試,也是首先賦值為”ASP”,然后使用Assert的assertEquals方法查看其值是否是期待的,由于我特意將期待值設(shè)定為根本不可能的”JSP”,因此這個(gè)用例執(zhí)行后會(huì)出現(xiàn)一個(gè)錯(cuò)誤。但請(qǐng)注意,由于我是特意要讓測(cè)試出現(xiàn)錯(cuò)誤,所以將期待值設(shè)定成了不可能的值,如果你是測(cè)試人員,請(qǐng)千萬不要這么做,否則如果別的地方導(dǎo)致了錯(cuò)誤,很容易給自己造成不必要的麻煩。
下面簡單介紹一下上邊用到的靜態(tài)類junit.framework.Assert。該類主要包含8個(gè)方法:
1.a(chǎn)ssertEquals()方法,用來查看對(duì)象中存的值是否是期待的值,與字符串比較中使用的equals()方法類似;
2.a(chǎn)ssertFalse()和assertTrue()方法,用來查看變量是是否為false或true,如果assertFalse()查看的變量的值是false則測(cè)試成功,如果是true則失敗,assertTrue()與之相反;
3.a(chǎn)ssertSame()和assertNotSame()方法,用來比較兩個(gè)對(duì)象的引用是否相等和不相等,類似于通過“==”和“!=”比較兩個(gè)對(duì)象;
4.a(chǎn)ssertNull()和assertNotNull()方法,用來查看對(duì)象是否為空和不為空;
5.fail ()方法,意為失敗,用來拋出錯(cuò)誤。我個(gè)人認(rèn)為有兩個(gè)用途:首先是在測(cè)試驅(qū)動(dòng)開發(fā)中,由于測(cè)試用例都是在被測(cè)試的類之前編寫,而寫成時(shí)又不清楚其正確與否,此時(shí)可以使用fail方法拋出錯(cuò)誤進(jìn)行模擬;其次是拋出意外的錯(cuò)誤,比如要測(cè)試的內(nèi)容是從數(shù)據(jù)庫中讀取的數(shù)據(jù)是否正確,而導(dǎo)致錯(cuò)誤的原因卻是數(shù)據(jù)庫連接失敗。
五、運(yùn)行BookTest
編寫好BookTest后,可以運(yùn)行了。請(qǐng)?jiān)?ldquo;項(xiàng)目”欄中選中BookTest,點(diǎn)擊鼠標(biāo)右鍵,選擇“運(yùn)行文件”,測(cè)試信息會(huì)從“輸出”窗口輸出:
六、測(cè)試套件
當(dāng)有多個(gè)測(cè)試類需要一次性進(jìn)行測(cè)試時(shí),可以使用測(cè)試套件來完成這項(xiàng)工作。
在NetBeans中,點(diǎn)擊“文件”->“新建文件”,打開“新建文件”對(duì)話框:
確保“項(xiàng)目”選擇的是JUnitTest,然后在“類別”中選中JUnit類,在“文件類型”中選中測(cè)試套件,點(diǎn)擊“下一個(gè)”,進(jìn)入下一窗口:
修改“類名”為AllTests,點(diǎn)擊“完成”,然后修改代碼如下:
package net.zheng.junit.test;
import junit.framework.*;
public class AllTests extends TestCase {
public AllTests(String testName) {
super(testName);
}
public static Test suite() {
TestSuite ts= new TestSuite("AllTests");
ts.addTestSuite(BookTest.class);
return ts;
}
}
其中TestSuite是用來組織測(cè)試類的,通過其addTestSuite()方法將測(cè)試類添加到ts對(duì)象中,凡是添加到ts中的測(cè)試類都將在運(yùn)行文件時(shí)被執(zhí)行。此外,您也可以在定義ts對(duì)象時(shí)利用其構(gòu)造函數(shù)將測(cè)試類添加給ts對(duì)象,例如:
TestSuite ts = new TestSuite(BookTest.class);
這并不會(huì)影響到后續(xù)使用addTestSuite()方法。測(cè)試套件的運(yùn)行方法與之前一樣。
此外,JUnit自身也提供了運(yùn)行測(cè)試的環(huán)境,但需要在NetBeans中做一些改動(dòng),所以不作詳細(xì)介紹了,這里只將代碼給出:
package net.zheng.junit.test;
import junit.framework.*;
public class Test {
public static void main(String[] args) {
//使用TestSuite組裝測(cè)試類
TestSuite ts = new TestSuite();
ts.addTestSuite(TestBook.class);
//textui,命令行方式
junit.textui.TestRunner.run(ts);
//swingui,Swing方式
//junit.swingui.TestRunner.run(ts.getClass());
//awtui,AWT方式
//junit.awtui.TestRunner.run(ts.getClass());
}
}
七、小結(jié)
其實(shí)JUnit上手很容易,遠(yuǎn)比想象的要簡單的多,但我覺得如何編寫測(cè)試類是很需要經(jīng)驗(yàn)的,因?yàn)樵S多時(shí)候,測(cè)試一個(gè)用例,但涉及到可能不止一個(gè)類;而有些時(shí)候,一個(gè)類可能是做為工具使用,里邊涉及很多內(nèi)容,那么測(cè)試時(shí)是否還是只編寫一個(gè)測(cè)試類呢?關(guān)于這個(gè)話題,我想應(yīng)該是仁者見仁、智者見智的,其實(shí)這才是測(cè)試的難題所在。