版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第11章 單元測(cè)試JUnit本章學(xué)習(xí)目標(biāo)本章要達(dá)到的主要目標(biāo):理解單元測(cè)試的概念;了解JUnit單元測(cè)試基礎(chǔ);熟悉JUnit 中常用的類;掌握Eclipse中JUnit 的配置;了解在Eclipse中使用JUnit 進(jìn)行測(cè)試。軟件測(cè)試背景在軟件開發(fā)過程中,除了調(diào)試之外,還需要進(jìn)行測(cè)試。調(diào)試和測(cè)試是不同的概念,調(diào)試是對(duì)成品進(jìn)行試運(yùn)行,而測(cè)試則是在組裝成成品之前,利用一些工具,參照某些標(biāo)準(zhǔn),對(duì)零部件進(jìn)行檢測(cè)。在Java開發(fā)中,使用率最高的測(cè)試工具是JUnit。JUnit背景JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個(gè)回歸測(cè)試框架(regression testing
2、framework),供Java開發(fā)人員編寫單元測(cè)試之用。JUnit測(cè)試是程序員測(cè)試,即所謂白盒測(cè)試,因?yàn)槌绦騿T知道被測(cè)試的軟件如何(How)完成功能和完成什么樣(What)的功能。JUnit本質(zhì)上是一套框架,即開發(fā)者制定了一套條條框框,遵循要求編寫測(cè)試代碼,如繼承某個(gè)類,實(shí)現(xiàn)某個(gè)接口,就可以用JUnit進(jìn)行自動(dòng)測(cè)試了。由于JUnit相對(duì)獨(dú)立于所編寫的代碼,測(cè)試代碼的編寫可以先于實(shí)現(xiàn)代碼的編寫,使得“極限開發(fā)”中推崇的“test first design”的實(shí)現(xiàn)有了現(xiàn)成的手段:用JUnit寫測(cè)試代碼,寫實(shí)現(xiàn)代碼,運(yùn)行測(cè)試,測(cè)試失敗,修改實(shí)現(xiàn)代碼,再運(yùn)行測(cè)試,直到測(cè)試成功。以后對(duì)代碼的修改和優(yōu)化
3、,運(yùn)行測(cè)試成功,則修改成功。JUnit簡介JUnit是一個(gè)開源的java單元測(cè)試框架。正如:“麻雀雖小,五臟俱全?!保琂Unit功能非常強(qiáng)大:(1)提供的API可以讓用戶寫出測(cè)試結(jié)果明確的可重用單元測(cè)試用例。(2)提供了三種方式來顯示用戶的測(cè)試結(jié)果,而且還可以擴(kuò)展。(3)提供了單元測(cè)試用例成批運(yùn)行的功能。(4)超輕量級(jí)而且使用簡單,沒有商業(yè)性的欺騙和無用的向?qū)?。?)整個(gè)框架設(shè)計(jì)良好,易擴(kuò)展。對(duì)不同性質(zhì)的被測(cè)對(duì)象,如Class, Jsp, Servlet, Ejb等,JUnit有不同的支持方式。本節(jié)僅以Class測(cè)試為例。JUnit和Eclipse的關(guān)系前面提到了JUnit的作者Erich G
4、amma,他同時(shí)還負(fù)責(zé)了Eclipse的開發(fā),包括JFace的開發(fā)和JDT中一些工具的開發(fā)。Kent Beck則是極限開發(fā)的倡導(dǎo)者,Eclipse中的不少開發(fā)工具都體現(xiàn)了極限開發(fā)的思想。Erich Gamma和Kent Beck在Eclipse項(xiàng)目的早期,寫了多本關(guān)于Eclipse的圖書,推動(dòng)了Eclipse的普及。Eclipse具有一個(gè)JUnit插件,這個(gè)插件已經(jīng)包含在JDT中,實(shí)現(xiàn)了JUnit的GUI界面。這個(gè)界面由JUnit視圖實(shí)現(xiàn)。JUnit配置由于Eclipse中集成了JUnit,所以不必下載,如果想要最新的JUnit類庫可以在互聯(lián)網(wǎng)上下載,之后在Eclipse構(gòu)建路徑中添加JUni
5、t類庫即可。下面介紹一下Eclipse中如何配置JUnit。(1)右鍵單擊項(xiàng)目“WebApplication”,選擇“Build Path”“Configure Build Path”菜單命令,彈出構(gòu)建路徑對(duì)話框,選擇“Libraries”選項(xiàng),如圖所示。JUnit配置(2)單擊“Add External JARs”可以添加額外的JUnit類庫。單擊“Add Library”添加Eclipse中自帶的JUnit類庫,如圖所示。JUnit配置(3)選擇“Junit”,單擊“Next”按鈕,出現(xiàn)添加類庫對(duì)話框,在“JUnit library version”一欄中有“JUnit 3”和“JUnit
6、 4”兩個(gè)選項(xiàng),本例中選擇“JUnit 4”如圖所示。JUnit配置(4)單擊“Finish”按鈕,完成JUnit類庫的添加。如圖所示,JUnit類庫已經(jīng)加入當(dāng)前項(xiàng)目中了。JUnit配置(5)單擊“OK”按鈕完成。此時(shí)在包資源管理器視圖(Package Explorer)中可以看到JUnit類庫信息,如圖所示。準(zhǔn)備要測(cè)試的類例如,在項(xiàng)目中建立一個(gè)新的類Money。新建單元測(cè)試一個(gè)單元測(cè)試用例也是一個(gè)類。往往對(duì)應(yīng)一個(gè)特定的待測(cè)類。在JDT中建立單元測(cè)試是非常簡單的。輸入測(cè)試代碼下面試著寫一段測(cè)試代碼。如下面代碼那樣,修改testAdd()方法,加入測(cè)試的代碼。測(cè)試的過程是:先建立兩個(gè)Money對(duì)
7、象,分別是m12CHF、m14CHF。m12CHF的數(shù)值是12,m14CHF的數(shù)值是14。調(diào)用m12CHF的add方法,與m14CHF相加,得出一個(gè)新的Money對(duì)象result。最后用assertTrue方法,驗(yàn)證得出的result的值是否與預(yù)期的expected對(duì)象的值相等。運(yùn)行測(cè)試代碼運(yùn)行單元測(cè)試修改完成后,就可以試一下運(yùn)行測(cè)試用例了。運(yùn)行測(cè)試用例也是Run命令,通過工具欄上的Run按鈕執(zhí)行。查看單元測(cè)試的結(jié)果單元測(cè)試一旦執(zhí)行,測(cè)試的結(jié)果就可以在JUnit視圖上清晰地展現(xiàn)出來。編寫JUnit單元測(cè)試實(shí)例編輯類文件:新建一個(gè)類文件JUnitExample .java ,該類中只有一個(gè)方法s
8、peak(),返回字符串“Hello World!”,代碼如下。 package com.myjunit.example;public class JUnitExample /待測(cè)試的方法,返回字符串“Hello world!”public String speak() return Hello world!;創(chuàng)建TestCase測(cè)試類現(xiàn)在開發(fā)JUnit的“Hello World!”例子。(1)建立測(cè)試。在工程上單擊右鍵,選擇“New”“Other”菜單命令,展開“Java”選項(xiàng),選擇“JUnit”“JUnit Test Case”,如圖所示。創(chuàng)建TestCase測(cè)試類(2)單擊“Next”按
9、鈕,彈出新建JUnit測(cè)試案例對(duì)話框。在“Name”一欄中填入測(cè)試案例的名字 “TestGetHelloWorldPrompt”, 在“Class under test”中填入將要被測(cè)試的類“com.myjunit.example.JUnitExample”。如圖所示。創(chuàng)建TestCase測(cè)試類(3)單擊“Next”按鈕,彈出選擇待測(cè)試方法對(duì)話框,選擇“JUnitExample”類的“speak()”方法,單擊“Finish”按鈕完成。編輯“TestGetHelloWorldPrompt”類代碼如下。package com.myjunit.test;import junit.framework
10、.TestCase;import com.myjunit.example.JUnitExample;public class TestGetHelloWorldPrompt extends TestCasepublic void setUp() throws Exception /初始化public void tearDown() throws Exception /撤銷初始化public void testSpeak() /構(gòu)造類JUnitExample的實(shí)例測(cè)試JUnitExample jue = new JUnitExample();/assertEquals方法是JUnit提供的輔助函
11、數(shù),用于幫助確定某個(gè)被測(cè)試的函數(shù)是/否正常工作,稱為“斷言”。assertEquals(expected,actual):expected是/期望值,actual是被測(cè)試代碼實(shí)際產(chǎn)生的值assertEquals(Hello zzu!, jue.speak(); 運(yùn)行TestCase測(cè)試類右鍵單擊工程,選擇“Run As”“JUnit Test”選項(xiàng),出現(xiàn)JUnit視圖,如圖所示。運(yùn)行TestCase測(cè)試類可以看到JUnit視圖中出現(xiàn)一個(gè)紅條,“Failures”為1,說明測(cè)試失敗了,查看失敗原因可以在“Failure Trace”中查找信息。如圖所示,說明測(cè)試數(shù)據(jù)與實(shí)際數(shù)據(jù)不一致,導(dǎo)致測(cè)試失敗
12、。比較測(cè)試數(shù)據(jù)與實(shí)際數(shù)據(jù)修改TestCase測(cè)試類下面,我們修改“JUnitExample”類中的“speak”方法,代碼如下。package com.myjunit.example;public class JUnitExample / 待測(cè)試的方法,返回字符串“Hello zzu!”public String speak() return Hello zzu!;運(yùn)行TestCase測(cè)試類再次運(yùn)行測(cè)試。JUnit視圖中出現(xiàn)一個(gè)綠條,表明測(cè)試成功。成批運(yùn)行TestCase測(cè)試類新建一個(gè)“JUnit Test Suite”類,名稱為“AllTests”,代碼如下。package com.myju
13、nit.example;import org.junit.runner.RunWith;import org.junit.runners.Suite;import org.junit.runners.Suite.SuiteClasses;RunWith(Suite.class)SuiteClasses( TestGetHelloWorldPrompt.class )SuiteClasses( 其他測(cè)試類.class )public class AllTests package com.myjunit.test;import junit.framework.Test;import junit.f
14、ramework.TestCase;import junit.framework.TestSuite;public class AllTests public static Test suite() /構(gòu)造TestSuite類,可以不帶參數(shù)TestSuite suite = new TestSuite(Test for com.myjunit.test);/$JUnit-BEGIN$/*此處可以添加多個(gè)JUnit test。本例中只是使用了前面的一個(gè)測(cè)試?yán)印_\(yùn)行AllTests時(shí)就可以測(cè)試多個(gè)JUnit test,測(cè)試失敗的JUnit test不會(huì)影響其他的JUnit test測(cè)試*/ su
15、ite.addTestSuite(TestGetHelloWorldPrompt.class);/*suite.addTestSuite(其他測(cè)試類.class);*/$JUnit-END$return suite;成批運(yùn)行TestCase測(cè)試類右鍵單擊類“AllTests”,選擇“Run As”“JUnit Test”菜單命令,結(jié)果如圖所示。JUnit知識(shí)要點(diǎn)1JUnit中的初始化與撤銷在“TestGetHelloWorldPrompt”類中,我們可以看到有setUp與tearDown兩個(gè)方法,這兩個(gè)方法是junit framework.TestCase中提供初始化和反初始化每個(gè)測(cè)試的方法。
16、setUp方法:在每個(gè)測(cè)試方法調(diào)用前被調(diào)用,負(fù)責(zé)初始化測(cè)試方法所需要的測(cè)試環(huán)境;tearDown方法:在每個(gè)測(cè)試方法被調(diào)用之后被調(diào)用,負(fù)責(zé)撤銷測(cè)試環(huán)境。它們與測(cè)試方法的關(guān)系可以描述如下:測(cè)試開始setUptestXXXtearDown測(cè)試結(jié)束。在setUp和tearDown中的代碼是不應(yīng)該與測(cè)試方法相關(guān)的,而應(yīng)該是全局相關(guān)的。例如對(duì)于測(cè)試方法A和B,在setUp和tearDown中的代碼應(yīng)該是A和B都需要的代碼。2JUnit的各種斷言JUnit為我們提供了一些輔助函數(shù),它們用來幫助我們確定被測(cè)試的方法是否按照預(yù)期的效果正常工作,通常,把這些輔助函數(shù)稱為斷言。下面介紹一下JUnit的各種斷言。a
17、ssertEquals函數(shù)原型1:assertEquals(String message,expected,actual)參數(shù)說明:message是一個(gè)可選的消息,如果提供,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。 expected是期望值,通常都是用戶指定的內(nèi)容。 actual是被測(cè)試的代碼返回的實(shí)際值。函數(shù)原型2:assertEquals(String message,expected,actual,tolerance)參數(shù)說明:message是一個(gè)可選的消息,如果提供,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。 expected是期望值,通常都是用戶指定的內(nèi)容。 actual是被測(cè)試的代碼返回的實(shí)際值。 to
18、lerance是誤差參數(shù),參加比較的兩個(gè)浮點(diǎn)數(shù)在這個(gè)誤差之內(nèi)則會(huì)被認(rèn)為是相等的。JUnit知識(shí)要點(diǎn)assertTrue函數(shù)原型:assertTrue (String message,Boolean condition)參數(shù)說明:message是一個(gè)可選的消息,如果提供,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。 condition是待驗(yàn)證的布爾型值。該斷言用來驗(yàn)證給定的布爾型值是否為真,如果結(jié)果為假,則驗(yàn)證失敗。當(dāng)然,還有驗(yàn)證為假的測(cè)試條件:函數(shù)原型:assertFalse(String message,Boolean condition)該斷言用來驗(yàn)證給定的布爾型值是否為假,如果結(jié)果為真,則驗(yàn)證失敗。a
19、ssertNull函數(shù)原型:assertNull(String message,Object object)參數(shù)說明:message是一個(gè)可選的消息,如果提供,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。 object是待驗(yàn)證的對(duì)象。該斷言用來驗(yàn)證給定的對(duì)象是否為null,如果不為null,則驗(yàn)證失敗。相應(yīng)地,還存在可以驗(yàn)證非null的斷言:函數(shù)原型:assertNotNull(String message,Object object)該斷言用來驗(yàn)證給定的對(duì)象是否為非null,如果為null,則驗(yàn)證失敗。JUnit知識(shí)要點(diǎn)assertSame函數(shù)原型:assertSame (String message, expected,actual)參數(shù)說明:message是一個(gè)可選的消息,如果提供,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。 expected是期望值。 actual是被測(cè)試的代碼返回的實(shí)際值。該斷言用來驗(yàn)證expected參數(shù)和actual參數(shù)所引用的是否是同一個(gè)對(duì)象,如果不是,則驗(yàn)證失敗。相應(yīng)地,也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工腳手架分包條件范本
- 企業(yè)禮品選購合同
- 裝卸質(zhì)量信譽(yù)保證
- 專業(yè)單項(xiàng)勞務(wù)分包協(xié)議樣本
- 鋼鐵構(gòu)造工程協(xié)議
- 專業(yè)居間融資協(xié)議模板
- 存量房屋買賣合同模板
- 確保學(xué)費(fèi)按時(shí)繳納約束性保證書模板
- 課堂上我誓守靜悄悄
- 農(nóng)產(chǎn)品購買合同的合同付款條件
- 中華民族共同體概論學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 期末 (試題) -2024-2025學(xué)年人教PEP版英語六年級(jí)上冊(cè)
- 水產(chǎn)合作協(xié)議書
- 西方經(jīng)濟(jì)學(xué)考試題庫含答案
- 監(jiān)理公司各部門職責(zé)
- 論辛棄疾詞作的愁情主題及其審美價(jià)值
- 新形勢(shì)下我國保險(xiǎn)市場營銷的現(xiàn)狀、問題及對(duì)策
- 完整版焦慮抑郁自評(píng)量表SASSDS
- ISO14001內(nèi)審檢查表
- CDN基礎(chǔ)介紹PPT課件
- 新形勢(shì)下加強(qiáng)市場監(jiān)管局檔案管理工作的策略
評(píng)論
0/150
提交評(píng)論