<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-72  評(píng)論-63  文章-0  trackbacks-0
    在使用XP進(jìn)行開(kāi)發(fā)的過(guò)程,unit test是必不可少的環(huán)節(jié)。作為unit test,junit是首選的工具。本文從使用目的、如何使用、以及使用中需要考慮的問(wèn)題,簡(jiǎn)略描述了junit的基本用法。 使用目的 junit是java中書(shū)寫(xiě)unit test的framework,目前一些流行的unit test工具大都都是在junit上擴(kuò)展而來(lái)的。目前它的版本是junit3.8.1,可以從www.junit.org上下載。 用法 1. 基本使用步驟,Junit的使用非常簡(jiǎn)單,它的基本使用步驟: - 創(chuàng)建,從junit.framework.TestCase派生unit test需要的test case - 書(shū)寫(xiě)測(cè)試方法,提供類(lèi)似于如下函數(shù)簽名的測(cè)試方法: public void testXXXXX(); - 編譯,書(shū)寫(xiě)完test case后,編譯所寫(xiě)的test case類(lèi) - 運(yùn)行,啟動(dòng)junit test runner,來(lái)運(yùn)行這個(gè)test case。 Junit提供了2個(gè)基本的test runner:字符界面和圖形界面。啟動(dòng)命令分別如下: a 圖形界面: java junit.swingui.TestRunner XXXXX b 字符界面: java junit.textui.TestRunner XXXXX 2. 使用例子: import junit.frmework.TestCase; public class TestSample extends TestCaset{ public void testMethod1(){ assertTrue( true); } } 3. setUp與tearDown,這兩個(gè)函數(shù)是junit framework中提供初始化和反初始化每個(gè)測(cè)試方法的。setUp在每個(gè)測(cè)試方法調(diào)用前被調(diào)用,負(fù)責(zé)初始化測(cè)試方法所需要的測(cè)試環(huán)境;tearDown在每個(gè)測(cè)試方法被調(diào)用之后被調(diào)用,負(fù)責(zé)撤銷(xiāo)測(cè)試環(huán)境。它們與測(cè)試方法的關(guān)系可以描述如下: 測(cè)試開(kāi)始 -> setUp -> testXXXX -> tearDown ->測(cè)試結(jié)束 4. 使用例子: import junit.frmework.TestCase; public class TestSample extends TestCaset{ protected void setUp(){ //初始化…… } public void testMethod1(){ assertTrue( true); } potected void tearDown(){ //撤銷(xiāo)初始化…… } } 5. 區(qū)分fail、exception。 - fail,期望出現(xiàn)的錯(cuò)誤。產(chǎn)生原因:assert函數(shù)出錯(cuò)(如assertFalse(true));fail函數(shù)產(chǎn)生(如fail(……))。 - exception,不期望出現(xiàn)的錯(cuò)誤,屬于unit test程序運(yùn)行時(shí)拋出的異常。它和普通代碼運(yùn)行過(guò)程中拋出的runtime異常屬于一種類(lèi)型。 對(duì)于assert、fail等函數(shù)請(qǐng)參見(jiàn)junit的javadoc。 6. 使用例子: import junit.frmework.TestCase; public class TestSample extends TestCaset{ protected void setUp(){ //初始化…… } public void testMethod1(){ …… try{ boolean b= …… assertTrue( b); throw new Exception( “This is a test.”); fail( “Unable point.”); //不可能到達(dá) }catch(Exception e){ fail( “Yes, I catch u”); //應(yīng)該到達(dá)點(diǎn) } …… } potected void tearDown(){ //撤銷(xiāo)初始化…… } } 7. 組裝TestSuite,運(yùn)行更多的test。在junit中,Test、TestCase和TestSuite三者組成了composiste pattern。通過(guò)組裝自己的TestSuite,可以完成對(duì)添加到這個(gè)TestSuite中的所有的TestCase的調(diào)用。而且這些定義的TestSuite還可以組裝成更大的TestSuite,這樣同時(shí)也方便了對(duì)于不斷增加的TestCase的管理和維護(hù)。 它的另一個(gè)好處就是,可以從這個(gè)TestCase樹(shù)的任意一個(gè)節(jié)點(diǎn)(TestSuite或TestCase)開(kāi)始調(diào)用,來(lái)完成這個(gè)節(jié)點(diǎn)以下的所有TestCase的調(diào)用。提高了unit test的靈活性。 8. 使用例子: import junit.framework.Test; import junit.framework.TestSuite; public class TestAll{ public class TestAll{ //定義一個(gè)suite,對(duì)于junit的作用可以視為類(lèi)似于java應(yīng)用程序的main。 public static Test suite(){ TestSuite suite = new TestSuite("Running all tests."); suite.addTestSuite( TestCase1.class); suite.addTestSuite( TestCase2.class); return suite; } } 運(yùn)行同運(yùn)行單獨(dú)的一個(gè)TestCase是一樣的,參見(jiàn)step 1 “運(yùn)行”。 9. 使用Ant junit task。我們除了使用java來(lái)直接運(yùn)行junit之外,我們還可以使用junit提供的junit task與ant結(jié)合來(lái)運(yùn)行。涉及的幾個(gè)主要的ant task如下: - ,定義一個(gè)junit task - ,位于中,運(yùn)行多個(gè)TestCase - ,位于中,運(yùn)行單個(gè)TestCase - ,位于中,定義一個(gè)測(cè)試結(jié)果輸出格式 - ,定義一個(gè)junitreport task - ,位于中,輸出一個(gè)junit report 具體的語(yǔ)法請(qǐng)參見(jiàn)相關(guān)文檔。 10. 使用例子: 檢查表 junit的使用并不很難,然而要書(shū)寫(xiě)一個(gè)好的TestCase卻并非易事。一個(gè)不好的TestCase往往是既浪費(fèi)了時(shí)間,也起不了實(shí)際的作用。相反,一個(gè)好的TestCase,不僅可以很好的指出代碼中存在的問(wèn)題,而且也可以作為代碼更準(zhǔn)確的文檔,同時(shí)還在持續(xù)集成的過(guò)程中起非常重要的作用。在此給出書(shū)寫(xiě)TestCase時(shí)需要注意的幾點(diǎn): - 測(cè)試的獨(dú)立性:一次只測(cè)試一個(gè)對(duì)象,方便定位出錯(cuò)的位置。這有2層意思:一個(gè)TestCase,只測(cè)試一個(gè)對(duì)象;一個(gè)TestMethod,只測(cè)試這個(gè)對(duì)象中的一個(gè)方法。 - 給測(cè)試方法一個(gè)合適的名字。 - 在assert函數(shù)中給出失敗的原因,如:assertTrue( “… should be true”, ……),方便查錯(cuò)。在這個(gè)例子中,如果無(wú)法通過(guò)assertTrue,那么給出的消息將被顯示。在junit中每個(gè)assert函數(shù)都有第一個(gè)參數(shù)是出錯(cuò)時(shí)顯示消息的函數(shù)原型。 - 測(cè)試所有可能引起失敗的地方,如:一個(gè)類(lèi)中頻繁改動(dòng)的函數(shù)。對(duì)于那些僅僅只含有g(shù)etter/setter的類(lèi),如果是由IDE(如Eclipse)產(chǎn)生的,則可不測(cè);如果是人工寫(xiě),那么最好測(cè)試一下。 - 在setUp和tearDown中的代碼不應(yīng)該是與測(cè)試方法相關(guān)的,而應(yīng)該是全局相關(guān)的。如針對(duì)與測(cè)試方法A和B,在setUp和tearDown中的代碼應(yīng)該是A和B都需要的代碼。 - 測(cè)試代碼的組織:相同的包,不同的目錄。這樣,測(cè)試代碼可以訪問(wèn)被測(cè)試類(lèi)的protected變量/方法,方便測(cè)試代碼的編寫(xiě)。放在不同的目錄,則方便了測(cè)試代碼的管理以及代碼的打包和發(fā)布。一個(gè)例子如下: src <=源代碼根目錄 |---com |---mod1 |---class1 junit <=測(cè)試代碼根目錄 |---com |---mod1 |---class1 http://www.dvbbs.net/tech/program/2006042861394.asp
    posted on 2006-05-21 12:11 船長(zhǎng) 閱讀(779) 評(píng)論(1)  編輯  收藏

    評(píng)論:
    # re: 轉(zhuǎn):junit使用小結(jié)[未登錄](méi) 2007-08-20 09:15 | ajie
    好亂!!!,建議排版一下  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品无码免费播放| 亚洲欧洲日产国码一级毛片| 亚洲av无码专区首页| 亚洲美女高清一区二区三区| 四虎影视成人永久免费观看视频 | 国产亚洲精品一品区99热| 香蕉免费一区二区三区| 亚洲中文字幕无码久久2020| 亚洲国产综合精品中文字幕| 永久免费视频网站在线观看| 国产亚洲精品2021自在线| 337p日本欧洲亚洲大胆艺术| 国产一级淫片a免费播放口之| 免费人妻无码不卡中文字幕系| 国产精品观看在线亚洲人成网| 老司机亚洲精品影院无码| 国产免费啪嗒啪嗒视频看看| 37pao成人国产永久免费视频| 伊人久久国产免费观看视频| 亚洲一区二区三区免费观看| 亚洲中文久久精品无码ww16| 无码专区永久免费AV网站| 国产精品内射视频免费| 亚洲欧美一区二区三区日产| 亚洲最大福利视频网站| 亚洲午夜福利精品久久| 欧美男同gv免费网站观看| 久久精品国产影库免费看| 理论秋霞在线看免费| 亚洲国产成AV人天堂无码| 亚洲日产韩国一二三四区| 国产免费观看视频| 国产成人午夜精品免费视频| 国产好大好硬好爽免费不卡| v片免费在线观看| 蜜臀亚洲AV无码精品国产午夜.| 亚洲精品在线免费观看视频| 国产亚洲婷婷香蕉久久精品| 亚洲精品视频在线看| 热99re久久精品精品免费| 91精品免费国产高清在线|