国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Jython開發(fā)的JUnit測(cè)試包

開發(fā) 后端
本文講述如何使用Jython開發(fā)JUnit測(cè)試包。開發(fā)人員有多種理由決定自動(dòng)化單元測(cè)試。許多人甚至進(jìn)一步發(fā)揮它,自動(dòng)化這些測(cè)試的定位和執(zhí)行。

JUnit 測(cè)試框架被越來越多的開發(fā)小組所共同使用。歸功于各種各樣的測(cè)試裝具模塊,現(xiàn)在可以測(cè)試構(gòu)成任何 Java 應(yīng)用程序的幾乎每一個(gè)組件。事實(shí)上,幾乎整個(gè)二級(jí)市場(chǎng)似乎都是用圍繞 Junit 建立的。包括 Cactus、jfcUnit、XMLUnit、DbUnit 和 HttpUnit 這樣的裝具模塊都可以免費(fèi)供開發(fā)人員用于測(cè)試應(yīng)用程序。隨著系統(tǒng)的復(fù)雜程度的增加,并且有這么多工具可供使用,沒有什么理由不依靠單元測(cè)試。

不過,開發(fā)人員不僅僅是程序員。我們與用戶交互以修復(fù) bug 并確定需求。我們參加會(huì)議并進(jìn)行電話推銷。我們完成一些(有時(shí)全部)質(zhì)量保證功能。既然有這么多責(zé)任,希望盡可能自動(dòng)化就是自然而然的了。因?yàn)楹玫膱F(tuán)隊(duì)(除了其他事情外)會(huì)進(jìn)行大量測(cè)試,希望自動(dòng)化不同的開發(fā)過程的人常常會(huì)對(duì)這一領(lǐng)域進(jìn)行詳細(xì)研究。

自動(dòng)化單元測(cè)試

有許多種自動(dòng)化所有項(xiàng)目測(cè)試用例的定位和執(zhí)行的方法。一種解決方案是聯(lián)合使用 Ant 的 junit 任務(wù)與嵌入的 fileset 任務(wù)。這樣就可以包括和排除特定目錄中的文件(基于文件名樣式)。另一種選擇是使用 Eclipse 的一個(gè)功能,它可以指定所有測(cè)試所在的和執(zhí)行的目錄。前一種選擇提供了對(duì)運(yùn)行的測(cè)試進(jìn)行過濾的靈活性(并且由于它是一個(gè)純粹的無頭(headless)Java 應(yīng)用程序,可以運(yùn)行在幾乎所有地方),后一種選擇可以調(diào)試“動(dòng)態(tài)”包。是否可以結(jié)合這兩種方式的強(qiáng)大和靈活性?

有了 Python 編程語言的 Java 平臺(tái)實(shí)現(xiàn)——Jython,回答是響亮的“可以!”(如果不熟悉 Jython開發(fā),應(yīng)當(dāng)在繼續(xù)本文之前補(bǔ)充這方面知識(shí),更多信息請(qǐng)參閱后面的 參考資料)。利用 Jython 的強(qiáng)大和優(yōu)雅,可以維護(hù)一個(gè)定位文件系統(tǒng)、搜索匹配某種樣式的類和動(dòng)態(tài)編譯 JUnit TestSuite 類的腳本。這個(gè) TestSuite 類像所有其他靜態(tài)定義的類一樣,可以用喜愛的調(diào)試程序容易地調(diào)試。(在本文中使用的例子假定使用的是 Eclipse IDE,不過,我在這里描述的技術(shù)不用做很多修改就可以用于大多數(shù)其他 IDE。)

在進(jìn)行任何設(shè)計(jì)決定時(shí),必須對(duì)所做的選擇和決定的影響進(jìn)行權(quán)衡。在這里,為了得到調(diào)試動(dòng)態(tài)生成的測(cè)試包的能力,必須增加額外的復(fù)雜性。不過,這種復(fù)雜性被 Jython 自身所減輕了:Jython 經(jīng)過很好測(cè)試并得到很好的支持,并且是開放源代碼的。而且,Python 越來越成為面向?qū)ο蟮摹⑵脚_(tái)獨(dú)立的編程的事實(shí)上的標(biāo)準(zhǔn)。出于這兩種原因,采用 Jython開發(fā) 的風(fēng)險(xiǎn)很少,特別是它提供了這樣的好處:在創(chuàng)建和調(diào)試動(dòng)態(tài)生成的 JUnit TestSuite 類方面具有無可匹敵的靈活性。

如果是否采用 Jython 是主要的考慮,那么即使不使用它也可以在解決原來的問題方面有所進(jìn)展。不使用 Jython 的話,可以用一個(gè) Java Property 文件存儲(chǔ)一組類、目錄和包,以在包中加入或者排除測(cè)試。不過,如果選擇使用 Jython,就可以利用整個(gè) Python 語言和運(yùn)行時(shí)來解決選擇執(zhí)行哪些測(cè)試的問題。Python 腳本比 Java Property 文件靈活得多,它只受限于您的想像力。

利用 Jython 與 Java 平臺(tái)的無縫集成可以創(chuàng)建靜態(tài)定義的、然而是動(dòng)態(tài)構(gòu)建的 TestSuite 類。有大量關(guān)于 JUnit 的教程,不過還是看下面這兩行代碼作為復(fù)習(xí)。清單 1 是靜態(tài)構(gòu)建 TestSuite 類的一個(gè)例子(這個(gè)例子取自 JUnit: A Cook's Tour,有關(guān)它和其他 JUnit 資源的鏈接請(qǐng)參閱 參考資料):

清單 1.靜態(tài)定義 TestSuite

  1. public static Test suite() {  
  2.     return new TestSuite( MoneyTest.class );  

清單 1 表明 TestSuite 是由 Test 類的類實(shí)例組成的。這個(gè)裝具模塊完全利用了這一點(diǎn)。為了分析這個(gè)工具的代碼,應(yīng)從 參考資料中下載本文的示例 JAR 文件。這個(gè)文檔包含兩個(gè)文件:DynamicTestSuite.java 和 getalltests.py,前者是一個(gè)用 Phthon 腳本動(dòng)態(tài)生成 TestSuite 的 JUnit 測(cè)試裝具模塊,后者是一個(gè)搜索匹配特定樣式的文件的 Python 腳本。DynamicTestSuite.java 使用 getalltests.py 構(gòu)建 TestSuite 。可以修改 getalltests.py 以更好地適合自己的項(xiàng)目的需要。

了解測(cè)試裝具模塊

代碼是如何工作的?首先,指派 getalltests.py 獲取一組要執(zhí)行的 Test 類。然后,使用 Jython API 將這個(gè)列表從 Python 運(yùn)行時(shí)環(huán)境中提取出來。然后使用 Java Reflection API 構(gòu)建在表示 Test 類名的列表中的 String 對(duì)象的類實(shí)例。最后,用 JUnit API 將 Test 添加到 TestSuite 中。這四個(gè)庫(kù)的相互配合可以實(shí)現(xiàn)您的目標(biāo):動(dòng)態(tài)構(gòu)建的 TestSuite 可以像靜態(tài)定義的那樣運(yùn)行。

看一下清單 2 中的 JUnit suite 清單。它是一個(gè)公開 public static TestSuite suite() 方法簽名的 TestCase 。由 JUnit 框架調(diào)用的 suite() 方法調(diào)用 getTestSuite() , getTestSuite() 又調(diào)用 getClassNamesViaJython() 以獲取一組 String 對(duì)象,其中每一個(gè)對(duì)象表示一個(gè)作為包的一部分的 TestCase 類。

清單 2. 動(dòng)態(tài)定義 TestSuite

  1. /**  
  2.  * @return TestSuite A test suite containing all our tests (as found by Python script)  
  3.  */ 
  4. private TestSuite getTestSuite() {  
  5.     TestSuite suite = new TestSuite();  
  6.     // get Iterator to class names we're going to add to our Suite  
  7.     Iterator testClassNames = getClassNamesViaJython().iterator();  
  8.     while( testClassNames.hasNext() ) {  
  9.         String classname = testClassNames.next().toString();  
  10.         try {  
  11.             // construct a Class object given the test case class name  
  12.             Class testClass = Class.forName( classname );  
  13.             // add to our suite  
  14.             suite.addTestSuite( testClass );  
  15.             System.out.println( "Added: " + classname );  
  16.         }  
  17.         catch( ClassNotFoundException e ) {  
  18.             StringBuffer warning = new StringBuffer();  
  19.             warning.append( "Warning: Class '" ).append( classname ).append( "' not found." );  
  20.             System.out.println( warning.toString() );  
  21.         }  
  22.     }  
  23.     return suite;  

在開始時(shí),要保證設(shè)置了正確的系統(tǒng)屬性。在內(nèi)部,Jython 將使用 python.home 屬性來定位它所需要的文件。最終會(huì)調(diào)用 getClassNamesViaJython() 方法,在這里面會(huì)有一些奇妙的事情發(fā)生,如在清單 3 中將會(huì)看到的。

清單 3. 從 Python 運(yùn)行時(shí)提取 Java 對(duì)象

  1. /**  
  2.  * Get list of tests we're going to add to our suite  
  3.  * @return List A List of String objects, each representing class name of a TestCase  
  4.  */  
  5. private List getClassNamesViaJython() {  
  6.     // run python script  
  7.     interpreter.execfile( getPathToScript() );  
  8.     // extract out Python object named PYTHON_OBJECT_NAME  
  9.     PyObject allTestsAsPythonObject = interpreter.get( PYTHON_OBJECT_NAME );  
  10.     // convert the Python object to a String[]  
  11.     String[] allTests = (String[]) allTestsAsPythonObject.__tojava__( String[].class );  
  12.     // add all elements of array to a List  
  13.     List testList = new ArrayList();  
  14.     testList.addAll( Arrays.asList( allTests ) );  
  15.     return testList;  
  16. }  
  17.                   

首先,對(duì) Python 文件進(jìn)行判斷。然后,從 Python 運(yùn)行時(shí)提取出一個(gè) PyObject 。這就是得到的對(duì)象,它包含將構(gòu)成測(cè)試包的所有測(cè)試用例的類名(記住 -- PyObject 是 Python 對(duì)象的 Java 運(yùn)行時(shí)對(duì)應(yīng)物)。然后創(chuàng)建具體的 List 并用 PyObject 填充它,使用 __tojava__ 指示 PyObject 將其內(nèi)容轉(zhuǎn)換為一個(gè) Java String 數(shù)組。最后,將控制返回 getTestSuite() ,在這里裝載 Jython 標(biāo)識(shí)的測(cè)試用例,并將它們添加到組合包(composite)中。

在Jython開發(fā)環(huán)境中安裝測(cè)試裝具模塊

現(xiàn)在對(duì)于測(cè)試裝具模塊如何工作已經(jīng)有了很好的認(rèn)識(shí),可能迫不及待要自己試試它了。您將需要完成以下步驟以配置 Eclipse 來運(yùn)行這個(gè)裝具模塊。(如果使用不同的 IDE,應(yīng)當(dāng)可以容易地針對(duì)您的環(huán)境修改這些步驟。)

安裝 Jython 2.1,如果還沒安裝的話。(鏈接請(qǐng)見 參考資料)。

拷貝 getalltests.py 到主目錄。

編輯 getalltests.py 第 25 行以指定到源文件的根路徑,會(huì)搜索在這個(gè)位置下的所有目錄中與 org 包中 *Text.java 匹配的文件名。

如果有必要,修改第 54 行以改變根包名(例如,改為 com)。

將 DynamicTestSuite.java 拷貝到源樹中。

將以下 JAR 添加到 Eclipse 項(xiàng)目中:

junit.jar (JUnit 框架二進(jìn)制文件,下載信息請(qǐng)參閱 JUnit 的 Web 網(wǎng)站)。

jython.jar(Jython 二進(jìn)制文件,位于 Jython 安裝目錄)。

將 DynamicTestSuite 類裝載到 Eclipse Java 源文件編輯器中。執(zhí)行以下步驟之一:

在 Package Explorer 視圖中選擇 DynamicTestSuite ,或者

按 Ctrl+Shift+T并在 Choose Type 輸入字段鍵入 DynamicTestSuite 。

從文件菜單欄選擇 Run,然后選擇 Debug...。

選擇 JUnit配置。

單擊 New按鈕。將會(huì)創(chuàng)建一個(gè)新的 JUnit 目標(biāo), DynamicTestSuite 應(yīng)當(dāng)預(yù)填入 Test Class 字段。

選擇 Arguments選項(xiàng)卡。

在 VM 參數(shù)文本框中鍵入 -Dpython.home=<path where you installed Jython> 。

單擊 Debug按鈕。

變!現(xiàn)在就有了一個(gè)具體的 JUnit TestCase 類,可以像靜態(tài)定義的包那樣處理它。設(shè)置邊界并進(jìn)行調(diào)試!不需要修改 Test 類,裝具模塊將構(gòu)建一個(gè)包,就像您顯式將每一個(gè) Class 對(duì)象編寫到包中一樣。如要執(zhí)行測(cè)試,可以通過喜愛的調(diào)試器、編譯工具(如 Ant 或 CruiseControl),或者一個(gè) JUnit 內(nèi)含的 test runner 調(diào)用這個(gè)裝具模塊。

擴(kuò)展這個(gè)裝具模塊

我相信您注意到了除非在運(yùn)行前修改源代碼,否則這個(gè)裝具模塊只能用于一個(gè)項(xiàng)目。可以容易地?cái)U(kuò)展這個(gè)裝具模塊讓它支持多個(gè)項(xiàng)目。一種簡(jiǎn)單的方式是修改 getPathToScript() 以使用指定特定于項(xiàng)目的屬性的系統(tǒng)屬性。

【編輯推薦】

  1. 創(chuàng)建Jython類的過程探討
  2. 輕松創(chuàng)建Jython全局函數(shù)
  3. 直接在源文件中編寫Jython代碼
  4. Jython入門指導(dǎo):語言特性簡(jiǎn)介
  5. Jython的字符串操作和函數(shù)
責(zé)任編輯:yangsai 來源: IBMDW
相關(guān)推薦

2009-07-16 13:09:46

Jython安裝

2009-06-19 16:26:51

JUnit測(cè)試骨架

2011-03-30 16:54:13

JUnit

2009-07-14 15:20:25

Jython腳本Jython解釋器

2009-07-10 17:33:39

jython語言什么是JythonJython

2013-01-07 13:54:17

Android開發(fā)JUnit單元測(cè)試

2009-07-14 18:45:26

Jython開發(fā)特性

2011-11-18 15:18:41

Junit單元測(cè)試Java

2011-08-11 13:02:43

Struts2Junit

2012-02-07 09:08:50

Feed4JUnitJava

2009-07-14 15:27:17

Jython腳本示例

2009-07-15 17:43:20

Jython類

2009-07-16 14:26:44

Python和Jyth

2009-07-10 18:10:18

Jython編寫SerJython

2020-12-30 07:08:27

Java方法測(cè)試

2012-03-13 16:14:09

JavaJUnit

2009-07-15 18:29:22

Jython應(yīng)用

2009-07-15 16:29:39

Jython連接JavJavaUtils模塊

2009-10-09 15:18:05

Jython

2009-07-14 18:34:22

Jython操作符重載
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

伊人久久大香线蕉av一区二区| 国产成人精品午夜视频免费| 成年网站在线视频网站| 欧美少妇性生活视频| 欧美黄色直播| 成人久久一区二区三区| 久久国产精品网站| 91精品国模一区二区三区| 国产精品久久久久桃色tv| 国产一区三区三区| 在线欧美视频| 亚洲精品网址| 欧美久久亚洲| 色豆豆成人网| 91社区在线观看| 青梅竹马是消防员在线| 369你懂的电影天堂| 一区二区三区我不卡| 精品无人区一区二区三区| 成人国产精品色哟哟| 日本国产高清不卡| 亚洲小视频在线| 亚洲伦理中文字幕| 一区二区成人精品| 日韩精品一二三四区| 精品国产三级电影在线观看| 欧美日韩色一区| 欧美日韩在线视频一区| 亚洲国产精品久久人人爱蜜臀 | 国产欧美一级| 综合激情一区| 国产欧美日韩| 国产精品久久久久无码av| 国产在线日韩精品| 欧美jjzz| 精品一区二区三区影院在线午夜| 亚州av乱码久久精品蜜桃| 精品视频在线一区二区在线| 国产精成人品2018| 黄色精品视频| 一区二区三区亚洲变态调教大结局 | av观看在线| caopo在线| 国产三级一区| 91tv亚洲精品香蕉国产一区| 国产剧情一区二区在线观看| 9国产精品午夜| 96视频在线观看欧美| 中文精品一区二区| 亚洲国产精品成人| 久久99久久99精品免视看婷婷| 国产成人在线电影| 亚洲精品成人悠悠色影视| 北条麻妃一区二区三区| 国产精品色哟哟| 亚洲欧洲美洲综合色网| 色综合久久九月婷婷色综合| 亚洲精品成a人在线观看| 国产一区二区三区在线视频| 日韩一区视频在线| 91久久精品美女| 蜜桃成人在线| av无码精品一区二区三区| 在线国产网址| av大片在线观看| 美女久久精品| 久久九九国产| 亚洲成av人片在线观看无码| 精品一区电影国产| 狠狠色综合一区二区| 69堂免费视频| 免费资源在线观看| 香蕉国产成人午夜av影院| 欧美日韩一区二区三区四区在线观看| 国产伦精品一区二区三区视频青涩| 椎名由奈av一区二区三区| 精品国产伦一区二区三区观看方式 | 国产99视频精品免费视频36| 成人3d动漫一区二区三区91| 日韩在线一级片| av中文资源在线| 女仆av观看一区| 久久激情五月婷婷| 欧美午夜精品久久久久久久| 久久精品电影网| 欧美极品jizzhd欧美| 91黑丝在线| 婷婷久久免费视频| 日韩精品乱码免费| 欧美日韩午夜在线| 97在线视频一区| av免费看网址| 久久99亚洲网美利坚合众国| 国产精品玖玖玖在线资源| 久久综合九色综合97婷婷| 精品亚洲国产视频| www.成人三级视频| 成人网视频在线观看| 精品国产一级毛片| 1024成人网色www| 亚洲人成人99网站| 欧美 日韩 国产精品| 鲁鲁在线中文| 国产综合久久久久久鬼色| 日韩精品在线免费| 福利视频一区二区三区四区| 欧美videos另类精品| 国产精品久久久久久久久久妞妞| 日本福利一区二区| 欧美一区二区在线| 午夜裸体女人视频网站在线观看| 美女精品一区| 一区二区三区视频免费在线观看| 激情五月婷婷六月| 成人日韩欧美| 风间由美性色一区二区三区| 一区二区三区日韩在线| www黄色日本| 精品视频99| 日韩一区二区三区视频在线观看| 自拍偷拍一区二区三区| 91超碰在线播放| 中文成人av在线| 国产欧美日韩亚洲精品| 精品国产一区二区三区四区阿崩| 久久久久久久久99精品大| 欧美成人在线直播| 三级a在线观看| 影音先锋久久久| 在线看片第一页欧美| 韩国一区二区av| 色一区二区三区四区| 欧美一区二区三区影视| 久久亚洲a v| 亚洲精华一区二区三区| 亚洲第一在线综合网站| 亚洲精品欧洲精品| 免费日韩一区二区三区| 欧美欧美午夜aⅴ在线观看| 午夜午夜精品一区二区三区文| 91久久偷偷做嫩草影院电| 亚洲国产精品综合小说图片区| 高清国产一区| 在线综合色站| 欧美日韩国产综合草草| 国产九九热视频| 亚洲第一区色| 俺也去精品视频在线观看| lutube成人福利在线观看| 天堂在线亚洲视频| 亚洲风情在线资源站| 69久久夜色精品国产69蝌蚪网| 丁香婷婷综合激情| 米奇777在线欧美播放| 欧美裸体男粗大视频在线观看| 黄色片网站在线| 亚洲国产乱码最新视频| 激情成人开心网| 亚洲精品韩国| 91精品在线免费| 亚洲香蕉成人av网站在线观看| 日韩在线观看免费高清| 97国产精品视频人人做人人爱| 日本中文字幕在线视频| 精品国产91久久久久久老师| 日韩一区二区三区久久| eeuss影院一区二区三区| 中文字幕一区二区三区有限公司| 中文欧美日韩| 久久精品日产第一区二区三区| 国产精品久久天天影视| 国产精品丝袜视频| 色中色综合网| 99在线观看视频网站| 欧美在线黄色| 欧美人与性禽动交精品| 国产精品国产三级在线观看| 黑人巨大精品欧美一区二区免费| 不卡一区二区三区视频| av中文天堂在线| 97精品久久久午夜一区二区三区 | 国产精品一二三在| 亚洲色无码播放| 久久久久久77777| 国产精品亚洲综合久久| 国产婷婷成人久久av免费高清| 神马伦理电影| 国产亚洲欧美日韩在线一区| 国产又猛又黄的视频| 国产精品66部| 亚欧洲精品在线视频免费观看| 日韩av二区在线播放| 91免费在线观看网站| 999久久久91| 国产精品丝袜白浆摸在线| 激情在线视频播放| 亚洲精品国产suv| 婷婷综合六月| 亚洲福利视频久久| 69日小视频在线观看|