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简介易用,如下图所示。
3、使用soapUI测试REST服务
3.1 在soapUI中新建项目
soapUI把REST服务、资源和操作组织成了一个层次结构,如下图所示:
项目定义:位于最上层,项目可以包含多个服务定义;
服务定义:服务其实是对多个REST资源的分组,如上例的BookStoreService服务;
资源定义:具体描述该资源的名称、URI、参数等属性;
方法定义:针对每个资源的方法,包括GET、POST、PUT、DELETE等类型的方法;
操作定义:每个方法可以建立一个或多个请求,比如XML格式或JSON格式的请求,这些请求才是真正被soapUI所调用执行的。每个请求可以设置丰富的消息,例如自定义请求头等。运行了该请求后,就能以各种方式查看运行结果了。
以下展示具体在soapUI中新建项目的操作步骤:
① 打开soapUI,创建工程;
② 弹出创建工程窗口,输入新建项目的名称并勾选创建REST服务对话框,点击OK按钮;
③ 弹出创建REST服务窗口,输入接口的域名地址,勾选创建REST资源对话框,点击OK按钮;
④ 弹出New REST Resource窗口,输入名称和resource URL,点击OK按钮;
⑤ 弹出 New REST Method窗口,输入方法名称,选择请求方法,点击OK按钮;
⑥ 双击请求,在如下窗口中可以队请求进行设置,Accept设置接受的媒体类型,左下方可以设置请求的属性和参数,右下方设置认证、自定义头、附件等信息。
新建完成一个项目后点击右上方的三角按钮即可执行了,在界面展示了执行消息和结果。对于测试来说需要对运行结果进行验证,在soapUI中需要建立测试用例(Testcase)并加入断言来进行验证结果。
3.2 在soapUI中新建测试用例
在soapUI中测试用例同样是一个层次结构,如下图所示:
TestSuite:测试套,也即是测试用例集,其中可以加入多个TestCase
TestCase:测试用例,可以包含多个测试步骤
TestStep:测试步骤,有多种类型,如REST请求、Groovy脚本等,TestStep还支持分支调转操作,根据特定的条件从一个step调转到其他step,而改变执行顺序。
在soapUI中新建测试用例的方式有两种,一种是自动创建,直接在操作名称上右键点击新建测试用例,输入相关信息来完成测试用例创建,如下图所示:
另一种是手动创建,在项目名称上右键点击新建测试套,在弹出的窗口中输入相关信息来完成测试用例的创建,如下图所示:
无论采用哪种方式创建测试用例,最终的测试用例如下图所示,与方法的操作界面类似,左下方可以设置和自定义属性,右下方可以设置认证、自定义头等信息。
3.2.1 验证结果
测试用例新建完后需要增加断言(Assertions)来验证结果,也就是相当于LR中的检查点。soapUI支持如下图所示的多种断言来对response进行判断。可以使用XPath Match和Script Assertions类型的断言对xml或json格式的response进行判断。要添加断言点击上图所示的Assertions按钮。
完成以上测试用例和断言的创建后,点击三角按钮就可以运行测试用例了,可以在测试套、测试用例等不同层级上执行。
3.2.2 性能测试
性能测试在soapUI中称为Load Test,正对一个TestCase可以建立一个或多个Load Test,这些Load Test会自动把TestCase中的所有步骤添加到其中,在运行的时候,soapUI使用多线程来运行这些TestStep,同时监控它们的运行时间等指标。只需在Load Test上右键点击New LoadTest,输入名称即可创建一个性能测试,如下图所示,可以设置运行线程数、并发策略、迭代时间等,主界面实时显示运行时响应时间、TPS、错误数等监控数据,点击右上角的图像按钮可以显示监控图形。
参考资料
使用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/
REST性能测试方案的更多相关文章
- 【转】GT 的性能测试方案解析
前言 本文将整理腾讯GT各个性能测试项的测试方法,目的是为了帮助移动性能专项测试同学快速过一遍腾讯GT各个性能数据是如何获取的.另外对腾讯GT还不了解或者不知道它能做什么的同学可以看看这篇文章:htt ...
- 接口性能测试方案 白皮书 V1.0
一. 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间.响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网 ...
- Web Service性能测试方案
目录: 1.web Service简介 2.SoapUI介绍 3.使用SoapUI进行web service性能测试 4.使用LR进行web service性能测试 5.使用JMeter进行web s ...
- ASR性能测试方案--详细见云盘
目录: 1. 什么是WER 2. WER计算原理 3. WER测试设计方案 4. 当前业界识别水平 1. 什么是WER 在语音识别(Automatic Speech Recognition, ASR) ...
- 零成本实现WEB性能测试(一)性能测试基础
1.1 初识性能测试 概念:负载测试&压力测试. 目的:评估系统的能力,识别系统弱点,系统调优,检测问题,验证稳定性. 分类:负载测试,压力测试,容量测试 B/S指标: Avg Rps,平均每 ...
- Jmeter之性能测试基础
1.概念:性能测试是通过自动化的测试工具模拟多种正常峰值及负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行.通过负载测试,确定在各种工作负载下系统的性能,目标 ...
- 如何使用JMeter开源性能测试工具来构建Web性能测试体系
一.性能测试一些概念 性能测试:就是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 负载测试:确定在各种工作负载 ...
- 一篇入门 — Gatling 性能测试手册
介绍 本篇博客,旨在记录学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论. 原文地址:https://www.cnblogs.com/clockq/p/10539974.h ...
- [原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试),长期有效
[原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试方向),长期有效 高级测试工程师(性能/自动化方向) 1.负责性能测试计划,性能需求分析,性能测试方案和用例设计,搭建性能测试环境,执 ...
随机推荐
- 编辑并列DIV
html编辑控件,编写3个div并行,先看一下效果,如下图: 我需要将整个白色部分作为一个整体,编辑控件使用,其实使用到的就是div中的float:left属性,并且定义好宽度.css 部分代码如下: ...
- hive笔记(自学整理的)
第一部分:用户管理 创建用户:CREATE DATABASE XXX 查看用户:SHOW DATABASES; 关键查看用户:show databases like 'de.*' 讲解:创建一个用 ...
- Java反编译利器-Jad, Jode, Java Decompiler等及其IDE插件
转自:http://blog.csdn.net/superbeck/article/details/5189231 对于长年使用Java的程序员,大部分应该都会或多或少的使用到反编译软件.毕竟,不可能 ...
- C++学习网站总结(转)
总结帖: http://club.topsage.com/thread-361504-1-1.html Visual C++ (VC) / MFC 电子书下载: Visual C++ 2008 入门经 ...
- BZOJ 3156: 防御准备 斜率优化DP
3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...
- js:语言精髓笔记13--语言技巧
消除代码全局变量名占用: //本质是使用匿名函数: void function(x, y, z) { console.log(x + y + z); }(1,2,3); //要使函数内的变量不被释放, ...
- js:语言精髓笔记8--对象系统
封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...
- NGif, Animated GIF Encoder for .NET
1.简介 链接: http://www.codeproject.com/Articles/11505/NGif-Animated-GIF-Encoder-for-NET 2.代码使用 1)多个Imag ...
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 B Mission Impossible 6
#1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famou ...
- BZOJ1099 : [POI2007]树Drz
首先1与i交换,n与i交换,i与i+1交换的可以$O(n)$算出. 然后只需要考虑i与x交换(1<i,x<n且|i-x|>1). 设 a[i]=h[i-1] b[i]=h[i+1] ...