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

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

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

    軟件藝術(shù)思考者  
    混沌,彷徨,立志,蓄勢...
    公告
    日歷
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    隨筆分類(86)

    隨筆檔案(85)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     
    Eclipse 中使用JUnit(轉(zhuǎn))
    自:http://dev.21tx.com 2004年12月01日 J2ME開發(fā)網(wǎng) asklxf
      測試對于保證軟件開發(fā)質(zhì)量有著非常重要的作用,單元測試更是必不可少,JUnit是一個非常強大的單元測試包,可以對一個/多個類的單個/多個方法測試,還可以將不同的TestCase組合成TestSuit,使測試任務(wù)自動化。Eclipse同樣集成了JUnit,可以非常方便地編寫TestCase。

      我們創(chuàng)建一個Java工程,添加一個example.Hello類,首先我們給Hello類添加一個abs()方法,作用是返回絕對值:



      下一步,我們準備對這個方法進行測試,確保功能正常。選中Hello.java,右鍵點擊,選擇New->JUnit Test Case:


       Eclipse會詢問是否添加junit.jar包,確定后新建一個HelloTest類,用來測試Hello類。


      選中setUp()和tearDown(),然后點擊“Next”:

      
      選擇要測試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:

        

       JUnit會以以下順序執(zhí)行測試:(大致的代碼
    try {
    HelloTest test = new HelloTest(); // 建立測試類實例
    test.setUp(); // 初始化測試環(huán)境
    test.testAbs(); // 測試某個方法
    test.tearDown(); // 清理資源
    }
    catch…


      setUp()是建立測試環(huán)境,這里創(chuàng)建一個Hello類的實例;tearDown()用于清理資源,如釋放打開的文件等等。以test開頭的方法被認為是測試方法,JUnit會依次執(zhí)行testXxx()方法。在testAbs()方法中,我們對abs()的測試分別選擇正數(shù),負數(shù)和0,如果方法返回值與期待結(jié)果相同,則assertEquals不會產(chǎn)生異常。

      如果有多個testXxx方法,JUnit會創(chuàng)建多個XxxTest實例,每次運行一個testXxx方法,setUp()和tearDown()會在testXxx前后被調(diào)用,因此,不要在一個testA()中依賴testB()。

      直接運行Run->Run As->JUnit Test,就可以看到JUnit測試結(jié)果:


      綠色表示測試通過,只要有1個測試未通過,就會顯示紅色并列出未通過測試的方法。可以試圖改變abs()的代碼,故意返回錯誤的結(jié)果(比如return n+1;),然后再運行JUnit就會報告錯誤。

      如果沒有JUnit面板,選擇Window->Show View->Other,打開JUnit的View:


      JUnit通過單元測試,能在開發(fā)階段就找出許多Bug,并且,多個Test Case可以組合成Test Suite,讓整個測試自動完成,尤其適合于XP方法。每增加一個小的新功能或者對代碼進行了小的修改,就立刻運行一遍Test Suite,確保新增和修改的代碼不會破壞原有的功能,大大增強軟件的可維護性,避免代碼逐漸“腐爛”。
    posted on 2006-12-30 11:32 智者無疆 閱讀(792) 評論(2)  編輯  收藏
    評論:
    • # re: Eclipse快速上手指南之使用JUnit  fireworks 插件 Posted @ 2007-05-18 11:52
      什么是test case
      Test case: 一組測試過程,包括一組測試輸入,一組測試條件,和一組期望輸出。
      Test suite: 各個公司/測試項目經(jīng)理對他的解釋不盡相同,但是總體來說,Test suite是Test cases的集合。對于一個軟件測試項目,可以有若干個Test suites,也有的只有一個。但是每個test suite肯定包含若干個相關(guān)/同類的test cases。

      我對于摟主提出的問題給于這樣的解釋:
      登陸-〉查找 和 登陸-〉添加新人 屬于一個Test suite。 他們分別屬于2個不同的Test cases。
      細分登陸-〉查找這個Test case:如mickoowang2007所說,一組測試輸入可以有,錯誤密碼,錯誤用戶名,正確用戶名和密碼等組成,期望輸出可以是錯誤警告,成功登陸等。

      希望能幫助到摟主,以上僅是一個測試項目經(jīng)理的點滴經(jīng)驗,供參考。  回復(fù)  更多評論   

    • # re: Eclipse快速上手指南之使用JUnit  智者無疆 Posted @ 2007-05-18 13:19
      JUnit的框架原理
      第一章:JUnit的框架原理分析
      1. JUnit主要用于單元測試,所謂的單元測試就是常常說的白盒測試。它是一個開源的由JAVA開發(fā)的一個用于測試的框架。
      2. 下面我們主要是來看一下JUnit的設(shè)計原理
      2.1. 首先我們來看一下JUnit的框架圖。

      2.2. JUnit的幾個基本的概念:TestCase,TestSuite,TestFixtrue
      TestCase: 代表一個測試用例,每一個TestCase實例都對應(yīng)一個測試,
      這個測試通過這個TestCase實例的名字標志,以便在測試結(jié)果中指明哪
      個測試出現(xiàn)了問題.TestCase繼承自Assert,因此可以實現(xiàn)各種斷言。
      TestSuite:代表需要測試的一組測試用例,也就是測試用例的集合,
      TestFixtrue:代表一個測試環(huán)境。它用于組合一組測試用例,這組測試
      用例需要共同的測試運行環(huán)境。


      2.3. junit的設(shè)計
      2.3.1. Test接口: 代表一個測試。它是框架的主接口有兩個方法:
      int countTestCases();//返回所有測試用例的個數(shù)。
      void run(TestResult result);//運行一個測試,并且收集運行結(jié)果
      到TestResult.
      2.3.2. TestCase類: TestCase實現(xiàn)了Test接口,是框架提供的供我們繼承的類,我們的所有的測試方法都需要在TestCase的子類中定義,并且符合特定的設(shè)計協(xié)議。
      一個TestCase實例代表一個具體的測試實例,對應(yīng)一個對某一方法或概念的測試。每個TestCase實例都有一個名字。
      一個TestCase類卻定義了一個TestFixture。具體的說就是我們自己定義的TestCase子類中可以定義很多的public 沒有參數(shù)的 testxxx方法。運行時,每個testxxx都在自己的fixture中運行。每個運行的TestCase都有一個名字,如果不指定,一般是TestCase中定義的test方法的名字。
      2.3.3. TestSuite類: 和TestCase一樣TestSuite也實現(xiàn)了Test接口。一個TestSuite可以包含一系列的TestCase。把testCase組裝入TestSuite有幾種方式:
      A,通過將TestCase的Class參數(shù)傳入TestSuite的構(gòu)造函數(shù),TestSuite會自動收集TestCase中所有的public的沒有參數(shù)的testxxx方法加入TestSuite中。
      B,構(gòu)造空的TestSuite后通過void addTest(Test test)方法添加測試。
      C:構(gòu)造空的TestSuite后通過void addTestSuite(Class testClass) 方法添加測試集。
      2.3.4. TestResult類: 主要通過runProtected方法運行測試并收集所有運行結(jié)果
      2.3.5. TestRunner類: 啟動測試的主類,我們可以通過直接調(diào)用它運行測試用例,IDE和其他一些工具一般也通過這個接口集成JUnit.
      2.3.6. Assert類: 用于斷言,TestCase繼承自該類,我們的測試方法通過這些斷言判斷程序功能是否通過測試


      2.3.7. TestListener接口: 測試運行監(jiān)聽器,通過事件機制處理測試中產(chǎn)生的事件,主要用于測試結(jié)果的收集。
      以上是框架的核心接口和類的介紹,通過上面的介紹我們很容易看出來Test,
      TestCase和TestSuite的設(shè)計采用了Composite模式。這樣JUnit可以一次運行
      一個測試用例,也可以一次運行多個測試用例,TestRunner只關(guān)心Test接口,而
      對運行的是單個的TestCase還是同時運行多個TestCase并不在意
      3. JUnit同時使用了Command模式,對于典型的Command模式一般有5
      種角色 :
      3.1命令角色(Command):聲明執(zhí)行操作的接口。有java接口或者抽象
      類來實現(xiàn)
      3.2. 具體命令角色(Concrete Command):將一個接收者對象綁定于一
      個動作;調(diào)用接收者相應(yīng)的操作,以實現(xiàn)命令角色聲明的執(zhí)行操作的接
      口.
      3.3. 客戶角色(Client):創(chuàng)建一個具體命令對象(并可以設(shè)定它的接收者)。
      3.4. 請求者角色(Invoker):調(diào)用命令對象執(zhí)行這個請求.
      3.5. 接收者角色(Receiver):知道如何實施與執(zhí)行一個請求相關(guān)的操作。
      任何類都可能作為一個接收者。
      Test接口可以認為是命令模式中的命令角色Command接口,void run(TestRes
      ult result)接口方法定義了需要執(zhí)行的操作;TestCase可以看作是具體命令角色,
      但又不全是,因為我們還需要自己通過繼承TestCase類定義測試方法,這樣的每一
      個測試方法都回被包裝在一個TestCase實例中。TestResult可以看作請求者角色
      (Invoker),它會通過protected void run(final TestCase test) 運行測試并
      收集結(jié)果。我們自己寫的Test方法可以認為是接收者角色(Receiver),因為我們
      的方法才具體執(zhí)行這個命令。TestRunner就是客戶角色(Client),它通過TestRe
      sult result= createTestResult()構(gòu)造TestResult,并通過suite.run(result)運
      行測試用例(suite是一個Test接口的具體實例,可以是TestCase也可以是Test
      Suite,但客戶端不關(guān)心它是什么,這就是組合模式的好處。同時,suite.run(res
      ult)又調(diào)用result.run(test),如果不仔細分析,就會被這種設(shè)計搞迷惑).



      第二章:JUnit的好處和單元測試的編寫原則
      現(xiàn)在世面上有很多的測試工具,比如說NUNIT,PHPUNIT等。但是在JAVA的世界里面JUnit是最適合我們的單元測試工具。
      A:可以使測試代碼與產(chǎn)品代碼分開
      B:針對某一個類的測試代碼通過較少的改動便可以應(yīng)用于另一個類的測試
      C:易于集成到測試人員的構(gòu)建過程中,JUnit和Ant的結(jié)合可以實施增量開發(fā)
      D:JUnit是公開源代碼的,可以進行二次開發(fā)
      E:可以方便地對JUnit進行擴展

      編寫原則:
      A: 是簡化測試的編寫,這種簡化包括測試框架的學(xué)習(xí)和實際測試單元的編寫
      B: 是使測試單元保持持久性
      C: 是可以利用既有的測試來編寫相關(guān)的測試

      第三章:JUnit的應(yīng)用以及擴展
      下面是關(guān)于JUNIT的擴展方面的,主要說的是junit.extensions包
      1. ExceptionTestCase是TestCase的子類,用于對預(yù)見引發(fā)異常時的測試。生成該對象的時候要指明應(yīng)該引發(fā)的異常的類型。runTest的時候會catch并吸收該異常。如果未發(fā)現(xiàn)該異常,則 測試失敗
      2. ActiveTestSuite是TestSuite的子類,用獨立的線程來運行每個測試實例。runTest(Test, TestResult)開啟新線程來運行Test。run(TestResult)對所有的Test運行runTest(Test, TestResult),并等待所有線程結(jié)束。
      3. TestDecorator是Assert的子類,并實現(xiàn)了Test接口。它封裝Test并把其Test.run(TestResult)作為一個basicRun(TestResult)。TestDecorator.run(TestResult)直接調(diào)用basicRun。子類可以重載run(TestResult),從而在原Test.run(TestResult)前后加入新的修飾代碼
      4. RepeatedTest是TestDecorator的子類。RepeatedTest.run(TestResult)重復(fù)指定次數(shù)運行TestDecorator.run(TestResult)。因此countTestCases()也要在TestDecorator.countTestCases()基礎(chǔ)上乘以重復(fù)次數(shù)。
      5. TestSetup是TestDecorator的子類。增加新的fixture。在basicRun(TestResult)前運行setUp(),在之后運行tearDown()。 BUG沒有調(diào)用TestResult.startTest/endTest,即不產(chǎn)生開始/結(jié)束測試事件。
      下面是個簡單的例子:

      Mytest.java類:


      public class Mytest {

      String name;
      String birthday;
      int age;

      public int getAge() {
      return age;
      }
      public void setAge(int age) {
      this.age = age;
      }

      public String getBirthday() {
      return birthday;
      }
      public void setBirthday(String birthday) {
      this.birthday = birthday;
      }
      public String getName() {
      return name;
      }
      public void setName(String name) {
      this.name = name;
      }
      }


      MytestTest .java類

      import junit.framework.Test;
      import junit.framework.TestCase;
      import junit.framework.TestSuite;
      public class MytestTest extends TestCase {

      /*
      * @see TestCase#setUp()
      */
      protected void setUp() throws Exception {
      super.setUp();
      }

      /*
      * @see TestCase#tearDown()
      */
      protected void tearDown() throws Exception {
      super.tearDown();
      }

      /**
      * Constructor for MytestTest.
      * @param arg0
      */
      public MytestTest(String arg0) {
      super(arg0);
      }

      public static Test suite(){
      TestSuite ts = new TestSuite();
      //TestSuite ts = new TestSuite(MytestTest.class);
      ts.addTest(new MytestTest("testgetName"));
      return ts;
      }

      public void testgetName(){
      Mytest mt = new Mytest();
      mt.setName("mahb");
      // assertEquals("gaofei",mt.getName());
      System.out.println("12345455---" + mt.getName());

      }
      public void testgetBirthday(){
      Mytest mt = new Mytest();
      mt.setBirthday("1983.05.26");
      // assertNull(mt.getBirthday());
      assertNotNull(mt.getBirthday());
      assertTrue(mt.getBirthday().equals("1982.1.20"));
      System.out.println("-------"+mt.getBirthday());
      }

      }  回復(fù)  更多評論   


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


    網(wǎng)站導(dǎo)航:
     
     
    Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


       觀音菩薩贊

    主站蜘蛛池模板: 国产精品亚洲五月天高清| 日韩在线视精品在亚洲| 毛片a级毛片免费观看品善网 | 日韩内射激情视频在线播放免费 | 国产成人AV免费观看| 亚洲成综合人影院在院播放| 午夜免费福利在线| 免费中文字幕视频| 亚洲色av性色在线观无码| 国产乱子伦精品免费女| 午夜理伦剧场免费| 亚洲熟女www一区二区三区| 亚洲人AV永久一区二区三区久久| 亚洲人成伊人成综合网久久| 青青青青青青久久久免费观看| 亚洲色欲色欲www在线丝| 日韩成人免费视频| 亚洲国产精品免费观看 | 久久久久国色AV免费观看| 亚洲欧洲∨国产一区二区三区| 九九精品国产亚洲AV日韩| 欧美最猛性xxxxx免费| MM1313亚洲国产精品| 在线A亚洲老鸭窝天堂| 18禁美女黄网站色大片免费观看| 亚洲精品午夜无码电影网| 999久久久免费精品国产| 亚洲AV性色在线观看| 久久亚洲国产伦理| 永久免费bbbbbb视频| 今天免费中文字幕视频| 亚洲免费观看在线视频| 中文字幕亚洲第一| 国产无人区码卡二卡三卡免费| 亚洲欧洲第一a在线观看| 免费看片A级毛片免费看| 男性gay黄免费网站| 国外亚洲成AV人片在线观看| 成全视频高清免费观看电视剧| 伊人久久综在合线亚洲91| 97热久久免费频精品99|