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

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

  • <strong id="5koa6"></strong>
  • 用 Jython 構建 JUnit 測試包

    發表于:2007-06-22來源:作者:點擊數: 標簽:
    開發人員有多種理由決定自動化單元測試。許多人甚至進一步發揮它,自動化這些測試的定位和執行。但是如果想要測試裝具模塊(test harness)像靜態定義的那樣運行呢?請跟隨開發員 Michael Nadel,看看如何利用 Python 模擬靜態定義的 J Unit Test Suite 類。

       
      開發人員有多種理由決定自動化單元測試。許多人甚至進一步發揮它,自動化這些測試的定位和執行。但是如果想要測試裝具模塊(test harness)像靜態定義的那樣運行呢?請跟隨開發員 Michael Nadel,看看如何利用 Python 模擬靜態定義的 JUnit TestSuite 類。

      JUnit 測試框架被越來越多的開發小組所共同使用。歸功于各種各樣的測試裝具模塊,現在可以測試構成任何 Java 應用程序的幾乎每一個組件。事實上,幾乎整個二級市場似乎都是用圍繞 Junit 建立的。包括 Cactus、jfcUnit、XMLUnit、DbUnit 和 HttpUnit 這樣的裝具模塊都可以免費供開發人員用于測試應用程序。隨著系統的復雜程度的增加,并且有這么多工具可供使用,沒有什么理由不依靠單元測試。
      
      不過,開發人員不僅僅是程序員。我們與用戶交互以修復 bug 并確定需求。我們參加會議并進行電話推銷。我們完成一些(有時全部)質量保證功能。既然有這么多責任,希望盡可能自動化就是自然而然的了。因為好的團隊(除了其他事情外)會進行大量測試,希望自動化不同的開發過程的人常常會對這一領域進行詳細研究。
      
      自動化單元測試
      有許多種自動化所有項目測試用例的定位和執行的方法。一種解決方案是聯合使用 Ant 的 junit 任務與嵌入的 fileset 任務。這樣就可以包括和排除特定目錄中的文件(基于文件名樣式)。另一種選擇是使用 Eclipse 的一個功能,它可以指定所有測試所在的和執行的目錄。前一種選擇提供了對運行的測試進行過濾的靈活性(并且由于它是一個純粹的無頭(headless)Java 應用程序,可以運行在幾乎所有地方),后一種選擇可以調試“動態”包。是否可以結合這兩種方式的強大和靈活性?
      
      有了 Python 編程語言的 Java 平臺實現 —— Jython,回答是響亮的“可以!”(如果不熟悉 Jython,應當在繼續本文之前補充這方面知識,更多信息請參閱后面的 參考資料 )。利用 Jython 的強大和優雅,可以維護一個定位文件系統、搜索匹配某種樣式的類和動態編譯 JUnit TestSuite 類的腳本。這個 TestSuite 類像所有其他靜態定義的類一樣,可以用喜愛的調試程序容易地調試。(在本文中使用的例子假定使用的是 Eclipse IDE,不過,我在這里描述的技術不用做很多修改就可以用于大多數其他 IDE。)
      
      在進行任何設計決定時,必須對所做的選擇和決定的影響進行權衡。在這里,為了得到調試動態生成的測試包的能力,必須增加額外的復雜性。不過,這種復雜性被 Jython 自身所減輕了:Jython 經過很好測試并得到很好的支持,并且是開放源代碼的。而且,Python 越來越成為面向對象的、平臺獨立的編程的事實上的標準。出于這兩種原因,采用 Jython 的風險很少,特別是它提供了這樣的好處:在創建和調試動態生成的 JUnit TestSuite 類方面具有無可匹敵的靈活性。
      
      如果是否采用 Jython 是主要的考慮,那么即使不使用它也可以在解決原來的問題方面有所進展。不使用 Jython 的話,可以用一個 Java Property 文件存儲一組類、目錄和包,以在包中加入或者排除測試。不過,如果選擇使用 Jython,就可以利用整個 Python 語言和運行時來解決選擇執行哪些測試的問題。Python 腳本比 Java Property 文件靈活得多,它只受限于您的想像力。
      
      利用 Jython 與 Java 平臺的無縫集成可以創建靜態定義的、然而是動態構建的 TestSuite 類。有大量關于 JUnit 的教程,不過還是看下面這兩行代碼作為復習。清單 1 是靜態構建 TestSuite 類的一個例子(這個例子取自 JUnit: A Cook's Tour,有關它和其他 JUnit 資源的鏈接請參閱 參考資料):
      
      清單 1.靜態定義 TestSuite
      public static Test suite() {
      return new TestSuite( MoneyTest.class );
      }
      
      清單 1 表明 TestSuite 是由 Test 類的類實例組成的。這個裝具模塊完全利用了這一點。為了分析這個工具的代碼,應從 參考資料 中下載本文的示例 JAR 文件。這個文檔包含兩個文件:DynamicTestSuite.java 和 getalltests.py,前者是一個用 Phthon 腳本動態生成 TestSuite 的 JUnit 測試裝具模塊,后者是一個搜索匹配特定樣式的文件的 Python 腳本。DynamicTestSuite.java 使用 getalltests.py 構建 TestSuite??梢孕薷?getalltests.py 以更好地適合自己的項目的需要。
      
      了解測試裝具模塊
      代碼是如何工作的?首先,指派 getalltests.py 獲取一組要執行的 Test 類。然后,使用 Jython API 將這個列表從 Python 運行時環境中提取出來。然后使用 Java Reflection API 構建在表示 Test 類名的列表中的 String 對象的類實例。最后,用 JUnit API 將 Test 添加到 TestSuite 中。這四個庫的相互配合可以實現您的目標:動態構建的 TestSuite 可以像靜態定義的那樣運行。
      
      看一下清單 2 中的 JUnit suite 清單。它是一個公開 public static TestSuite suite() 方法簽名的 TestCase。由 JUnit 框架調用的 suite() 方法調用 getTestSuite(), getTestSuite() 又調用 getClassNamesViaJython() 以獲取一組 String 對象,其中每一個對象表示一個作為包的一部分的 TestCase 類。
      
      清單 2. 動態定義 TestSuite
      
      /**
      * @return TestSuite A test suite containing all our tests (as found by Python script)
      */
      private TestSuite getTestSuite() {
      TestSuite suite = new TestSuite();
      
      // get Iterator to class names we're going to add to our Suite
      Iterator testClassNames = getClassNamesViaJython().iterator();
      
      while( testClassNames.hasNext() ) {
      String classname = testClassNames.next().toString();
      
      try {
      // construct a Class object given the test case class name
      Class testClass = Class.forName( classname );
      
      // add to our suite
      suite.addTestSuite( testClass );
      
      System.out.println( "Added: " + classname );
      }
      catch( ClassNotFoundException e ) {
      StringBuffer warning = new StringBuffer();
      warning.append( "Warning: Class '" ).append( classname ).append( "' not found." );
      System.out.println( warning.toString() );
      }
      }
      
      return suite;
      }
      
      在開始時,要保證設置了正確的系統屬性。在內部,Jython 將使用 python.home 屬性來定位它所需要的文件。最終會調用 getClassNamesViaJython() 方法,在這里面會有一些奇妙的事情發生,如在清單 3 中將會看到的。
      
      清單 3. 從 Python 運行時提取 Java 對象
      
      /**
      * Get list of tests we're going to add to our suite
      * @return List A List of String objects, each representing class name of a TestCase
      */
      private List getClassNamesViaJython() {
      // run python script
      interpreter.execfile( getPathToScript() );
      
      // extract out Python object named PYTHON_OBJECT_NAME
      PyObject allTestsAsPythonObject = interpreter.get( PYTHON_OBJECT_NAME );
      
      // convert the Python object to a String[]
      String[] allTests = (String[]) allTestsAsPythonObject.__tojava__( String[].class );
      
      // add all elements of array to a List
      List testList = new ArrayList();
      testList.addAll( Arrays.asList( allTests ) );
      
      return testList;
      }
      
      首先,對 Python 文件進行判斷。然后,從 Python 運行時提取出一個 PyObject。這就是得到的對象,它包含將構成測試包的所有測試用例的類名(記住 —— PyObject 是 Python 對象的 Java 運行時對應物)。然后創建具體的 List 并用 PyObject 填充它,使用 __tojava__ 指示 PyObject 將其內容轉換為一個 Java String 數組。最后,將控制返回 getTestSuite(),在這里裝載 Jython 標識的測試用例,并將它們添加到組合包(composite)中。
      
      在開發環境中安裝測試裝具模塊
      現在對于測試裝具模塊如何工作已經有了很好的認識,可能迫不及待要自己試試它了。您將需要完成以下步驟以配置 Eclipse 來運行這個裝具模塊。(如果使用不同的 IDE,應當可以容易地針對您的環境修改這些步驟。)
      
      安裝 Jython 2.1,如果還沒安裝的話。(鏈接請見 參考資料 )。
      
      拷貝 getalltests.py 到主目錄。
      
      編輯 getalltests.py 第 25 行以指定到源文件的根路徑,會搜索在這個位置下的所有目錄中與 org 包中 *Text.java 匹配的文件名。
      如果有必要,修改第 54 行以改變根包名(例如,改為 com)。
      
      將 DynamicTestSuite.java 拷貝到源樹中。
      
      將以下 JAR 添加到 Eclipse 項目中:
      junit.jar (JUnit 框架二進制文件,下載信息請參閱 JUnit 的 Web 網站)。
      jython.jar(Jython 二進制文件,位于 Jython 安裝目錄)。
      
      將 DynamicTestSuite 類裝載到 Eclipse Java 源文件編輯器中。執行以下步驟之一:
      在 Package Explorer 視圖中選擇 DynamicTestSuite,或者
      按 Ctrl+Shift+T 并在 Choose Type 輸入字段鍵入 DynamicTestSuite。
      
      從文件菜單欄選擇 Run,然后選擇 Debug...。
      
      選擇 JUnit 配置。
      
      單擊 New 按鈕。將會創建一個新的 JUnit 目標,DynamicTestSui

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品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>