• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Java開源項目——突破JUnit的局限

    發布: 2007-6-22 07:38 | 作者:   | 來源:   | 查看: 19次 | 進入軟件測試論壇討論

    領測軟件測試網

       
      “沒有人喜歡bug!贝蠖鄶店P于單元測試的文章以這句話開篇。的確,我們都希望代碼如設計的那樣準確地執行,但是就好像叛逆孩子一樣,程序在完成之后產生的行為將難以控制。比那些家長們幸運的是,我們可以運用工具以確保程序達到預期效果。
      

      市面上有很多用于測試,分析以及debug程式的工具,其中以JUnit最為有名。這是一個協助軟件工程師,QA(品質監管)工程師測試階段性代碼的平臺。幾乎每個接觸過JUnit的人都對它有強烈的感情:要么喜歡,要么討厭。主要的抱怨之一是它缺少做復雜場景測試的能力。
      
      通過突破傳統模式的思考,這一問題可以得到解決。這篇文章將介紹JUnit如何利用Pisces來實現復雜測試。Pisces是一個開源項目,作為JUnit的擴展,它可以讓你寫出由一些JUnit測試組成的測試單元,每個測試單元可以以串行或并行的方式運行在一個遠程主機上。Pisces可以讓你構成、運行復雜場景,并在一個地點協調它們。
      
      JUnit 基礎
      
      JUnit中有兩個基本對象,TestCase和TestSuite。TestCase通過提供一組方法來實現一系列測試。例如,setup()方法用來在每項測試開始前建立測試所需的測試環境,而teardown()方法用來在測試后銷毀該環境。其他的方法都會完成各式各樣的任務,例如,在測試中進行性能檢測,判斷變量是否為null,比較變量以及捕捉異常。
      
      要創建測試程序,需要繼承TestCase類,覆寫setup和teardown方法,然后添加自己的測試函數,這些函數通常以“test測試名”的形式命名。
      
      下面是一個測試程序的例子:
      public class MyTestCase extends TestCase {
      /**
      * call super constructor with a test name
      * string argument.
      * @param testName the name of the method that
      * should be run.
      */  public MyTestCase(String testName){
      super(testName);
      }
      /**
      * called before every test
      * 在每項測試開始前被調用
      */  protected void setUp() throws Exception {
      initSomething();
      }
      /**
      * called after every test
      * 在測試完成后被調用
      */  protected void tearDown() throws Exception {
      finalizeSomething();
      }
      /**
      * this method tests that ...
      * 這個方法測試……
      */  public void testSomeTest1(){  ...  }
      /**
      * this method tests that ...
      * 這個方法測試……
      */  public void testSomeTest2 (){
      ...
      }
      }
      
      TestSuite是由幾個TestCase或其他的TestSuite構成的。你可以很容易的構成一個樹形測試,每個測試都由持有另外一些測試的TestSuite來構成。被加入到TestSuite中的測試在一個線程上依次被執行。
      
      ActiveTestSuite是TestSuite的一個子類。被添加到ActiveTestSuite中的測試程序以并行方式執行,每個測試在一個獨立的線程上運行。創建一個測試單元的方法之一是繼承TestSuite類并覆寫suite()方法。
      
      下面是一個簡單的例子:
      public class MyTestSuite extends TestSuite {  public static Test suite() {
      TestSuite suite =       new TestSuite("Test suite for ...");
      // add the first test  // 添加第一個測試
      MyTestCase mtc = new MyTestCase("testSomeTest1");
      suite.addTest(mtc);
      // add the second test  // 添加第一個測試
      MyTestCase mtc2 =new MyTestCase("testSomeTest2");
      suite.addTest(mtc2);
      return suite;
      }
      }
      
      運行一個測試或測試單元非常簡單,因為從JUnit提供的GUI開始,到所有的IDE開發環境,例如Eclipse,都有GUI可以使用。
      
      圖1, 顯示了TestSuite在Eclipse中是如何表示的。
      [[The No.1 Picture.]]
      圖1,集成在Eclipse中的JUnit
      
      因為介紹JUnit并不是這篇文章的主題,而且有很多關于JUnit的文章,本文就只提供這些JUnit基礎概念的概要。在“資源”小節里有對JUnit更深入介紹的文章。
      
      JUnit的優點和缺點
      
      JUnit是一個易用的,靈活的,開源的,測試平臺。就像所有其他項目一樣,它有很多優點,但也有不足之處。通過使用無需人工干預的JUnit自動測試平臺,我們很容易累積起大量的JUnit測試程序從而保證以往的bug不會重現。另外,JUnit便于和編譯單元(如,Ant)以及IDE單元(如,Eclipse)集成。
      
      JUnit的弱點也眾所周知。它僅支持同步測試,而且不支持重現和其他異步單元。JUnit是一個黑箱測試平臺,因此測試那些不會直接影響功能的bug(例如,內存泄漏)就非常困難。除此之外,它不支持易用的腳本語言,因此,想要使用JUnit就要懂得Java。
      
      JUnit的另一個不足是JUnit測試被限制于一個JVM之上。當要測試復雜或分布式場景的時候,這就變成個大問題。本文剩下的部分,就這個問題及其解決方法進行論述。
      
      復雜場景測試:試復雜的分布式場景?
      
      1. 那些確保小單元的完整性的測試很有用,但同時也有局限性。經驗告訴我們,大多數bug是在完整的測試中被發現的。這些問題從兩個模塊不能一同正常協調工作,到兩個獨立應用程序的異常。無論這是兩個應用服務,還是客戶/服務環境,甚至是點對點模式,對這些復雜場景的測試尤其重要,因為那些難纏的bug往往寄生于此。但是用JUnit對此幾乎無能為力。
      
      2. 雖然Java具有平臺無關性,但測試一個應用程序在多種操作系統上的表現還是一個明智的選擇。你的程序可能在所有的操作系統上都能運行,但是卻不一定嚴格地按照你設計的那樣正常工作。在所有的操作系統上重復同樣的一組測試程序是一件耗時的工程,而用JUnit你不能進行分布式測試,因此你無法讓同樣的一組測試同時運行在幾個JVM之上,而每個JVM運行在不同的操作系統之上。
      
      3. 一些單元代碼,只能在多JVM場景下被測試。例如,測試建立一個連接(TCP socket或者HTTP連接)以及從中取得的信息的完整性。這樣的測試不可能(或者說很難)在單一JVM上測試。而這是JUnit給我們的唯一選擇。
      
      用Ant協同測試
      
      僅使用JUnit和Ant來協調幾個運行在不同JVM上的測試是可能的。Ant可以以并行或者串行的方式執行任務(使用<parallel>標記),而且可以設置當有任何測試失敗的時候,就停止運行。
      
      但這種方法有其局限性,首先,使用JUnit和Ant仍然把你限制在一個操作系統之上。其次,隨著你的測試程序的累積,你會發現Ant XML文件會變得越來越大,以至于無法管理。第三,我們發現在某些情況下,分支JVM會在Ant任務結束后保留下來甚至繼續運行。
      
      Pisces項目就是為了解決JUnit的這些限制而來的,它給予JUnit復雜場景和分布式測試的能力。本文下面的章節將介紹這個開源項目。
      
      利用Pisces打破JUnit的局限
      
      Pisces基礎知識
      
      Pisces是一個開源項目,它擴展了JUnit平臺。就像許多其他的擴展程序一樣,Pisces添加了新功能的同時也保證了擴展前后JUnit操作的一致性。
      
      Pisces的核心是在同一主機或不同主機上實現在遠程JVM上運行JUnit測試的能力。這些遠程測試程序會封裝在本地運行的JUnit測試程序中,因此開發人員或者QA(品質測試)人員可以用通常的JUnit GUI工具來運行這些通常(本地)的測試程序。用來包裝遠程測試的對象叫做RemoteTestCase,它也是TestCase冊子類。
      
      圖2顯示的是遠程測試程序和它的包裝器。
      [[The No.2 Picture.]]
      圖2,遠程測試和它的包裝器
      
      在每一個遠端,我們運行一個Pisces代理程序,并指定唯一的代理名。這個代理負責運行實際的JUnit測試程序并將結果返回到本地,F在,一旦我們能運行一個包裝在本地測試中的遠程測試程序,我們就能通過組合幾個這樣的測試來創建一個更為復雜的場景。
      [[The No.3 Picture.]]
      圖3, 由幾個遠程測試組成的測試單元
      
      改變默認輸出
      
      每個代理運行一組測試程序,而每個測試程序都可能寫信息到默認輸出。因為保證測試人員或開發人員在測試過程中得到這些信息很重要,所以默認輸出被拷貝到本地測試單元的控制臺中。這樣,便可以避免在測試單元中查看每個代理的控制輸出。
      
      Pisces的可擴展通信層
      
      在各個代理及本地主測試程序之間的通信是件復雜的事情,因為Pisces必須能在各種不同的環境以及網絡配置下正常工作。為了解決這一問題,Pisces有一個可以擴展的通信層。它的每一個實現解決一個指定的網絡環境下的問題。
      
      Pisces提供兩個默認的基本通信層,一個是易于配置但只能工作在局域網內的multicast實現,另一個是JMS實現。它需要安裝面向消息中間件/消息導向中間件(MOM, Message-Oriented Middleware),可以應付大多數網絡環境。
      
      配置并運行Pisces測試
      
      1.配置并運行Pisces代理
      
      正如前面所提到的,Pisces測試單元是由幾個運行在遠程代理之上的Junit測試程序組成的。每個代理都是一個Java應用程序,它根據從主測試程序接收的指令來運行JUnit測試,并將結果及默認輸出返回到主測試單元。
      
      運行代理程序最簡單的方式是在Pisces提供的腳本文件夾中配置并運行相關的可執行腳本。此外,你也可以在已經提供的腳本的基礎上構建你自己的腳本。腳本文件容許用戶配置代理的通用參數,例如唯一標識符,為通

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>