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 sum

5.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,这份文档应该让你更好地了解。祝好运!

时间: 2024-08-04 22:00:54

MockService脚本概述的相关文章

4_Shell语言———脚本概述

一.初识脚本 简单说,脚本就是数条可执行语句的罗列.例如我们将以下可执行命令粘贴至first.sh 这个文件中: UserName=user1 mkdir /users useradd -d /users/$UserName $UserName echo $UserName | passwd --stdin $UserName 这样first.sh就是一个脚本,sh用来标注这是一个shell脚本,它能够使用以下命令执行: # bash first.sh 二.脚本的执行 上面的例子中我们使用了ba

脚本概述

1.shell概念 Shell是一个用C语言编写的程序,他是用户使用linux的桥梁.shell及时一种命令语言,也是一种程序设计语言 2.shell脚本结构 shell脚本(shell script),是一种为shell编写的脚本程序. 1.开头:#!/bin/sh或#!/bin/bash 符号#!用来告诉系统,这个脚本需要什么解释器来执行,即使用哪一种 Shell. 2.注释: 以#开头的行表示注释 3.命令行的书写规则: 一行一条命令 若一行多个命令,用分号(;)分割 长命令可以使用反斜线

MySQL 主从延迟监控脚本(pt-heartbeat)

对于MySQL数据库主从复制延迟的监控,我们可以借助percona的有力武器pt-heartbeat来实现.pt-heartbeat通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟.本文主要是通过脚本来定期检查从库与主库复制的延迟度并发送邮件,供大家参考. 有关pt-heartbeat工具的安装可以参考:percona-toolkit的安装及简介    有关pt-heartbeat工具的介绍可以参考:使用pt-heartbeat监控主从复制延

Shell脚本编程规范与变量

主要内容 Shell脚本编程规范 Shell脚本应用场景 Shell编程规范 管道与重定向 Shell脚本变量 自定义变量 特殊变量 Shell脚本概述 Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件 给该文件可执行权限,便可运行 可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作 批量事务处理 自动化运维 服务运行状态监控 定时任务执行 编写第一个Shell脚本 1.编写脚本代码 使用vim文本编辑器,每行一条Linux命令, 按执行顺序依次编写:

TiOps脚本库如何使用

TiOps提供了脚本库的功能,用于统一存放和授权脚本.TiOps的脚本库,最大的特点是,它可以支持脚本版本的功能,有点gitlab网页版的感觉.登录TiOps,在左侧菜单栏中选择[脚本库],默认里面是没有任何脚本的,需要我们先创建脚本库点击确定,一个脚本库就创建好了,创建完成之后,如下图左侧会有一个文件夹,默认名称和脚本库的名称相同,这里还可以创建新的文件夹,选择左侧文件夹,右侧可以创建脚本,上传脚本,更多里面是复制和移动脚本,点击创建脚本脚本创建完成之后,会看到如下的界面,点击编辑,在编辑框中

游戏开发中的人工智能 复习

游戏开发中的人工智能 复习 (个人复习,一些仅是给自己的复习提示(=w=),转载注明出处:http://blog.csdn.net/hcbbt/article/details/42815479) 配套教材:游戏开发中的人工智能 知识点 移动 Bresenham,视线(略),拦截 // Bresenham if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fr

13_Shell语言———语言控制结构之for循环语句

一.语言控制结构概述 在前文中(4_Shell语言---脚本概述)介绍过面向过程的编译语言,其控制结构主要有以下三种: a) 顺序执行:默认法则:一句一句逐行执行: b) 选择执行:进行条件判断,只有部分是符合条件的,故只执行符合条件的部分: 条件判断通常采用布尔测试:即判断条件为真或为假,在bash中: 0: 为真 1~255: 为假(即非0为假,这点和很多编程语言相反) c) 循环执行:将同一段代码反复执行N次,若N为无穷大,则会出现死循环的现象,故循环必须有退出条件,这里的N就是退出条件.

渗透流程与相应的工具使用

从渗透的行为,一般可以分为 1.黑帽子 ----以个人意志出发攻击. 2.白帽子 ---- 一般受雇于安全厂商,提高网络安全水平的主要力量. 3.灰帽子 ----往往技术超过黑帽子白帽子,为了利益或者其他冲突,多以行为来彰显自己的风格. 渗透,这正邪两字,原本难分.正派弟子若是心术不正,便是邪徒;邪派中人只要一心向善,便是正人君子.--------------- 张三丰 0x01:基础科普 1.应该了解的基础 WEB语言常见几大类: 1. HTML 超文本标记语言,标准通用标记语言下的一个应用.

Python自动化打包业务和认证平台

/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */ /* Author: Nicolas Hery - http://nicolashery.com */ /* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */ /* Source: https://github.com/nicolahery/markdownpad-github */ /* RESET =====