SOAPUI使用教程-MockService脚本概述
虽然静态MockOperation和MockResponse模型可以给你一定的灵活性,更多的动态行为添加到您的服务让您更模拟复杂的服务功能是很有用的。例如,你可能想:
- 从请求到响应传输值,修改它们的值
- 看了一些数据的请求,并根据它的值来选择要返回的响应
- 从数据库读取响应
- 手动创建一个自定义HTTP响应
- 等等...
让我们来看看如何在特定的实现这些,但我们会首先给你,你如何让你的MockServices更动态的概述。
1. MockService脚本概述
对于MockService本身有很多可用的脚本事件:
- 启动和停止脚本; 这些都为打开或关闭共享对象(例如集合或数据库连接)。
- OnRequest脚本; 这是主要的处理程序来模拟非SOAP行为(REST等); soapUI做任何内部调度,有任何响应返回给客户端(从而绕过了整个的soapUI的调度机制)的可能性之前,它被调用
- AfterRequest脚本:主要用于自定义日志记录和报告功能
所有这些都可以从MockService窗口:

对于MockOperations一种脚本可能是可用的; 选择“脚本”选项允许您使用决定向MockResponse返回给客户端的脚本,这样的例子

最后,对于MockResponse你可以指定一个“响应脚本”:

创建并返回给客户端的MockResponse消息之前将要执行特定的脚本的功能; 这是产生动态响应的内容主要的地方。
在soapUI中,你还可以定义项目级别的事件处理程序来指定用于运行项目中所有MockServices;

可用的模拟相关的处理程序是:
- MockRunListener.onMockResult - 对应于MockService AfterRequest脚本
- MockRunListener.onMockRunerStart - 对应于MockService启动脚本
- MockRunListener.onMockRunerStop - 对应于MockService停止脚本
- MockRunListener.onMockRequest - 对应于MockService OnRequest脚本
2.模拟处理程序对象
许多对象在大多数脚本通常可用:
- context-用于存储MockService范围的对象,例如数据库连接,安全令牌等
- RequestContext -用于存储模拟请求范围对象,例如动态内容将被插入到响应消息
- mockRequest -对应于MockService取得的实际请求的对象。通过这个对象,你可以关联到传入的消息,头信息等。
- mockResult -封装分配请求的结果的一个对象,这是在MockService.afterRequest脚本可用。
- mockResponse / mockOperation -访问对象的底层配置和功能
- mockRunner -对应于MockService的执行的对象; 这使您可以访问以前的模拟结果等
好了,现在让我们深入的,看看这些可以用!
3.从请求传送值到响应
这是在MockResponse进行简单的脚本; 该脚本使用mockRequest对象的属性获得传入请求,通过提取的XPath所需的值,然后创建的结果写入到的RequestContext属性:
// create XmlHolder for request content
2.def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )3. 4.// get arguments and sum5.def arg1 = Integer.parseInt( holder["//arg1"] )6.def arg2 = Integer.parseInt( holder["//arg2"] )7. 8.requestContext.sum = arg1 + arg2正如你所看到的所提取的值分配给RequestContext的(这是具体的这一要求)一个“sum”属性。:

面板左侧显示发送到我们MockOperation最后一个请求。
4.创建从一个TestCase的结果响应
这是一个比较复杂的; 我们将创建一个首先执行的soapUI的TestCase,并使用其结果来填充MockResponse消息MockResponse脚本:
// create XmlHolder for request content def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent ) // get target testcase def project = mockResponse.mockOperation.mockService.project def testCase = project.testSuites["TestSuite 1"].testCases["TestCase 1"] // set arguments as properties testCase.setPropertyValue( "arg1", holder["//arg1"] ) testCase.setPropertyValue( "arg2", holder["//arg2"] ) // run testCase def runner = testCase.run( new com.eviware.soapui.support.types.StringToObjectMap(), false ) if( runner.status.toString() == "FINISHED" ) requestContext.sum = testCase.getPropertyValue( "sum" ) else requestContext.sum = "Error: " + runner.reason
该脚本首先得到保持TestCase的目标来运行,设置参数值的一些属性,然后执行它。如果一切顺利,结果从另一个TestCase的属性读取,并通过相同的机制返回,否则将显示一个错误信息。
如果我们只是本来想要执行单一请求和返回请求的响应(soapUI的转向成为一个“代理”),我们可以;
// get target request
def project = mockResponse.mockOperation.mockService.project
def request = project.interfaces["NewWebServicePortBinding"].operations["sum"].getRequestByName("Request 2")
// set request from incoming
request.requestContent = mockRequest.requestContent
// submit request asynchronously
request.submit( new com.eviware.soapui.impl.wsdl.WsdlSubmitContext( request ), false )
// save response to context
requestContext.responseMessage = request.responseContentAsXml
在这里,我们分配整个响应到RequestContext属性; 实际MockResponse消息只是一个属性的扩展;

5.选择基于请求的响应
该脚本指定在MockOperation级,并使用与上述相同的代码以从传入的请求中提取输入值。基于某些验证它返回MockResponse的名称返回给客户端。脚本如下:
// create XmlHolder for request content
def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )
// get arguments
def arg1 = holder["//arg1"]
def arg2 = holder["//arg2"]
if( !com.eviware.soapui.support.StringUtils.hasContent( arg1 ) ||
!com.eviware.soapui.support.StringUtils.hasContent( arg2 ))
return "Invalid Input Response"
try
{
Integer.parseInt( arg1 )
Integer.parseInt( arg2 )
}
catch( e )
{
return "Invalid Input Response"
}
// Select valid response randomly
def r = Math.random()
if( r < 0.33 )
return "Simple Response"
else if( r < 0.66 )
return "Call TestCase"
else
return "Call Request"
包含MockResponses:

在脚本中使用的RequestContext变量和我们在前面的例子中所看到的当然是一样的,让你从调度脚本传递值到MockResponse。例如,我们可以添加一个“freeMemory”属性的RequestContext:
//添加诊断 requestContext.freeMemory = Runtime.runtime.freeMemory() ...
这将使其可用于在MockOperation定义的所有MockResponses的属性扩展;

这将返回

到客户端。
6.从数据库读取的响应
这其中需要多做一些工作,因为我们需要建立和关闭数据库连接,我们可以在我们的脚本中使用。最好在MockService启动脚本做如下;
import groovy.sql.Sql
// open connection
def mockService = mockRunner.mockService
def sql = Sql.newInstance("jdbc:mysql://" + mockService.getPropertyValue( "dbHost" ) +
mockService.getPropertyValue( "dbName" ),
mockService.getPropertyValue( "dbUsername" ),
mockService.getPropertyValue( "dbPassword" ), "com.mysql.jdbc.Driver")
log.info "Succesfully connected to database"
// save to context
context.dbConnection = sql
在这里,我们建立了一个连接(使用内置的数据库支持groovys')到配置的数据库(参数配置从MockService性质采取),然后保存在的文本中,使得它所有的脚本都是可用的。MockService停止,相应脚本关闭连接当然是需要的;
// check for connection in context
if( context.dbConnection != null )
{
log.info "Closing database connection"
context.dbConnection.close()
}
}
因此,如果我们开始和停止MockService我们将在日志中看到以下内容:

完美! 在这个具体的和简单的示例中我有一个表包含整个SOAP响应返回给客户端, 请求中的值用于查找响应返回。我选择做所有逻辑在一个单一的MockResponse脚本中:
// create XmlHolder for request content
def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )
// get arguments and sum
def arg1 = Integer.parseInt( holder["//arg1"] )
def arg2 = Integer.parseInt( holder["//arg2"] )
// get connection and perform query
def sql = context.dbConnection
def row = sql.firstRow("select * from tb_saved_messages where arg1 = ? and arg2 = ?", [arg1, arg2])
// save result to property for response
requestContext.responseMessage = row.responseMessage
非常直截了当:
- 从请求中提取所需的值
- 获取从上下文的数据库连接
- 执行查询
- 写响应的RequestContext属性
响应消息本身只拥有属性扩展的内容:

这将导致整个消息被写入的响应。
7.创建一个自定义响应
这是soapUI目前模拟一个REST或更复杂的HTTP服务的唯一途径; 在MockService水平OnRequest脚本,使您可以直接访问底层的HttpRequest和HttpResponse的对象允许您创建你任何喜欢的响应。所有你需要确定是否该脚本返回一个对象Mock结果告诉soapUI停止处理该请求。因此,例如,如果我们要处理,我们可以做以下PUT请求:
// check for PUT
if( mockRequest.httpRequest.method == "PUT" )
{
def result = new com.eviware.soapui.impl.wsdl.mock.WsdlMockResult( mockRequest )
// build path
def path = mockRunner.mockService.docroot + File.separatorChar + mockRequest.httpRequest.queryString
path = path.replace( (char)'/', File.separatorChar )
// create File object and check if it doesnt already exists
def file = new File( path )
if( !file.exists() )
{
// create directories
if( path.lastIndexOf( ""+File.separatorChar ) > 1 )
new File( path.substring( 0, path.lastIndexOf( ""+File.separatorChar ))).mkdirs()
// write content
file << mockRequest.httpRequest.inputStream
mockRequest.httpResponse.status = 201
log.info "File written to [$file.absolutePath]"
}
else
{
mockRequest.httpResponse.status = 403
}
return result
}
正如你所看到的请求主体通过使用MockService选项对话框中的文档根目录设置的URL指定的路径;

必要的目录被创建和相应的状态代码被返回。例如http://localhost:8299/?/some/path/file.dat 与HTTP PUT和消息体将导致文件被创建。您可以使用soapUI的一个HTTP TestRequest步骤做到这一点:

而现在,因为该文件已在MockServices“文档根目录中创建你,可以用你的网页浏览器并指定http://localhost:8299/?/some/path/file.dat 将获取相应的文件。
8.最后的话
就是这样!脚本的可能性MockServices让你轻松创建动态和“栩栩如生”的MockServices,这份文档应该让你更好地了解。祝好运!
SOAPUI使用教程-MockService脚本概述的更多相关文章
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- C#读写文件的方法汇总_C#教程_脚本之家
C#读写文件的方法汇总_C#教程_脚本之家 http://www.jb51.net/article/34936.htm
- inno setup教程解释脚本
inno setup教程解释脚本 2007-04-08 21:31:36| 分类: 科技-> Inno Setu | 标签:inno |举报 |字号 订阅 下载LOFTER客户端 ...
- FastStone Capture(FSCapture) 注册码 _图形图像_软件教程_脚本之家
FastStone Capture(FSCapture) 注册码 _图形图像_软件教程_脚本之家 FastStone Capture 注册码 序列号: name/用户名:TEAM JiOO key/注 ...
- SOAPUI使用教程-REST请求工作
双击一个REST请求在导航打开的REST请求编辑器窗口: 就像相应的SOAP请求编辑器,这个窗口有以下几部分组成: 工具栏在顶部有标准动作的和端口的下拉菜单轻松修改服务端口 请求编辑器左侧有相应编辑视 ...
- SOAPUI使用教程-MockOperations和响应
如前所述,一个MockService有多个MockOperations其中每个可以包含任意数量的MockResponse消息; 也就是说,一个MockService响应实际上包括若干预设响应之间发生变 ...
- SOAPUI使用教程-MockServices工作原理
在soapUI的可让您只需从WSDL基础服务创建一个基于WSDL服务的符合标准的模拟.被称为“MockService”,这可以直接从内部的soapUI运行,命令行浇道,或甚至标准servlet容器. ...
- SOAPUI请求及mockservice 使用
1.新建soap Project,输入wsdl的地址,运行request 2 ...
- soapui 自动化教程
本教程主要讲述对接口的自动化测试,略过压力测试.安全测试. 最终目标是通过groovy脚本执行一个文件,发送多个任务请求.验证返回值是否符合期望. 教程从soapui入门到groovy实现回传参数.生 ...
随机推荐
- 提升PHP编程效率的20个要素
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(兄弟连PHP编程: ...
- nodejs express下使用redis管理session
Session实现原理 实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的Session ID结合浏览器的Cookie实现对Session的管理,一般来说包括以下4个步骤: 服务器 ...
- web自动化工具-Browsersync
web自动化工具-Browsersync browser-sync才是神器中的神器,和livereload一样支持监听所有文件.可是和livereload简单粗暴的F5刷新相比,browsersync ...
- JS打开新页面跳转
有时候使用js进行页面跳转,想使用 a 标签中 target="_blank" 形式,跳转打开一个新的页面. 可以使用以下脚本,创建一个 a标签,然后模拟点击操作. 代码如下: ...
- 耿丹CS16-2班第五次作业汇总
Deadline: 2016-10-26 23:59 作业内容 实验4-1 求1到20的阶乘的和,其中求阶乘用函数完成. 实验4-2 写一个判素数的函数,在主函数输入一个整数,输出其是否是素数的信息. ...
- 【项目】百度搜索广告CTR预估
-------倒叙查看本文. 6,用auc对测试的结果进行评估: auc代码如下: #!/usr/bin/env python import sys def auc(labels,predicted_ ...
- 导入maven工程错误
有时候导入maven工程会报空指针异常: An internal error occurred during: “Updating Maven Project”. java.lang.NullPoin ...
- java 深入技术七(类的结构和反射)
1.java反射(reflect) java 类的结构 java反射机制就是把java类按结构分解,每一部分对应特定的反射类 java反射机制允许运行时加载,探知和使用在编译期间完全未知的classe ...
- <css系列>之css--float总结
一.float的历史 float的设计初衷是实现文字环绕效果. 如下图,对图片添加float,文字实现环绕效果. 二.float特性 1.包裹性,表现:收缩.坚挺.隔绝.具有包裹性的属 ...
- wget 扒站
在Linux下,通过一个命令就可以把整个站相关的文件全部下载下来. wget -r -p -k -np [网址] 参数说明: -r : 递归下载 -p : 下载所有用于显示 HTML 页面的图片之类的 ...