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

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

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

    工作小驛

    Ninja!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks
    用XP進行開發的過程,unit test是必不可少的環節。作為unit test,junit是首選的工具。本文從使用目的、如何使用、以及使用中需要考慮的問題,簡略描述了junit的基本用法。

    使用目的
          junit是java中書寫unit test的framework,目前一些流行的unit test工具大都都是在junit上擴展而來的。目前它的版本是junit3.8.1,可以從www.junit.org上下載。

    用法
    1.       基本使用步驟,Junit的使用非常簡單,它的基本使用步驟:

    -          創建,從junit.framework.TestCase派生unit test需要的test case

    -          書寫測試方法,提供類似于如下函數簽名的測試方法:

    public void testXXXXX();

    -          編譯,書寫完test case后,編譯所寫的test case類

    -          運行,啟動junit test runner,來運行這個test case。

    Junit提供了2個基本的test runner:字符界面和圖形界面。啟動命令分別如下:

    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,這兩個函數是junit framework中提供初始化和反初始化每個測試方法的。setUp在每個測試方法調用前被調用,負責初始化測試方法所需要的測試環境;tearDown在每個測試方法被調用之后被調用,負責撤銷測試環境。它們與測試方法的關系可以描述如下:



        測試開始 -> setUp -> testXXXX -> tearDown ->測試結束




    4.       使用例子:

    import junit.frmework.TestCase;

    public class TestSample extends TestCaset{

           protected void setUp(){

                  //初始化……

    }



           public void testMethod1(){

                  assertTrue( true);

    }



    potected void tearDown(){

          //撤銷初始化……

    }

    }

    5.       區分fail、exception。

    -          fail,期望出現的錯誤。產生原因:assert函數出錯(如assertFalse(true));fail函數產生(如fail(……))。

    -          exception,不期望出現的錯誤,屬于unit test程序運行時拋出的異常。它和普通代碼運行過程中拋出的runtime異常屬于一種類型。

    對于assert、fail等函數請參見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.”);     //不可能到達

                  }catch(Exception e){

                         fail( “Yes, I catch u”); //應該到達點

    }

    ……

    }



    potected void tearDown(){

          //撤銷初始化……

    }

    }

    7.       組裝TestSuite,運行更多的test。在junit中,Test、TestCase和TestSuite三者組成了composiste pattern。通過組裝自己的TestSuite,可以完成對添加到這個TestSuite中的所有的TestCase的調用。而且這些定義的TestSuite還可以組裝成更大的TestSuite,這樣同時也方便了對于不斷增加的TestCase的管理和維護。

          它的另一個好處就是,可以從這個TestCase樹的任意一個節點(TestSuite或TestCase)開始調用,來完成這個節點以下的所有TestCase的調用。提高了unit test的靈活性。

    8.       使用例子:

    import junit.framework.Test;

    import junit.framework.TestSuite;

    public class TestAll{

    public class TestAll{

           //定義一個suite,對于junit的作用可以視為類似于java應用程序的main。

       public static Test suite(){

           TestSuite suite = new TestSuite("Running all tests.");

           suite.addTestSuite( TestCase1.class);

           suite.addTestSuite( TestCase2.class);

           return suite;

       }

    }

    運行同運行單獨的一個TestCase是一樣的,參見step 1 “運行”。

    9.       使用Ant junit task。我們除了使用java來直接運行junit之外,我們還可以使用junit提供的junit task與ant結合來運行。涉及的幾個主要的ant task如下:

    -          <junit>,定義一個junit task

    -          <batchtest>,位于<junit>中,運行多個TestCase

    -          <test>,位于<junit>中,運行單個TestCase

    -          <formatter>,位于<junit>中,定義一個測試結果輸出格式

    -          <junitreport>,定義一個junitreport task

    -          <report>,位于<junitreport>中,輸出一個junit report

    具體的語法請參見相關文檔。

    10.   使用例子:

    <junit printsummary="yes" haltonfailure="no">

       <classpath>

           <path refid="classpath"/>

           <pathelement location="${dist.junit}"/>

       </classpath>

       

       <formatter type="brief" usefile="false"/>

       <formatter type="xml"/>



       <batchtest todir="${doc.junitReport}">

           <fileset dir="${dist.junit}" includes="**/*Test.class" />

       </batchtest>

    </junit>



    <junitreport todir="${doc.junitReport}">

       <fileset dir="${doc.junitReport}">

           <include name="TEST*-*.xml"/>

       </fileset>

       <report format="frames" styledir="${junit.styleDir}" todir="${doc.junitReport}"/>

    </junitreport>

    檢查表
          junit的使用并不很難,然而要書寫一個好的TestCase卻并非易事。一個不好的TestCase往往是既浪費了時間,也起不了實際的作用。相反,一個好的TestCase,不僅可以很好的指出代碼中存在的問題,而且也可以作為代碼更準確的文檔,同時還在持續集成的過程中起非常重要的作用。在此給出書寫TestCase時需要注意的幾點:

    -          測試的獨立性:一次只測試一個對象,方便定位出錯的位置。這有2層意思:一個TestCase,只測試一個對象;一個TestMethod,只測試這個對象中的一個方法。

    -          給測試方法一個合適的名字。

    -          在assert函數中給出失敗的原因,如:assertTrue( “… should be true”,  ……),方便查錯。在這個例子中,如果無法通過assertTrue,那么給出的消息將被顯示。在junit中每個assert函數都有第一個參數是出錯時顯示消息的函數原型。

    -          測試所有可能引起失敗的地方,如:一個類中頻繁改動的函數。對于那些僅僅只含有getter/setter的類,如果是由IDE(如Eclipse)產生的,則可不測;如果是人工寫,那么最好測試一下。

    -          在setUp和tearDown中的代碼不應該是與測試方法相關的,而應該是全局相關的。如針對與測試方法A和B,在setUp和tearDown中的代碼應該是A和B都需要的代碼。

    -          測試代碼的組織:相同的包,不同的目錄。這樣,測試代碼可以訪問被測試類的protected變量/方法,方便測試代碼的編寫。放在不同的目錄,則方便了測試代碼的管理以及代碼的打包和發布。一個例子如下:

    src   <=源代碼根目錄

    -com

        -mod1

            -class1

    junit   <=測試代碼根目錄

    -com

        -mod1

            -class1
    posted on 2007-09-03 23:09 王君 閱讀(405) 評論(0)  編輯  收藏 所屬分類: JUnit

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲免费在线视频播放| 亚洲AV无码国产精品色| 亚洲成人激情在线| 亚洲jjzzjjzz在线播放| 亚洲成a人无码亚洲成av无码 | 亚洲精品无码午夜福利中文字幕| 亚洲精品乱码久久久久久中文字幕| 亚洲精品电影天堂网| 亚洲高清乱码午夜电影网| 久久国产福利免费| 成人免费网站在线观看| 亚洲成色在线综合网站| 免费人成视频在线观看免费| 亚欧日韩毛片在线看免费网站| 永久免费av无码网站韩国毛片 | 四虎影院免费在线播放| 亚洲男人都懂得羞羞网站| 一区二区视频免费观看| 女人让男人免费桶爽30分钟| 亚洲妇熟XXXX妇色黄| 国产无遮挡色视频免费观看性色| 日本免费的一级v一片| 亚洲中文字幕AV每天更新| 亚洲性线免费观看视频成熟 | 精品国产人成亚洲区| 国产午夜亚洲精品不卡免下载| 成人免费黄色网址| 亚洲高清无在码在线电影不卡 | 麻豆安全免费网址入口| 老司机永久免费网站在线观看| 亚洲国产精品网站久久| 黄在线观看www免费看| 亚洲成年人电影在线观看| 国产大片线上免费观看| 日本亚洲免费无线码| 免费观看大片毛片| 欧洲亚洲综合一区二区三区 | 色播在线永久免费视频| 亚洲Av无码国产一区二区| 国产中文字幕免费| 无码 免费 国产在线观看91|