來源: javafan
在本文中,我會分析3款聲稱能驗證你的Web services的正確性的工具:soapUI、TestMaker和WebInject。三款都是開源的,能免費下載并整合到你的下一個Web services項目中去?! ∮捎贗T界對Web services的持續關注和偏愛,以及越來越多的Web-service構建工具的出現,Web service變得更加容易創建 – 并且,很容易一團糟?! eb service其實就是一些暴露給網絡(不管是內網還是外網)的程序的集合。而一個Web service的錯誤可能激怒的不僅僅是監視和維護著服務器的經理和管理員,還有調用了你的Web service的客戶。要么把你的Web service做好,要么等著兩邊的指責?! ?/P>
在本文中,我會分析3款聲稱能驗證你的Web services的正確性的工具:soapUI、TestMaker和WebInject。三款都是開源的,能免費下載并整合到你的下一個Web services項目中去?! ?/P>
需要注意的是:在使用這些工具之前你應該理解SOAP和HTTP協議。有些商業產品提供的是SOAP的“偽代碼”。把那些難于閱讀的XML翻譯成易讀的偽代碼,能幫助新手和有經驗的SOAP用戶明白某個SOAP請求和響應之間發生的事情。這三款開源的Web service測試工具需要額外的工作,我推薦中等級別的開發人員使用,學習曲線會適當地比商業產品的長?! ?/P>
SoapUI1.6 我用的是1.6版本的soapUI,一款從Eviware而來的基于Java的工具。這個版本的soapUI在自己獨立的UI里執行;新的1.7版本包括NetBeans、InterlliJ和Eclipse的插件?! ?/P>
用戶界面遵循普遍的IDE架構設計:左邊是導航面板,右邊是內容面板,額外的屬性面板放在底部。如果你用過類似Visual Studio的IDE的話,你會發現使用soapUI很順手?! ?/P>
soapUI把工作組織成項目。每個項目主要由需要測試的接口來識別。在這里,接口是指另外一端的指向一個暴露了Web service方法的站點的URI(統一資源標識)。你可以很快地創建一個基本的項目結構;soapUI能接受一個文件的WSDL或者一個Web service終點傳輸的WSDL?! ?/P>
項目被有層次結構地組織,并且包含一個或多個TestSuite,TestSuite包含一個或多個TestCase,TestCase包含一個或多個測試步驟。真正的工作 – 發送請求、接受響應、分析結果、改變測試執行流程 – 發生在測試步驟這個層面。TestCase收集和組織需要執行某個對目標的特定操作的步驟。TestSuite匯總那些發生在某個特定區域的Web service的TestCase(例如訂購一本書所需要的操作)。你可以通過右鍵點擊項目樹中的父節點并選擇上下文菜菜單中的“New”菜單,來創建新的TestSuite、TestCase和測試步驟?! ?/P>
soapUI通過檢查附加給測試響應的斷言來判斷測試是通過還是失敗。有大量的斷言可供選擇,從“simple contains”測試 – 如果某個提供的字符串匹配則表示成功 – 到“XPath matching”,對響應信息執行復雜的XPath表達式匹配成功則表示測試通過?! y試步驟與程序代碼很類似。目前,soapUI定義了6個測試步驟類型,最普遍的是請求(Request),發送一個HTTP請求給目標地址,并接收一個響應??刹迦霔l件跳轉測試步驟(Conditonal GoTo)來控制流程。一個或多個檢查最近的響應的Xpath表達式是必不可少的。第一個表達式的成功會導致相關測試步驟分支的執行?! ?/P>
soapUI最強大的是Groovy測試步驟。Groovy是類Java的輕量級腳本語言。一個Groovy測試步驟可以是任何Groovy代碼,也就是說基本上Groovy能做的事情,在測試步驟中也能做。測試步驟中的Groovy代碼可以訪問soapUI框架。例如,一個Groovy測試步驟可以通過JDBC讀取數據庫的信息,與前一個測試步驟的響應信息進行比較,并響應地修改執行的流程 – 甚至執行另外一個TestCase?! ?/P>
除了功能測試外,soapUI還能對Web service進行壓力測試。每個壓力測試包含一個或多個TestCase的執行,并且可以調整用于模擬各種各樣的場景。你可以指定測試執行一定量的時間長度,或者一定量的迭代周期,指定以并發的方式執行還是隨時間線性變化的方式?! ‘攭毫y試完成后,一個壓力測試編輯器會為每個TestCase提供大量的統計數據:執行的次數,最大、最小、平均執行時間等。還可以在統計圖表頁以圖表的形式查看這些數據?! ?/P>
讓soapUI運行起來很容易;能很快地構建一個基本的項目和基本的測試。我對這個工具不滿的地方是:在系統中沒有上下文幫助,這讓你在某些區域想知道可供選擇的是什么變得困難。不管怎樣,文檔提供的還是挺不錯的,只要持續使用,一些最初的理解上的混淆都會慢慢消失。TestMaker TestMaker是PushToTest的一個Web service測試工具。它需要Java1.4或以上。我把TestMaker4.4安裝在Ubuntu Linux6.10,看Web service測試在Linux會是怎樣的。安裝很簡單,一旦設置好JAVA_HOME環境變量后,TestMaker啟動和運行都沒有問題?! ?/P>
TestMaker的測試是用稱為“測試代理”(test agents)的腳本來完成的。TestMaker提供一個“代理向導”(Agent Wizard)來讀入WSDL定義并自動創建一個測試代理的基本結構?! ?/P>
需要指出的是:TestMaker不僅僅能測試Web services;它還能被用于測試Web應用程序。與TestMaker綁定在一起的還有一個網絡監視工具,能監視瀏覽器和目標Web應用之間的HTTP通信,并且從交互過程中產生測試用例。然而,我沒有體驗那些功能,因為那與Web services的關系不大?! ?/P>
TestMaker的測試代理是用Jython(用Java寫的Python)寫的。這是把雙刃劍。一方面,TestMaker的腳本可以變得很強大,擁有編程能力。Jython可以訪問所有Java庫,還有TestMaker提供的類和方法。TestMaker最大的庫是TOOL(Test Object Oriented Library),它包括所有處理各種通訊協議的類:HTTP,HTTPS、SOAP、JDBC等。因此,你可以創建很精細的測試用例來處理任何Web service可能被調用的客戶端應用?! ×硪环矫?,你需要掌握Jython來充分利用TestMaker,或者換句話說,你需要知道Python和Java。這未必是件壞事,但是它絕對意味著TestMaker的學習曲線要比其他工具陡峭?! ?/P>
由代理向導(Agent Wizard)創建的基本的測試代理(test agent)是很簡單的:它知道目標服務的Web方法,并且執行不會出現錯誤,但是它沒有真正執行任何請求、響應或者測試結果。我發現我需要檢查一個測試代理例子的源代碼來填寫缺少的內容?! ?/P>
一旦你跨越了陡峭的學習曲線,就可以很容易地通過拷貝、粘貼和調整已有的代碼來創建新的測試。另外,用戶界面的用戶體驗很好。最開始啟動TestMaker的時候,它會打開一個“QuickStart”窗口,在這里,你可以運行代理向導(Agent Wizard),直接跳到測試代理提供的例子,或者深入閱讀它的文檔。TestMaker的用戶界面也是標準的多窗口IDE,左邊是導航面板,右邊是編輯區域,結果顯示區域在右下端,類導航視圖界面在左下端?! ?/P>
TestMaker可以在命令行執行,因此,你的測試代理(test agent)可以被自動化系統執行。另外,TestMaker還綁定了Apache Axis TCPMonitor工具,它讓你可以監視某個端口的HTTP信息交換。這對于檢查內部請求/響應對來決定如何編寫Jython測試代碼時會很有用?! ?/P>
商業的TestMaker版本添加了XSTest,提供性能測試和容量測試(Scalabillity testing),一個監視面板提供實時的結果,報告能力,還有TestNetWork – 能遠程執行測試代理(test agent),因此,允許你搭建測試代理服務器來同時測試目標Web應用程序?! ?/P>
TestMaker的文檔很好,工具的感覺像專業的應用。但是,很難掌握和精通。需要留出大量時間來閱讀指南和分析那些例子的源代碼?! ebInject WebInject是一個極其輕量級的測試工具,能自動化測試Web services和Web應用程序。事實上,WebInject能測試XML/SOAP Web Service好像是最近增加的功能,早期版本不能很好地處理SOAP協議?! ?/P>
WebInject首先是一個用Perl寫的命令行工具,雖然它的作者提供了一個簡單的Perl/Tk用戶界面,至少簡化了測試的執行(對于某些人來說不愿意花太多的時間在命令行)。如果你不熟悉Perl,不要害怕。WebInject的使用可以不用任何Perl代碼?! ?/P>
WebInject其實是一個執行和報告引擎。不像其他工具,它沒有IDE類型的用戶界面,因此測試的編輯必須在WebInject界面之外完成。這讓人感覺WebInject沒有那么專業,但是這不妨礙這個工具的使用,我可以想象WebInject的用戶都有一個目錄存儲了各種測試“模板”。新建一個測試的時候,這些用戶只需要打開他們最喜歡的編輯器,拷貝粘貼一些代碼,調整一下就完成了一個新的測試用例?!‘斈氵\行WebInject時,它讀入一個包含測試用例描述信息的XML文件。每個測試用例使用XML標簽來描述。因此,一個簡單的驗證某個Web方法返回一個書名列表是否包含My Antnia的測試用例可能會像下面的代碼所示:
id=”5” description1 = “Verify My Antonia in list” method=”post” url=”Http://localhost:8080/axis/bkService.jsw” postbody=”file=>soapListTest.xml” posttype=”text/xml” addheader=”SOAPaction: urn:getBookList” verifypositive=”My Antonia” />
“id”屬性不僅提供了測試用例的唯一名稱,還標識了測試用例的執行順序。其他的屬性都是很直觀易懂的(只要你細讀它的文檔)。賦給“postbody”屬性的值告訴WebInject取當前目錄名為“soapListTest.xml”的XML文件,并用它來組成SOAP請求的內容?! ?/P>
如果結果包含“My Antonia”字符串,則測試通過。WebInject提供了三個額外的“verifypositive”屬性,每個的值都被作為正則表達式處理。這意味著你可以創建很復雜的驗證說明 – 更確切地說,你可以構建一個測試步驟,只有通過4個正則表達式的過濾條件才算通過測試,每一個正則表達式對應一個“verifypositive”屬性”。一個測試用例元素還可以包括4個“verifynegative”屬性,功能與“verifypositive”屬性”相反,如果任何一個正則表達式不匹配,則測試用例失敗?! ?/P>
本質上,一個WebInject“項目”只是一連串的組成的XML文件。WebInject的簡單結構讓你可以非??焖俚貥嫿y試。但是你必須適當了解SOAP協議的機制,還需要一個工具幫助你捕獲和產生HTTP/SOAP請求和響應。你需要那些請求信息來構建POST的正文,需要那些響應信息來創建合適的“verifypositive”和“verifynegative”的正則表達式來檢查測試是否成功。我使用Eclipse的Web Service工具包來為WebInject獲取請求和響應信息,一旦我掌握其中的訣竅,我覺得創建測試用例是很簡單的事情?! ?/P>
對于每個測試用例的執行,WebInject的UI都會顯示狀態(通過或者失敗)。你可以配置WebInject以提供完整的HTTP請求和響應信息,這是一個非常有用的功能,如果你想在測試用例失敗時調試的話?! ?/P>
除此之外,UI還能產生實時的圖表,為每一對請求和響應產生往返時間的統計圖表,因此你可以使用WebInject構建和監視性能測試。而且WebInject還為MRTG(Multi Routing Triffic Grapher)提供插件,MRTG是一個網絡監視和數據收集工具,允許你執行和捕獲測試用例運行一段時間的結果,還能分析數據的模式和趨勢?! ?/P>
WebInject的最大特點是它的簡單性。一旦你掌握了WebInject的XML命令的訣竅,你可以快速地構建、修改和擴展測試用例。整個文檔包含一個Web頁面,這些信息可以在同一個地方讀取到。但是,這個頁面的文檔有時候也會讓你感覺不知道如何進一步測試。此外,你需要適當了解SOAP協議,還有額外的一個工具來提取Web Service響應信息的POST正文,以便創建測試用例?! ?/P>
為你效勞 這三款工具從快速和易用到復雜和強大的都有。如果你需要快速編碼來測試你的Web service的話,WebInject是個符合邏輯的選擇;你將在一個下午的時間里測試你的Web service。如果你需要高端的工具,讓你可以創建強大的測試,可能擴展到其他的系統資源 – 文件系統、數據庫、e-mail等的話,那么TestMaker是最佳選擇。但是首先要看看Jython,準備好艱難的學習過程?! ?/P>
我喜歡中間的soapUI。由soapUI的向導創建的基本測試結構比起TestMaker創建的要容易讓其豐滿起來。而且如果我需要更復雜的測試,我還可以使用soapUI的Groovy?! ?/P>
如果說把這些產品與商業的Web service測試工具比較的話,我會說它們是大雜燴。它們雖然是免費的,并且對于簡單到中等復雜程度的工作而言工作得不錯;但是另一方面,它們比商業工具在易用性方面要弱些,你需要做一些復雜的工作,必須自己構建。TestMaker看起來比較接近商業工具,但是需要學習Jython意味著需要更長的時間來構建測試。soapUI看起來沒有那么專業,但是可以讓你不需要編程就能創建可用的測試。WebInject則是徹頭徹尾的開發人員的工具。你需要懂得SOAP,才能很好地使用它,并且能力也不會有soapUI或TestMaker那么強大,因為它的測試用例依賴模板驅動。
原文轉自:http://www.anti-gravitydesign.com