APP下载

基于JMeter的Web Service自动化测试集成框架

2016-06-08边耐政赵东旭

计算机应用与软件 2016年5期
关键词:测试工具测试用例插件

边耐政 赵东旭

(湖南大学信息科学与工程学院 湖南 长沙 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/″>

int

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

猜你喜欢

测试工具测试用例插件
基于SmartUnit的安全通信系统单元测试用例自动生成
自编插件完善App Inventor与乐高机器人通信
Http并发连接测试工具
基于混合遗传算法的回归测试用例集最小化研究
手车式真空断路器回路电阻测试电流线接头研究
基于jQUerY的自定义插件开发
MapWindowGIS插件机制及应用
福禄克推出先进的连接式测试工具系统
基于Revit MEP的插件制作探讨
基于依赖结构的测试用例优先级技术