邊耐政 趙東旭
(湖南大學信息科學與工程學院 湖南 長沙 410082)
?
基于JMeter的Web Service自動化測試集成框架
邊耐政趙東旭
(湖南大學信息科學與工程學院湖南 長沙 410082)
摘要Web Service由于其松散耦合的技術特性,隨著SOA的流行正日漸普及。隨著需求的增長和應用規模的擴大,Web Service正變得越來越復雜,且其性能表現也愈加重要,對性能測試的自動化程度的要求也越來越高。JMeter作為一款開源的優秀性能測試工具,支持對Web Service進行性能測試,但仍需人工分析WSDL后手工輸入測試配置。介紹一種基于JMeter的Web Service自動化性能測試框架,它能夠自動解析WSDL文檔,生成JMeter性能測試所需的Operations和相關配置,直接用于JMeter來完成自動化測試流程。這有助于軟件測試人員專注于測試用例的設計,而不必分析復雜的WSDL文檔,減輕了測試負擔,提高了測試效率。
關鍵詞JMeterWeb Service自動化性能測試
0引言
面向服務架構SOA是一種架構風格,將應用程序的不同功能單元(服務)通過定義良好的接口和契約聯系起來[1]。Web Service作為SOA的具體實現技術,在軟件解決方案中越來越流行。Web Service是面向服務架構的一種標準實現,以基于XML的簡單對象訪問協議SOAP(Simple Object Access Protocol)為基礎,實現消息傳遞,從而達到了平臺無關、互操作性強、靈活性高等特點。但是,隨著軟件系統需求的增加和應用規模的擴大,Web Service所處的軟件體系結構也變得越來越復雜。因此,對Web Service性能指標(如響應時間、吞吐量)的要求,也變得越來越高。所以,如何在一個復雜的Web應用程序里,準確、高效地執行Web Service的性能測試,是一個重要的課題[2]。現階段關于Web Service的性能測試,存在一些尚未解決的問題。
1) 缺乏高效的流程
Web Service性能測試的基本步驟,包括分析性能需求、制定測試計劃、搭建測試環境、選擇測試工具、設計測試腳本、執行測試、分析測試結果等過程。而設計測試用例的時候,需要軟件測試人員人工分析Web Service描述語言WSDL文檔描述的數據結構、端口、操作等信息(這個過程并不容易),再結合測試計劃,手工設計可執行的測試用例。以上流程的自動化程度并不高,特別是當存在著大量測試用例的時候,若沒有一種高效的自動化流程,將會非常耗時,且容易出錯[3]。
2) 缺乏全面的性能測試工具
隨著Web Service的流行,出現了一些較為實用的Web Service測試工具。SoapUI是一款商業軟件,有易于使用的圖形界面,可以通過SOAP/HTTP來檢查、調用、實現Web Service的功能/負載性測試。它也有開源版本,但功能較商業版本少了很多,且其對于性能測試的支持尚不完善[4]。LoadRunner是HP公司的一種適用于各種體系架構的自動負載測試工具,它能預測系統行為并評估系統性能,但是它對于Web Service測試的過程非常繁瑣,易用性較低。SOATest是Parasoft一款商業測試工具,它提供了WSDL驗證、單元測試、功能測試和性能測試,但可擴展性不高。JMeter是一款開源、純Java編寫的專業性能測試工具,支持Web Service方面的測試,具有良好的界面,高度可擴展性,易于使用等特點,但對于Web Service的WSDL文檔無法完成自動解析。
3) 缺乏詳細的結果記錄組件
大部分性能測試工具缺乏詳細、清晰的測試結果記錄組件。當Web Service的性能測試完成后,最重要的工作之一,就是對測試結果進行記錄并分析。Web Service系統的性能是否符合要求,是否存在瓶頸,以及如何提高負載能力,主要都是依據性能測試的結果來進行判斷的。所以,是否能生成詳細、清晰的性能測試結果記錄是測試中一個很重要的環節。SoapUI對于Web Service性能測試結果的記錄,只有簡單的圖表和部分性能數據,不利于測試人員進行分析;而JMeter通過其大量的監聽器組件,則實現了較為全面的結果記錄功能,有利于測試人員進行分析。
本文將提出一種自動化性能測試集成框架,克服以上缺點,快速、有效地生成測試Web Service所需的數據信息,來進行性能測試。Apache JMeter作為一款開源、純Java編寫的專業性能測試工具,可免費使用,具有友好的界面,支持的協議較多,操作簡便,可擴展性好。它集成了很多監聽器,對Web應用程序運行過程中的性能結果能進行有效地統計和分析。它不僅能模擬單個客戶端向服務器發送大量請求,還能模擬若干個分布式客戶端同時向服務器加載壓力,能夠很好地解決高并發的問題[5]。所以,本文將基于JMeter測試工具,研究一種集成框架,對Web Service進行自動化性能測試,解決上述問題。
1Web Service
根據萬維網聯盟W3C(World Wide Web Consortium)的定義,Web Service是一個軟件系統,用以支持網絡間不同機器的互動操作。網絡服務通常是許多應用程序接口所組成的,它們透過網絡,如國際互聯網的遠程服務器端,執行客戶所提交服務的請求[6]。
Web Service(如圖1所示)可以看作是,一個Web站點使用SOAP傳輸協議,提供約定的接口,來進行數據交互。而這些過程,都是基于HTTP和XML(SOAP)。Web Service描述語言WSDL定義了一系列操作,描述服務端口訪問方式和使用協議的細節。通過通用描述、發現與集成服務UDDI(Universal Description, Discovery and Integration),可以注冊和搜索Web Service,但它不在本文的討論范圍。

圖1 Web Service主要架構
SOAP是一種簡單且可擴展的協議,使用它定義和構造的格式化數據可以在分布式的環境中進行交換。
WSDL是一種正式地描述Web服務的基于XML的語言。在2001年3月,WSDL 1.1被IBM、微軟作為一個W3C記錄提交到有關XML協議的W3C XML活動,用于描述網絡服務。在2007年6月,WSDL2.0被列為W3C的官方推薦[7]。
WSDL保證了Web Service通過一種結構化的方式(如XML),對Web服務的調用以及通信,進行標準化描述。這相當于同客戶端之間形成某種約定。總的來說,WSDL文檔提供了使用Web Service所需要的所有細節,包括消息、端口類型等[8]。
2JMeter
Apache JMeter是一款開源、純Java編寫,用于測試功能行為和性能的軟件。JMeter可以用于測試靜態、動態資源的性能,如文件、PHP、Java、數據庫、FTP服務器等。它可以模擬在服務器或其它對象上進行高負載測試,并且能夠測試服務的總體性能狀況[9]。它具有圖形化的界面,易于使用,并且它提供了擴展API,使得測試人員可以往里面加入某些定制的插件,可擴展性高。
JMeter支持多種協議類型,如HTTP/HTTPS、SOAP、FTP、Database via JDBC、LDAP、Mail、TCP、MongDB(NoSQL)等。JMeter還具有高穩定性。它擁有先進的多線程軟件架構,能夠模擬大量并發操作,魯棒性很強[10]。
JMeter的取樣器(Sampler)允許創建樣本,這使得JMeter擁有高度可擴展的能力;定時器(Timer)允許定義線程之間的時間間隔,創建測試組合條件等;監聽器(Listener)允許將響應數據、服務器監控數據等進行記錄和處理,同時可以進行展示,并且能夠擴展更多界面良好、功能齊全的可視化插件。
JMeter的“SOAP/XML-RPC Request”取樣器,它就是用于對基于SOAP協議的Web Service進行性能測試。當測試某個Web Service的時候,測試人員必須仔細分析WSDL文檔,包括數據結構、端口類型、綁定原則、服務地址等,而這是非常困難的一項工作。還需要進一步解析出WSDL中的Operation的名稱,發送SOAP請求Action的URL,當然還包括一條SOAP消息必要的數據格式等內容。并且,隨著Web應用程序復雜性的增加,WSDL也同樣變得更復雜,手動解析的難度更大。上述過程對于一個軟件測試人員并不簡單,特別是當存在著大量測試用例的時候,又是非常繁瑣、耗時,并且容易出錯的。
3基于JMeter的Web Service自動化測試流程
由于JMeter測試Web Service存在著效率不高的問題,那么,為了減輕測試人員分析WSDL的負擔,降低測試出錯率,提高測試效率,本文提出一套基于JMeter的Web Service自動化性能測試流程。其中核心部分為自動化測試集成框架——Web服務測試數據生成器WSTDG(Web Service Test Data Generator),還包括它的實現過程,以及具體的執行方式。
3.1自動化測試框架
WSTDG框架的工作流程原理如圖2所示。該框架主要針對WSDL1.1規范的Web Service,對于WSDL2.0,暫不支持解析。

圖2 WSTDG框架原理圖
為了說明WSTDG自動化框架的工作流程,下面以中國電視節目預告Web Service的WSDL為例來說明。下面為該Web Service的WSDL文檔的部分代碼,它是符合WSDL1.1規范的。由此,可以看出一個基本的WSDL文檔通常包含幾個重要的元素,即types、message、portType、binding、service元素。這些元素嵌套在definitions元素中,definitions是WSDL文檔的根元素。
xmlns:tns:http://WebXml.com.cn/ xmlns:wsdl=″http://schemas.xmlsoap.org/wsdl/″ targetNamespace=http://WebXml.com.cn/《 > targetNamespace=″http://Webxml.com.cn/″> 《
《
《
《
type=″tns:ChinaTVprogramWebServiceSoap″> > style=″document″/>
《
binding=″tns:ChinaTVprOgram WebSerViceSoap″> ChinaTVprogramWebSerVice.asmx″/>
Types表示數據類型定義的容器,它一般使用XML Schema語法來定義數據類型。例子中定義了兩個元素getTVstationDataSet和getTVstationDataSetRespons。
Message定義一個操作的數據元素。例子中為getTVstationDataSetSoapIn和getTVstationDataSetSoapOut。
PortType描述一個Web服務可被執行的操作和相關的消息。在這個例子中,端口類型ChinaTVprogramWebServiceSoap定義了getTVstationDataSet操作。該操作輸入一個命名空間為getTVstationDataSetSoapIn的帶有theAreaID參數的請求消息,并輸出一個getTVstationDataSetResponse的響應消息,且此消息帶有復合型參數。
Binding表示特定端口類型的具體協議和數據格式規范的綁定,這里綁定的是命名空間為ChinaTVprogramWebServiceSoap端口。Operation元素定義了該端口提供的操作符,以及如何對輸入和輸出進行編碼,這里使用了literal。
Service表示相關服務訪問點的集合,該標簽確定每一個binding標簽的端口地址。ChinaTVprogramWebServiceSoap的端口地址是http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx。
對WSDL各個標簽進行分析,是測試Web Service一項必不可少的內容。而WSTDG自動化框架的核心內容,正是通過一些Java的XML API,對WSDL文檔的每個標簽進行解析,從而生成相關的測試數據信息[11]。
WSTDG自動化框架首先將WSDL文檔里所有的Operation解析出來。假設希望測試某個Operation的請求信息和響應信息是否正常,可以自動生成相關的測試數據,而這些測試數據都是能被JMeter識別并執行的。同時,選定的Operation對應的請求數據的結構,也是被自動生成的。當然,這包括了各種由XSD(XML Schemas Difinition)所規定約束的數據類型[12]。
表1為經過WSTDG框架解析后的Web Service,所呈現的所有Operation的名稱。但是,設計一個完整的測試用例,還需要其他的數據信息。在這里,假定需要測試getTVstationDataSet這個Operation,WSTDG框架能夠自動生成與之對應的SOAP Action、Host、SOAP Data等關鍵數據信息。

表1 Operations列表
例如,從bingding標簽里解析出SOAP Action的URI,這個方法的部分代碼如下:
public static String getSoapAction( BindingOperation operation )
{
List list = operation.getExtensibilityElements();
SOAPOperation soapOperation = WsdlUtils.
getExtensiblityElement( list, SOAPOperation.class );
if( soapOperation != null )
return soapOperation.getSoapActionURI();
}
上述代碼表示的方法主要用于獲取特定Operation的SOAP Action的URI。此方法通過傳入BingdingOperation接口作為參數,由它的getExtensibilityElements實現方法,將返回值用list接收。再通過WsdlUtils的getExtensiblity方法,構造一個SOAPOperation對象。若該對象不為空,則返回它用getSoapActionURI方法取得的SOAP Action的URI。
在中國電視節目預告Web Service的WSDL示例中,就可以通過該方法得到getTVstationDataSet的SOAP Action為http://WebXml.com.cn/getTVstationDataSet。
經過WSTDG框架的解析生成,設計一個基于JMeter的Web Service性能測試用例就非常簡單了,因為測試所需的數據都是可以通過框架自動生成的。到這一步,便可以通過JMeter的“SOAP/XML-RPC Request”取樣器,來執行性能測試了。
總的來說,WSTDG自動化測試框架在加載WSDL文檔時,能夠自動判斷WSDL文檔的正確性,并且準確地生成測試需要的數據信息,如Operations、SOAP Action、SOAP Data等。這樣測試人員便可以快速、準確地設計測試用例,完成自動化測試流程,提高測試效率。
3.2實現
經過前面介紹,JMeter具有高度可擴展性,于是WSTDG的實現方式是通過JMeter的Web Service擴展取樣器來實現,也就是開發WSTDG插件。
WSTDG插件的主要功能是將它解析WSDL生成的相關測試數據信息,直接讀取至SOAP/XML-RPC Request取樣器中。它主要擴展了JMeter的三個組件,分別為ConfigElement、SampleListener、PostProcessor。ConfigElement用于定義WSTDG,SampleListener用于將結果保存到目標取樣器中,PostProcessor用于抽取WSTDG中的結果。WSTDG插件加載機制主要是通過掃描JMeter擴展下的所有實現了JMeterGUIComponent和TestBean接口的類,再進行初始化。只要確保插件的jar包在擴展路徑下(默認路徑是JMETER_HOME/lib/ext),那么它就能夠被掃描到,并且執行。
JMeter開發插件的過程不是本文討論的重點,重點是WSTDG自動化框架的內部工作流程。WSTDG通過載入WSDL,將解析出來的Operation存放至插件取樣器界面中。然后根據選定的Operation,自動生成測試所需的數據信息,直接讀取至SOAP/XML-RPC Request取樣器中,執行測試。
WSTDG的實現架構主要包括界面、WSDL加載、框架解析、測試配置信息生成、取樣器等內容,如圖3所示。

圖3 WSTDG架構
下面介紹具體的測試步驟,還是通過中國電視節目預告的Web Service來說明如何具體實現:
1) 加載WSDL文檔
用戶選擇一個WSDL文檔,可以通過URL或者本地文件直接加載,非常方便。點擊Button,后臺就會把WSDL文檔中所有的Operation解析出來,放至Vector中,再將Vector中的信息提取顯示到WSTDG取樣器界面上。
2) 選擇Operation
若選擇getTVstationDataSet這個Operation,它的Request信息是一個樹形結構。在這里,Request參數是由XML Schema所約束的int型。當Operation需要鍵入參數時,取樣器界面會給出提示。有些Operation不需要鍵入參數值,直接發送SOAP請求便可以得到Response。
3) 生成SOAP數據
選擇Operation后,根據WSTDG定義的規則,SOAP Acion是被生成的,Host是被生成的,用于發送SOAP信息的數據也是被生成的。這時候,點擊Button,WSTDG取樣器就會把對應的全部測試數據信息,直接讀取至SOAP/XML-RPC Request取樣器界面。測試數據內容如下:
SOAPAction:http://WebXml.com.cn/getTVstationDataSet
Host:www.webxml.com.cn
SOAP Data:
xmlns:soapenv=″http://schemas.xmlsoap.org/soap/envelope/″ xmlns:web=″http://WebXml.com.cn/″>
3.3執行
在實際項目中,Web Service系統在上線前,要對其負載能力進行性能測試,以確定其性能參數是否符合預定要求。根據上一節論述的實現,就可以使用JMeter對該Web Service進行自動化性能測試了。界面如圖4所示。

圖4 JMeter測試Web Service取樣器界面
運行JMeter,按如下順序:
1) 創建線程組:Add->Threads(Users)->Thread Group,設置Name、Number of Threads、Ramp-up Period、Loop Count等參數。Name代表線程組的名字,Number of Threads代表線程數 (虛擬用戶數),Ramp-up Period代表線程啟動時間,Loop Count代表循環次數。
2) 添加取樣器:Soap->Add->Sampler->WSTDG Request,Soap->Add->Sampler->SOAP/XML-RPC Request,分別設置取樣器的Name。若需要測試多個Operation,則需要添加多個SOAP/XML-RPC Request取樣器。
3) 設計測試用例:加載WSDL文檔,生成對應的Operation。選擇需要測試的Operation,生成對應的測試數據,直接讀取至Web Service測試取樣器界面。
4) 添加監聽器來查看測試結果:Threads(Users)->Add->Listener->View Results Tree/Summary Report/Response Time Graph/Graph Results/View Results in Table。添加完成后,便可以在測試完成后查看測試結果(也可以添加圖形化效果更佳的插件來擴展JMeter的監聽器功能)。
5) 添加定時器來設置線程具體啟動規則:Threads(Users)->Add->Timer->Synchronizing Timer。設置集合的虛擬用戶數,值不宜過大。
6) 當相關參數都設置完畢以后,便可以運行:在Run菜單下點擊Start,運行測試。
7) 測試完成后,便可以根據監聽器,對測試結果進行記錄和分析。
為了對比使用WSTDG框架和不使用WSTDG框架,這兩種情況下的測試效果,這里將設置兩組性能測試方案。一組是人工分析測試(A方案),另一組是WSTDG自動化測試(B方案)。測試內容為中國電視節目預告的Web Service,測試用例數量為8,請求參數數量10,線程數為10,循環次數為1。
上述兩套測試方案分別執行8個測試用例,測試該Web Service的性能表現。A方案和B方案的測試用例是相同的,但生成測試用例的方法不一樣。A方案是人工分析WSDL方法,重點是將portType元素里面的operation標記出來,分析每個operation對應的描述以及message信息,包括對應types里面的element信息等,通過一系列的分析從而得到測試用例;B方案則簡單許多,直接由WSTDG框架自動生成。下節將具體分析兩套測試方案的優劣情況。
4實驗結果
當A方案和B方案的性能測試執行完畢后,就可以對結果進行記錄和分析了。首先,可以從“View Results Tree”中查看到取樣器結果、請求信息、響應信息等數據。
…
…
上述基于XML的數據就是對于“getTVstationDataSet”這個Operation,鍵入參數為-1的請求,得到的響應結果。對于Web Service的性能測試,測試結果的聚合報告則更加重要,因為它記錄了測試性能參數,如表2、表3所示。

表2 A和B方案性能測試聚合報告

表3 兩種測試方案的對比
通過執行兩套方案的測試用例,得到了預期的響應結果和聚合報告。通過聚合報告,可以知道測試用例執行的平均時間不超過2 s,最大時間不超過3 s,錯誤率為0,均符合性能測試要求。由此,說明該Web Service是可用的,并且人工分析測試方法與WSTDG自動化測試方法均是可行的。
比較兩種測試方案的優劣如下:
在A方案的情況下,人工分析WSDL至少耗時30 min,再根據該WSDL設計測試用例至少耗時40 min(平均每個測試用例耗時5 min),且有出錯現象;在B方案情況下,WSTDG框架自動解析WSDL,故分析WSDL這個步驟耗時為0 min,再自動生成所有測試用例數據格式,設計測試用例耗時大大縮短為8 min(平均每個測試用例僅耗時1 min),錯誤率為0%。
通過測試耗費的時間來對比,人工分析方法至少要耗費70 min時間(前提是測試人員熟悉WSDL,若不熟悉則耗費的時間更長),而WSTDG自動化框架測試耗時僅8 min。再通過錯誤率來對比,相對于人工分析WSDL文檔生成的測試用例,WSTDG自動生成的測試用例錯誤率更低。所以WSTDG自動化框架不論是從測試所耗時間,還是測試出錯率,其表現都是更加優秀的。
綜上所述,使用WSTDG自動化框架對Web Service進行性能測試,縮短了測試時間、降低了測試出錯率,從而減輕了測試人員負擔,提高了測試效率。這里需要補充的是,當性能測試結
束后,就要根據性能測試結果,來分析Web系統當前的性能狀況。而分析性能狀況,最終的目的之一,就是進行性能調優。當然,這需要開發人員、運維人員、DBA共同完成,因為性能瓶頸可能是由硬件、應用軟件、網絡設備、操作系統中的某一個或多個原因引起的,這就需要綜合考慮了。
5結語
本文著重討論了一種基于JMeter的Web Service性能測試框架——WSTDG。通過JMeter測試工具,完成自動化性能測試流程。同時,通過中國電視節目預告的Web Service作為具體實例進行了研究,WSTDG自動化性能測試框架能夠根據WSDL文檔,快速、準確地生成JMeter測試所需要的測試用例的數據信息。通過WSTDG自動化測試與人工分析測試的比較,WSTDG自動化測試在同樣的測試任務下,總耗時更短、出錯率更低、效率更高。
下一步研究的方向,可以是擴展WSTDG框架,增加對解析WSDL2.0的支持。通過自動判別WSDL規范的版本,解析生成對應的相關測試信息,進而更全面地完成對Web Service的自動化性能測試。
參考文獻
[1] 毛新生.SOA原理·方法·實踐[M].北京:電子工業出版社,2007.
[2] Sujit Kumar Chakrabarti,Prashant Kumar.Test-the-REST:An Approach to Testing RESTful Web Services[R].Computation World,2009,116:302-303.
[3] Kao C H,Lin C C,Chan J N.Performance Testing Framework for REST-based Web Applications[C]//International Conference on Quality Software,2013:349-354.
[4] Smartbear.SoapUI:The Swiss-Army Knife of Testing[EB/OL].2014-04-02.http://www.soapui.org/.
[5] You J,Zhang L,Wang H,et al.JMeter-based Aging Simulation of Computing System[C]//Proceedings of 2010 International Conference on Computer,CMCE,2010:282-285.
[6] The World Wide Web Consortium.WEB OF SERVICES[EB/OL].2014-04-10.http://www.w3.org/standards/webofservices/.
[7] The World Wide Web Consortium.Web Services Description Language (WSDL) 1.1[EB/OL].2014-04-08.http://www.w3.org/TR/wsdl.
[8] Lawrence Mandel.Describe REST Web services with WSDL 2.0[EB/OL].2014-05-02.http://www.ibm.com/developerworks/cn/webservices/ws-restwsdl/.
[9] 江新.基于JMeter的MS Web應用系統的性能測試研究[D].南京:南京航空航天大學,2011.
[10] 吳志剛.使用JMeter插件提高性能測試效率[J].軟件導刊,2010,9(4):34-35.
[11] Bai X Y,Dong W L,Tsai W T,et al.WSDL-Based Automatic Test Case Generation for Web Services Testing[C]//Service-Oriented System Engineering,IEEE International Workshop,2005:207-212.
[12] Li Z J,Zhu J,Zhang L J,et al.Towards a Practical and Effective Method for Web Services Test Case Generation[C]//Automation of Software Test,2009,AST’09,ICSE Workshop on,IEEE,2009:106-114.
JMETER-BASED AUTOMATED COLLECTIVE TESTING FRAMEWORK FOR WEB SERVICE
Bian NaizhengZhao Dongxu
(CollegeofInformationScienceandEngineering,HunanUniversity,Changsha410082,Hunan,China)
AbstractBecause of its loosely coupling technology characteristic, Web service is becoming increasingly popular along with the prevalence of SOA. With the requirement increase and the expansion of application scale, Web service is becoming more and more complex, and its performance has also become even more important, the demand in automation degree of performance tests is also increasing. As an outstanding open source performance testing tools, JMeter supports the testing on Web service performance, but still needs manual input of test configuration after artificial analysis on WSDL. This article introduces a JMeter-based automated Web service performance testing framework, it can automatically parse the WSDL document, and then generates Operations and related configuration required by JMeter performance test, the results are directly used to JMeter for the completion of automated testing process. This helps the software testers to focus on the design of test cases without having to analyse complex WSDL document, thus reduces the testing burden and improves testing efficiency.
KeywordsJMeterWeb ServiceAutomationPerformance testing
收稿日期:2014-11-14。湖南省交通廳項目(201143)。邊耐政,副教授,主研領域:Web2.0,云計算。趙東旭,碩士生。
中圖分類號TP3
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.05.003