千金一刻莫空度,老大无成空自伤。这篇文章主要讲述使用REST discovery(pro)生成SoapUI测试相关的知识,希望能为你提供帮助。
本部分将告诉你在RESTful web服务已经存在的情况下怎么生成测试?SoapUI的专业版本有REST discovery 功能,该功能允许与RESTful API进行交互时被录制且被用于生成测试。
4.1 准备阶段为了提供一个RESTful web服务的例子,需要扩展上一章中invoice服务有全部的CRUD功能。接口样子如下:
Resource: ??http://localhost:9000/invoiceservice/v1/invoice??
Supported Methods:
POST invoice - Create Invoice.
GET invoice/id – Get (Read) Invoice.
PUT invoice/id – Update Invoice.
DELETE invoice/id – Delete Invoice
Invoice文档如下:
"Invoice":
"id": 12345,
"companyName": "Test Company",
"amount": 100
这个服务实现是非常基础的。创建(POST)方法不是幂等的,它将在每个成功的请求上创建新的invoice对象,其ID为invN形式,其中N是从0开始的序列号,例如inv0,inv1等等。GET、UPDATE、DELETE方法将返回HTTP的状态码,如果一个带有执行ID的invoice在之前没有被创建,将返回一个404的状态码。Invoice被存储在一个java的HashMap中,因此不是被持久保存的,当服务重启时,在启动后HashMap是空的!
之前创建的服务例子存放在:< chapter1samples> /rest/invoice_crud,启动服务的服务和上一章中描述的一样,截图如下:
如果看到异常“Port already in use”,这时你要确保没有其他服务占用端口9000,例如上一章的服务。本章将使用火狐浏览器来进行说明。如果没有安装,请下载火狐浏览器。如果这时不可能的,其他选项在后面描述中被提及。
4.2 操作步骤 SoapUI为发现RESTful web服务提供两种选择。第一选择是使用内部浏览器(Internal Browser),第二选择是用代理模式(proxy mode)。内部浏览器选项是唯一有用的,如果满足以下要求:
l 只测试GET请求,因为没有其他方法是可能的
l 你正在通过网页发现服务,就像SoapUI在线帮助Swagger中的例子一样
l 需要使用HTTPS进行测试,在编写本文时,代理不能支持。
否则一旦成立,代理模式对于包括这部分在内的许多API场景中的测试来说是一个更加通用的选择。
1. 打开SoapUI创建一个新的项目,然后选择“Discover REST APIs using ”选择“Internal browser”。点击OK,你将看到SoapUI代理默认信息:
这个例子,我们只考虑内部客服端的详细信息。使用外部客户端涉及几乎相同的步骤,除了需要的网络设置超出了本书的范围。服务(localhost)和端口(8081)是键值对。这些将被我们选择用于实际服务交互的任何REST客户端使用。
TIPS:REST Clients:在这里有很多好而且免费的选择。例如Eclipse和IntelliJ类似这样的IDE有一个好的REST客户端插件。基于浏览器的REST客服端也有很好的,例如:Chrome的Postman插件、Firefox的RESTClient插件。当选择其中一个进行使用,需要考虑代理的设置,至少暂时,是为了通过SoapUI的代理路由请求。你也可以使用命令行选项,使用一些类似于curl(https://curl.haxx.se/docs/manpage.html)的命令。选择最适合自己的,这章将使用Firefox的RESTClient插件。
2. 下载Firefox插件的RESTClient,可以在火狐浏览器的“Tools Menu|Add-ons”搜索RESTClient,点击“Add to Firefox”。重启火狐浏览器,在“Tools Menu”中会看到RESTClient的ico在客户端点开RESTClent:
3. 我们需要将Firefox代理设置配置为指向SoapUI代理:
1)打开Preferences(选项)|Advanced(高级)|Network(网络)
2) 在“Connection”下,在“Configure how Firefox connects to the Internet”点击“Settings”
3) 选择“Mannual proxy configuration”,输入SoapUI代理的详细信息,截图如下:
4) 点击OK
4. 准备通过SoapUI代理使用RESTClient。作为首次测试,向之前那样请求WADL,通过选择一个GET方法,添加一个URL: ??http://localhost:9000/invoiceservice/v1?_wadl??,点击“Send”。你将看到在RESTClient响应body中的WADL,SoapUI代理“RecordedResquest”增加到1。
TIPS:确保服务在运行,否则将会出现“拒绝连接”信息。服务持续运行时长是10分钟,可以在Server.java中调整!其他请求也会通过火狐浏览器,也会增加录制请求的数量。任何不需要的请你去,在后期会进行过滤。
5. 在尝试提交或放置任何invoice数据之前,需要把请求内容的类型(Content-type)为application/json;否则,状态码415将会出现,该状态表明”不支持媒体类型”。操作步骤如下:
1) 点击“RESTClient Headers”,选择“Custom Header”
2) 在“Resquest Header”弹出框中,输入Name为“Content-Type”,Value为“application/json”,这时点击OK
3)这时在Headers部分的Content-Type:application/json
6. 做一下事实请求,首先创建一个invoice。设置如下值:
Method:POST
URL:??http://localhost:9000/invoiceservice/v1/invoice??
Body:
"Invoice":
"id": 12345,
"companyName": "Test Company",
"amount": 100
点击”Send”,将会看到“Response Header”状态码为200 OK,,而且“Response Body”:
7. 更新invoice:
Method:POST
URL:??http://localhost:9000/invoiceservice/v1/invoice??
Body:
"Invoice":
"id": 12345,
"companyName": "Real Company",
"amount": 100
点击”Send”将看到“Response Header”状态码为200而且“Response Body”:
8. 获取invoice,方法为GET,而且URL: ?? http://localhost:9000/invoiceservice/v1/invoice/inv0??。点击”Send”,将看到一个状态码为200:
9. 删除invoice,方法是DELETE,而且URL: ?? http://localhost:9000/invoiceservice/v1/invoice/inv0。将看到一个响应码为200?? OK,响应信息不带有任何信息。
10. 最后,再次尝试获取invoice,你将看到一个状态响应码为404。
11. 现在生成SoapUI测试,执行以下操作:
1) 在SoapUI页面点击“Done”。将进入如下界面:
2) 点击“生成服务(Genrate service)”,选择“Service+TestSuite”。点击“OK”在弹出的窗口这时输入TestSuite的名字,例如:“TestSuite Rest Discovery”:
输入TestSuite名后,点击OK在弹出的窗口输入:TestCase。
3)一个成功的弹出窗口将显示;点击OK关闭发现,这时将在项目名为Project 1下看到所有生成的request、TestSuite、TestCase、以及每个请求的TestSteps。
4.3 工作原理 SoapUI设置自己的代理来监听通过它发送的所有HTTP流量。当通过REST客户端创建的一个请求,SoapUI能够提取细节并构建一个样例请求列表。这时,当您完成录制时,SoapUI使用请求列表生成测试工件,方法与请求来自其他源(例如WADL)的方式相同。
在检查生成的REST项目时,我们可以看到REST发现为从现成的服务中收集样本请求提供了有用的手段。你将需要创建Assertions且/或组织生成TestSteps。当涉及重构测试时,REST发现功能是非常有用的,也许围绕着一个代码优先的服务,就像上面的例子。它也是特别有用的对于服务不提供一个WADL或者相似定义,因此不能使用其他SoapUI方法生成测试请求。
【使用REST discovery(pro)生成SoapUI测试】
推荐阅读
- 创建函数-----------(向函数传递数组从函数返回数组)
- sedgawk介绍与正则表达式-----------(扩展的正则表达式)
- 创建函数-----------(创建函数定义函数使用函数返回值)
- sedgawk介绍与正则表达式-----------(定义基本正则表达式(BRE)模式)
- 脚本控制------------------------(at命令mail命令batch命令cron表格anacron表格)
- sedgawk介绍与正则表达式-----------(正则表达式定义与类型)
- 脚本控制------------------------(作业控制查看作业jobs命令重新启动停止的作业)
- sedgawk介绍与正则表达式-----------(sed编辑器基础知识)
- 脚本控制------------------------(nice与renice命令进程优先级控制)