soapUI REST 服务.docx
- 文档编号:6256469
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:15
- 大小:172.84KB
soapUI REST 服务.docx
《soapUI REST 服务.docx》由会员分享,可在线阅读,更多相关《soapUI REST 服务.docx(15页珍藏版)》请在冰豆网上搜索。
soapUIREST服务
REST服务介绍
REST(RepresentationalStateTransfer)是RoyFielding博士在2000年提出的一种新的软件架构风格,它以资源(resource)为核心,使用HTTP、URI、XML以及HTML等现有流行协议和标准来完成对资源的操作及显示。
这些操作包括获取、创建、修改和删除资源,分别对应于HTTP协议的GET、POST、PUT和DELETE方法。
REST架构定义了以下设计准则:
●网络中的所有事物都被抽象为资源(resource)。
●每个资源对应一个唯一的资源标识(resourceidentifier)。
●通过通用的连接器接口(genericconnectorinterface)对资源进行操作。
●对资源的各种操作不会改变资源标识。
●所有的操作都是无状态的(stateless)。
REST服务(RESTfulService)是一种基于HTTP和REST准则的轻量级Web服务。
这类服务可以看作一系列资源(resource)的集合,服务的定义可以视为以下三个切面的组合:
访问WebService的URI,如:
●WebService所支持的数据MIME类型,如:
JSON,XML,YAML等。
●WebService使用HTTP协议支持的操作,如GET,POST,PUT,DELETE。
相比目前流行的Web服务实现方案SOAP和XML-RPC,REST服务更加简洁,它可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,其性能,效率和易用性等方面均优于SOAP协议。
本文主要介绍如何使用soapUI来测试此类Web服务。
soapUI介绍
由于Web服务是被程序调用的,一般不会提供界面让最终用户或测试人员直接使用,在soapUI等工具出现之前,测试人员不得不自己编写程序来测试它,这就要求测试人员花费很大的精力了解底层的接口,调用关系和详细的协议,导致他们不能把注意力集中到测试中。
soapUI的出现极大的改变了这一局面。
作为一个开源的工具,soapUI强大的功能、易用的界面,吸引了很多用户。
用户可以在soapUI中通过简单的操作完成复杂的测试,不需要了解底层的细节,极大的减轻了工作量。
soapUI支持多样的测试,例如功能测试,性能测试,回归测试等。
到目前为止soapUI的下载量已经超过了100万次,成为了事实的Web服务测试标准和领先的Web服务测试工具。
它不仅仅可以测试基于SOAP的Web服务,也可以测试REST风格的Web服务,后者也是本文介绍的重点。
soapUI基于Java开发,支持多个平台,安装非常简单。
读者可以到soapUI的官方网站下载一个安装包(本文使用的是Window版本3.0.1),直接安装即可。
在该安装包中,包括了一个soapUI所需要的JRE1.6版本。
安装完毕以后,读者需要设置JAVA_HOME变量指向到相应的JRE目录,同时修改PATH变量,将JRE1.6的bin目录添加进去。
REST服务案例
为了避免空洞的讲解,同时为了更好的展示soapUI对REST服务的测试功能,本文假想了一个在线书店的例子。
该在线书店对外提供了一些REST服务让第三方的应用程序调用。
为了让读者把注意力集中在使用soapUI进行测试上,我们对这些REST服务进行了必要的简化,仅仅只包含下面3种功能:
书籍列表,书籍详情和添加评论。
这3个REST服务覆盖了层次状的REST资源、基本的HTTP操作和多种展现形式。
服务名称
HTTP操作
资源URI
资源展现
注释
书籍列表
GET
application/json,text/xml
该REST服务的目的是列出在线书店中的书籍列表
书籍详情
GET
id>
application/json
该REST服务目的是给定一个书籍ID,返回该书籍的详细信息,需要注意的是书籍详细信息是一个带有层次结构的json展示
添加评论
POST
id>/comments
无,系统仅仅返回200OK
该REST服务的目的是对一个书籍添加评论,调用方需要POST类似author=xxx&content=xxx的数据到服务器端。
清单1.书籍列表application/json
{"books":
[
{"book":
{
"id":
"1234",
"name":
"book1",
"price":
29
}},
{"book":
{
"id":
"5678",
"name":
"book2",
"price":
18
}}
]}
清单2.书籍列表text/xml
清单3.书籍详情application/json
{
"id":
"1234",
"name":
"book1",
"description":
"thisisbook1",
"author":
"author1",
"price":
29,
"comments":
[
{"comment":
{
"user":
"user1",
"content":
"goodbook"
}},
{"comment":
{
"user":
"user2",
"content":
"notbad"
}}
]
}
在soapUI中建立测试用例
基本概念
在创建测试用例之前,我们先来看一看在soapUI中的基本概念,soapUI把REST服务、资源及其操作组织为一个层次结构。
如图1所示,主要包括如下层次:
●项目定义:
位于最上层(BookStoreTest),项目可以包含多个服务的定义。
●REST服务定义:
服务其实是对多个REST资源的一个分组,在我们的例子中只有一个服务BookStoreServie
●REST资源定义:
具体描述该资源的名称,URI,参数等属性
●REST方法定义:
针对每个资源的方法(GET,POST,PUT,DELETE等),图1中的方法名就是GetBookList
●REST操作请求定义:
基于每个方法,可以有一个或多个请求操作,如GetBookListRequest,这些请求操作才是真正被soapUI所调用执行的。
每个请求可以设置非常丰富的信息,例如Accept类型,请求的Header信息,运行了该请求以后,就能以各种方式查看运行结果。
但是这里还不能加入断言来验证结果-必须在建立测试用例以后才能使用。
图1.soapUI中的层次结构
对于测试用例来讲,同样是一个层次结构:
●TestSuite:
类似于Junit中的测试套件,其中可以加入多个TestCase
●TestCase:
可以包含多个TestStep
●TestStep:
一个TestCase可以包含多个TestStep,TestStep有多种类型,它可以是上面提到一个REST操作请求,也可以是一个Groovy的脚本,还可以试一个设置属性的操作。
TestStep甚至支持分支跳转操作:
根据特定的条件,从一个step可以跳转到其他step,而不必顺序执行。
●soapUI实际上是一个平台,它支持强大的编程能力,开发或者测试人员可以利用groovy脚本来访问soapUI中的对象,在运行时修改RESTrequest/response,这就提供了极大的灵活性。
图2.TestCase定义
创建测试用例
有了上面的基本概念以后,在soapUI中创建测试用例就比较简单了,用户几乎可以根据自己的直觉来一步一步的完成一个测试。
图3展示的就是一个建立书籍列表REST服务的步骤:
1.新建一个名为BookStoreTest的项目
2.在项目上点击右键,选择”NewRestService”,在对话框中输入ServiceName(BookStoreService)和Endpoinp(http:
//localhost:
9080)
3.在"BookstoreService"上点击右键,选择“NewResource”,在对话框中输入ResourceName(BookList)和ResourcePath(/books),点击OK
4.在弹出的对话框中输入MethodName:
GetBookList,HTTPMethod选择默认的GET,点击OK
图3.创建一个REST服务
有了REST服务,就可以建立TestCase,主要有两种方式:
自动生成,步骤如下:
(1).右键点击一个REST服务,例如本例中的"BookStoreService",选择"GenerateTestSuite"
(2).在弹出的对话框中,保持默认设置,选择"OK"
(3).输入名称,例如"BookStoreServiceTestSuite",选择"OK"即可。
手工创建,步骤如下:
(1).在项目"BooksStoreTest"上点击右键,选择“NewTestSuite”,在对话框中输入"BookStoreServiceTestSuite"
(2).在BookStoreServiceTestSuite上点击右键,选择"NewTestCase",在对话框中输入"BookListTestCase"
(3).然后在左边的导航栏中展开BookListTestCase,在“TestSteps”上点右键,选择AddStep->RestTestRequest
(4).在弹出的对话框中选择GetBookListRequest_XML
一个完成的TestCase如图4所示,用户可以在其中加入Assertion对运行结果进行验证,这也是自动化测试所必须的。
图4.RESTTestCase
使用变量
soapUI支持使用自定义变量(Property)在Project中存储和共享数据。
Property是一个命名的字符串可以被GroovyScript,PropertyTransfer或者Property-Expansion引用,目前所有的变量均被处理为字符串。
soapUI允许在项目的各个层次中定义变量,常用的层次包括:
Project,TestSuite,TestCase,Global等。
1.使用Property编辑器定义变量。
用户可以使用soapUI自带的PropertyEditor定义各个层次的变量。
以Project变量为例,点击BookStoreTest,在Properties面板中添加自定义变量,如下图所示:
图5.使用Property编辑器定义项目变量
2.使用命令行指定变量。
修改soapUI.bat文件中的Java参数如下:
清单x.使用命令行指定变量
setJAVA_OPTS=%JAVA_OPTS%-Xms128m-Xmx256m-Dsoapui.properties=properties.txt
其中,properties.txt为指定的全局变量文件名字,可以通过添加如下代码到全局变量文件来设置project/testsuite/testcase等层次的变量:
清单x.使用命令行指定变量
soapui.properties.
3.使用变量
soapUI使用如下语法引用项目中定义的变量:
清单x.使用命令行指定变量
${[scope]propertyName[#xpath-expression]}
其中,scope可以为#Project#,#TestSuite#,#TestCase#,#Global#,#System#,#MockService#,#Env#,[TestStepname]#。
验证结果
测试用例建好之后,需要向测试用例中添加Assertions以便验证结果的正确性。
soapUI支持ResponseSLA,ScriptAssertion,Contains,XQueryMatch,SchemaCompliance,XPathMatch以及NotContains等多种断言来对response进行判断来保证对Web服务高质量的测试。
本文以XPathMatch和ScriptAssertion为例来对在线书店服务返回的XML和JSON格式的response进行判断。
1.使用XPathMatch测试请求GetBookListRequest_XML返回的结果中,id为1234的book的price为29.0,response参见代码清单2。
点击TestCase的添加Assertions按钮,如图4所示。
在弹出的SelectAssertion窗口中选择XPathMatch断言,点击OK。
配置XPath如下图所示:
图6.使用XPATH测试XML格式的书籍列表
在XPathExpression面板中书写用于匹配Response的XPath表达式,ExpectedResult面板中填写期望的值。
soapUI将使用XPathExpression面板中填写的XPath表达式与Service调用结果匹配,将匹配结果与期望值比较,如果相同则测试通过,否则失败。
2.使用ScriptAssertion测试请求GetBookListRequest_JSON返回的结果,response参见代码清单1。
Assertion添加过程与XPathMatch类似,在SelectAssertion窗口中选择ScriptAssertion,并在之后弹出的ScriptAssertion窗口中书写如下代码:
清单5.使用ScriptAssertion测试JSON格式的书籍列表
//asserttheresponseheader
assertmessageExchange.responseHeaders["Content-Type"]=="application/json;charset=UTF-8";
assertmessageExchange.responseHeaders["Cache-Control"]=="no-cache";
//asserttherepsonsebody
defbooksRoot=net.sf.json.JSONSerializer.toJSON(messageExchange.responseContent);
defbooks=booksRoot.get("books");
//assertbookdetail
assertbooks[0].get("book").get("id")=="1234";
assertbooks[0].get("book").get("name")=="book1";
assertbooks[0].get("book").get("price")==29;
3.使用Property测试请求GetBookRequest_JSON返回的结果,response参见代码清单3。
在ScriptAssertion窗口中写入如下代码:
清单6.使用Property测试JSON格式的书籍详情
//getproperty
defexpectedID=context.expand('${#Project#book.id}');
defexpectedName=context.expand('${#Project#book.name}');
//asserttheresponseheader
assertmessageExchange.responseHeaders["Cache-Control"]=="no-cache";
//asserttheresponsebody
defbookRoot=net.sf.json.JSONSerializer.toJSON(messageExchange.responseContent);
assertbookRoot.get("id")==expectedID;
assertbookRoot.get("name")==expectedName;
assertbookRoot.get("price")==29.0;
上述使用GroovyScript对Service调用结果进行验证,可用的soapUI对象包括:
messageExchange,context以及log。
●messageExchange:
当前交互request/response的MessageExchange,可以用来直接访问messagecontent,HTTPHeaders,Attachment等对象。
●context:
运行当前TestCase的TestRunContext对象,具体使用方式请参见soapUIAPI文档。
●log:
一个标准的Log4jLogger对象,可以用来输出日志。
依照上述步骤定义好TestCase并添加适当的断言之后,就可以对在线书店REST服务进行测试。
双击BookStoreSerive_TestSuite,点击Run按钮来运行所有的TestCase,结果如下图所示:
图7.运行测试用例
性能测试
性能测试在soapUI中称为LoadTest,针对一个soapUI的TestCase,可以建立一个或多个LoadTest,这些LoadTest会自动的把TestCase中的所有步骤都添加到其中,在运行的时候,soapUI会自动的使用多个线程来运行这些TestStep,同时也会监控它们的运行时间,例如最短时间,最长时间,平均时间等等。
这样用户能够很直观的看到REST服务的响应时间,从而对性能进行调优。
建立LoadTest非常简单,只需要在“LoadTests”上点击右键,选择"NewLoadTest",然后输入名称即可,下图是一个针对GetBookList的性能测试,可以看到有两个TestStep:
"GetBookList_xml"和"GetBookList_json",100个线程并发执行,时间限制是60秒。
最后的结果是,最短时间4毫秒,最长时间1204毫秒,平均时间20.54毫秒。
图8.性能测试
性能测试还支持断言,用户可以对一个TestStep或TestCase设置运行时间要求,例如平均时间大于2秒就认为失败,点击图8中的“LoadTestAssertions”就可以设置。
当然根据需要,用户也可以编写脚本来做一些准备工作,或者清除工作。
参见图8中的"SetupScript"和“TearDownScript”。
与BuildForge集成
测试可以有效的保证代码的质量,但是仅仅手工的、在本机上运行的REST服务测试时远远不够的。
实际上把测试作为软件构建的一部分,加入到持续集成中去是一个常见的敏捷开发实践,通过频繁的,自动化的测试,可以更有效的发现缺陷,保证代码质量。
IBMRationalBuildForge是一个管理软件构建和发布的平台,它提供了一个框架来自动化整个构建流程,不仅仅自动化单独的任务,可以集成多种用户现有的脚本和工具,最大限度的保护用户投资。
作为一个框架,BuildForge几乎可以调用操作系统上的任何脚本。
本文重点不在介绍BuildForge,假定读者对BuildForge已经比较熟悉,不熟悉的读者可以查看参考资料中的相关文章。
对于soapUI来说,最简单的一种集成方式就是提供命令行脚本让BuildForge调用。
在上文中我们已经展示了通过soapUI的GUI运行TestCase的功能,那么soapUI可不可以通过命令行完成类似的功能呢?
答案是肯定的。
soapUI提供了一个命令行工具testrunner.bat来运行一个项目中的TestSuite,可以在
-s指定要运行的TestSuite
-f指定运行结果的输出目录
-j生成junit风格的report
-r运行完成以后打印一个简单的summary
下面这行命令就是运行bookstore.xml这个soapUI项目中的BookstoreTestSuite,把结果输出到c:
\temp\reports中。
testrunner.bat-sBookstoreTestSuite-r-jC:
\developerWorks\soapui\bookstore.xml-fc:
\temp\reports
有了testrunner,把soapUI的测试集成到BuildForge中就很简单了,只需要在BuildForge的项目中添加一个步骤,参见下图:
图9.BuildForge中使用testrunner
总结
从上文可以看出,soapUI是一款强大的Web服务测试工具,它提供了便利的GUI界面帮助用户对REST服务进行快速的测试,使用简单,学习成本很低。
它也提供了可编程能力例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- soapUI REST 服务
![提示](https://static.bdocx.com/images/bang_tan.gif)