亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用Jython構建JUnit測試包

2019-11-18 13:42:57
字體:
來源:轉載
供稿:網友

  開發人員有多種理由決定自動化單元測試。許多人甚至進一步發揮它,自動化這些測試的定位和執行。但是假如想要測試裝具模塊(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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲码在线观看| 97在线观看免费高清| 亚洲a在线观看| 欧美精品亚州精品| 日韩女优人人人人射在线视频| 欧美日韩国产在线播放| 一本大道亚洲视频| 国产婷婷色综合av蜜臀av| 亚洲欧美国产一本综合首页| 久久久久久这里只有精品| 中文字幕综合一区| 亚洲最大av网| 亚洲大胆人体视频| 国产精品免费视频久久久| 中文字幕日韩欧美| 欧美剧在线观看| 国产精品夫妻激情| 亚洲黄页网在线观看| 久久精品夜夜夜夜夜久久| 91美女高潮出水| 久久久精品国产一区二区| 日韩欧美成人免费视频| 亚洲国产精品人人爽夜夜爽| 成人性教育视频在线观看| 欧美成人免费va影院高清| 日韩精品视频免费在线观看| 91色视频在线导航| 欧美综合激情网| 亚洲精品国产精品久久清纯直播| 在线精品高清中文字幕| 亚洲欧美日韩精品久久奇米色影视| 亚洲人成在线免费观看| 77777少妇光屁股久久一区| 亚洲福利影片在线| 国产视频久久久| 国产亚洲成av人片在线观看桃| 精品小视频在线| 日韩在线视频网| 91精品国产综合久久久久久久久| 欧美在线一区二区视频| 欧美日韩亚洲成人| 欧美精品在线网站| 日韩国产精品一区| 亚洲色图av在线| 91精品在线看| 亚洲国产黄色片| 国产精品麻豆va在线播放| 亚洲人成免费电影| 欧美极品少妇xxxxⅹ裸体艺术| 欧美成人性生活| 亚洲国内精品视频| 97免费视频在线播放| 久久久99免费视频| 日韩精品福利在线| 日韩在线一区二区三区免费视频| 欧美激情免费在线| 97香蕉久久夜色精品国产| 国产一区欧美二区三区| 日韩成人中文字幕在线观看| 亚洲一区二区三区xxx视频| 夜夜嗨av一区二区三区四区| 91久久精品国产91久久| 欧美超级乱淫片喷水| 57pao国产成人免费| 另类色图亚洲色图| 在线成人一区二区| 欧美精品www| 国产精品免费福利| 欧美另类高清videos| 亚洲福利在线视频| 北条麻妃一区二区在线观看| 国产精品免费久久久久影院| 色七七影院综合| 国产精品嫩草影院久久久| 久久天天躁狠狠躁夜夜av| 欧美刺激性大交免费视频| 精品福利一区二区| 国产精品九九久久久久久久| 98午夜经典影视| 欧美国产视频一区二区| 亚洲人成在线电影| 播播国产欧美激情| 欧美黄色小视频| 亚洲福利影片在线| 国产美女精品视频免费观看| 久久九九全国免费精品观看| 亚洲综合中文字幕68页| 欧美国产日韩一区二区三区| 最近中文字幕mv在线一区二区三区四区| 欧美一级淫片aaaaaaa视频| 欧美老少配视频| 亚洲开心激情网| 久久久人成影片一区二区三区| 黑人狂躁日本妞一区二区三区| 欧美激情欧美激情| 在线不卡国产精品| 2019av中文字幕| 久久人人97超碰精品888| 国产精品久久久久久搜索| 北条麻妃一区二区三区中文字幕| 在线观看国产精品日韩av| 欧美精品一区在线播放| 午夜精品久久久久久久99热浪潮| 亚洲国产精品久久久久久| 欧美精品在线第一页| 日韩亚洲欧美成人| 国产成人综合亚洲| 欧美成人精品在线播放| 亚洲国产高潮在线观看| 国产精品一区二区性色av| 亚洲最新av在线| 97精品视频在线观看| 久久亚洲精品成人| 日韩精品视频在线| 欧美激情乱人伦一区| 欧美精品在线免费| 欧美老妇交乱视频| 97视频在线观看网址| 中文字幕亚洲综合| 红桃视频成人在线观看| 日韩精品999| 亚洲高清久久网| 91极品视频在线| 欧美专区国产专区| 国产免费成人av| 国产精品美女久久久免费| 精品视频偷偷看在线观看| 萌白酱国产一区二区| 综合激情国产一区| 国产91成人在在线播放| 亚洲欧美精品suv| 国产精品jizz在线观看麻豆| 欧美疯狂xxxx大交乱88av| 国产成人精品免高潮费视频| 97视频免费观看| 性欧美xxxx视频在线观看| 午夜精品免费视频| 亚洲精品久久7777777| 欧美大片在线免费观看| 日韩精品免费一线在线观看| 精品高清美女精品国产区| 国产午夜精品一区二区三区| 国产在线精品成人一区二区三区| 国产精品18久久久久久首页狼| 57pao成人永久免费视频| 欧美日韩国产成人高清视频| 亚洲在线观看视频网站| 91成人在线播放| 国产精品高潮在线| 成人福利视频在线观看| 精品国产美女在线| 亚洲毛片在线免费观看| 久久精品国产欧美亚洲人人爽| 日韩av在线网站| 国产高清在线不卡| 日韩高清人体午夜| 国产精品揄拍一区二区| 91视频-88av| 91欧美精品成人综合在线观看| 岛国av在线不卡| 色多多国产成人永久免费网站| 久久韩国免费视频| 亚洲精品91美女久久久久久久| 日本成熟性欧美|