REST性能测试方案

时间:2023-03-09 05:11:54
REST性能测试方案

1、REST简介

REST(代表性状态传输,Representational State Transfer)是一种Web服务设计模型。REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web服务,包括使用不同语言编写的客户端如何通过HTTP处理和传输资源状态。 是基于SOAP和WSDL的Web服务的更为简单的替代方法。采用了相对更易于使用、面向资源的模型来公开其服务。 在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEADER和OPTIONS。
      基于REST的Web服务应该遵循的四个基本设计原则:1)显式地使用HTTP方法。2)无状态。3)公开目录结构式的URI。4)传输XML、JavaScript Object Notation (JSON)或同时传输这两者。
      Web应用程序最重要的REST原则是客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
      在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的HTTP方法,比如GET、PUT、POST 和 DELETE。Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。

RESTful Web服务与RPC Web服务

REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful,RESTful Web服务(也称为RESTful Web API)是一个使用HTTP并遵循REST原则的Web服务。
      使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式的Web服务,URI表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。
      由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java、Perl、Ruby、Python、PHP 和Javascript[包括Ajax])实现客户端。RESTful Web服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的Web浏览器构建一个GET URL并读取返回的内容。
     在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源。
     REST-RPC混合架构--REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。

REST与SOAP之比较

标题“REST与SOAP之比较”确实有些让人误解。REST是代表性状态传输的名称首字母缩写,与其说它是标准,不如说是一种风格。众多从事Web服务的软件设计师们认为SOAP过度复杂,于是,类似eBay和Google的服务都采用了REST风格的约束来暴露其大量数据。与其将REST和SOAP进行比较,不如将REST将和SOA进行比较。REST是一个体系结构类型。而SOAP是一个消息传递协议。REST应用程序可能使用SOAP协议,但是在大多数的情况下,REST应用程序只是简单地使用基于HTTP的XML传递消。REST依赖一套简单的“动词”,把所有的复杂性都转移到了指定资源的“名词”中。与此不同,SOAP却有一套相当复杂的XML格式化命令和数据传输选项。

为了对REST的Web服务有一个比较感性的认识,下面列举了一个例子对比。
① 非REST风格的Web使用GET调用远程过程:
         GET /adduser?name=Robert HTTP/1.1

② 遵循REST的调用:
         POST /users  HTTP/1.1
         Host: myserver
         Content-Type: application/xml

<?xml version="1.0"?>
         <user>
           <name>Robert</name>
         </user>
      REST服务(RESTful Service)是一种基于HTTP和REST准则的轻量级Web服务,这类服务可以看作是一系列资源的集合,服务的定义可以视为以下三个切面的组合:
       I、访问web service的URI,如:http://example.com/resourece。
       II、Web  Service所支持的数据MIME类型,如:JSON、XML、YAML等。
       III、Web  Service使用的HTTP协议支持的操作,如:GET、POST、PUT、DELETE。


2、REST性能测试工具

LR对基于SOAP协议的webservice已经有了较好的支持,但是对于REST风格的webservice目前还没有提供支持,可以利用LR中自定义http协议来模拟REST请求以实现对REST的支持,可能会因为测试场景的复杂度实现起来比较复杂。用于测试webservice的soapUI工具也支持对REST服务的测试,不过soapUI工具最大的不足是没有脚本的支持,对于一些特殊情况下可能存在问题,比如某些参数值依赖其他的服务的结果而需要关联时。开源性能测试工具Jemter 2.10版本中没有直接提供REST取样器,是否可以使用HTTP或XML-RPC取样器来实现REST的性能测试,以及是否存在对REST提供支持的扩展插件还有待学习验证。另外有一款小巧的专门针对REST的测试工具restclient可以对REST进行功能测试,可以做一些性能测试前的功能验证等测试工作,restclient提供了非常丰富的Content-type类型(上百种),GUI简介易用,如下图所示。

REST性能测试方案                     REST性能测试方案


3、使用soapUI测试REST服务

3.1  在soapUI中新建项目

soapUI把REST服务、资源和操作组织成了一个层次结构,如下图所示:

REST性能测试方案

项目定义:位于最上层,项目可以包含多个服务定义;
      服务定义:服务其实是对多个REST资源的分组,如上例的BookStoreService服务;
      资源定义:具体描述该资源的名称、URI、参数等属性;
      方法定义:针对每个资源的方法,包括GET、POST、PUT、DELETE等类型的方法;
      操作定义:每个方法可以建立一个或多个请求,比如XML格式或JSON格式的请求,这些请求才是真正被soapUI所调用执行的。每个请求可以设置丰富的消息,例如自定义请求头等。运行了该请求后,就能以各种方式查看运行结果了。

以下展示具体在soapUI中新建项目的操作步骤:
① 打开soapUI,创建工程;

REST性能测试方案

② 弹出创建工程窗口,输入新建项目的名称并勾选创建REST服务对话框,点击OK按钮;

REST性能测试方案

③ 弹出创建REST服务窗口,输入接口的域名地址,勾选创建REST资源对话框,点击OK按钮;

REST性能测试方案

④ 弹出New REST Resource窗口,输入名称和resource URL,点击OK按钮;

REST性能测试方案
 
    ⑤ 弹出 New REST Method窗口,输入方法名称,选择请求方法,点击OK按钮;

REST性能测试方案

⑥ 双击请求,在如下窗口中可以队请求进行设置,Accept设置接受的媒体类型,左下方可以设置请求的属性和参数,右下方设置认证、自定义头、附件等信息。

REST性能测试方案

新建完成一个项目后点击右上方的三角按钮即可执行了,在界面展示了执行消息和结果。对于测试来说需要对运行结果进行验证,在soapUI中需要建立测试用例(Testcase)并加入断言来进行验证结果。

3.2  在soapUI中新建测试用例

在soapUI中测试用例同样是一个层次结构,如下图所示:

REST性能测试方案

TestSuite:测试套,也即是测试用例集,其中可以加入多个TestCase
      TestCase:测试用例,可以包含多个测试步骤
      TestStep:测试步骤,有多种类型,如REST请求、Groovy脚本等,TestStep还支持分支调转操作,根据特定的条件从一个step调转到其他step,而改变执行顺序。
在soapUI中新建测试用例的方式有两种,一种是自动创建,直接在操作名称上右键点击新建测试用例,输入相关信息来完成测试用例创建,如下图所示:

REST性能测试方案

另一种是手动创建,在项目名称上右键点击新建测试套,在弹出的窗口中输入相关信息来完成测试用例的创建,如下图所示:

REST性能测试方案

无论采用哪种方式创建测试用例,最终的测试用例如下图所示,与方法的操作界面类似,左下方可以设置和自定义属性,右下方可以设置认证、自定义头等信息。

REST性能测试方案

3.2.1 验证结果

测试用例新建完后需要增加断言(Assertions)来验证结果,也就是相当于LR中的检查点。soapUI支持如下图所示的多种断言来对response进行判断。可以使用XPath Match和Script Assertions类型的断言对xml或json格式的response进行判断。要添加断言点击上图所示的Assertions按钮。

REST性能测试方案

完成以上测试用例和断言的创建后,点击三角按钮就可以运行测试用例了,可以在测试套、测试用例等不同层级上执行。

REST性能测试方案

3.2.2 性能测试

性能测试在soapUI中称为Load Test,正对一个TestCase可以建立一个或多个Load Test,这些Load Test会自动把TestCase中的所有步骤添加到其中,在运行的时候,soapUI使用多线程来运行这些TestStep,同时监控它们的运行时间等指标。只需在Load Test上右键点击New LoadTest,输入名称即可创建一个性能测试,如下图所示,可以设置运行线程数、并发策略、迭代时间等,主界面实时显示运行时响应时间、TPS、错误数等监控数据,点击右上角的图像按钮可以显示监控图形。

REST性能测试方案

 参考资料

使用soapUI测试rest服务:http://www.ibm.com/developerworks/cn/opensource/os-cn-soapui/
   最佳实践:更好的设计你的REST API:http://www.ibm.com/developerworks/cn/web/1103_chenyan_restapi/
   基于REST的web服务基础:http://www.ibm.com/developerworks/cn/webservices/ws-restful/