用 java 安装 mockserver,Mock Server实践

article/2025/9/18 3:58:48

背景

在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过REST API或是Thrift调用来进行通信。要对被测服务进行系统测试,一般做法是,部署好所有外部依赖模块,由被测服务直接调用。然而有时被调用模块尚未开发完成,或者调用返回不好构造,这将影响被测系统的测试进度。为此我们需要开发桩模块,用来模拟被调用模块的行为。最简单的方式是,对于每个外部模块依赖,都创建一套桩模块。然而这样的话,桩模块服务将非常零散,不便于管理。Mock Server为解决这些问题而生,其提供配置request及相应response方式来实现通用桩服务。本文将专门针对REST API来进行介绍Mock Server的整体结构及应用案例。

1.png

名词解释

Mock规则:定义REST API请求及相应模拟响应的一份描述。

Mock环境:根据请求来源IP来区分的Mock规则分组。Mock Server可以定义多套Mock环境,各套环境间相互隔离。同一个IP只能对应一个Mock环境,不同的IP可以对应同一个Mock环境。

整体结构

Mock Server由web配置页面Mock Admin及通用Mock Stub组成:Mock Admin提供了web UI配置页面,可以增加/删除请求来源IP到Mock环境的映射,可以对各套环境中的Mock规则进行CRUD操作;Mock Stub提供通用桩服务,对被测系统的各类REST API请求调用,返回预先定义好的模拟响应。为了提高桩服务的通吐,使得桩服务能在被测系统压力测试中得到好的表现,我们开启了5个桩服务,通过Nginx做负载均衡。Mock Server的整体结构如下图所示。

2.png

数据存储

将请求来源IP到Mock环境名的映射存储到mock-env.conf中,mock-env.conf的每一行定义了一条映射,如:

192.168.3.68 闫帅的测试机环境

这条映射表明来源是192.168.3.68的请求,使用Mock环境名为闫帅的测试机环境的Mock规则。

将配置的Mock规则存放到.xml中,下面部分展示了Mock规则的存储格式。

...

/api/test/.*

GET|POST|PUT|DELETE

...

...

200

application/json;charset=UTF-8

...

...

Mock Stub

当请求发送到Mock Stub时,Mock Stub会根据请求的来源IP找到对应的独立环境名,然后根据独立环境名获取所有预定义的Mock规则,遍历这些Mock规则,如果找到一条规则与接受到的请求匹配,那么返回预定义的模拟响应。如果找不到规则匹配,那么返回404错误。其中,规则匹配是根据请求中的uri/method/headers/parameters/body是否与Mock规则中定义的对应字段正则匹配来定的。

4.png

Mock Admin

打开Mock Admin配置页面,如果尚未映射来源IP地址到环境,则点击环境列表导航链接,进入环境列表页面,点击添加,输入源IP及环境名,点击确定按钮,实现源IP到所设环境的映射。

5.png

点击规则列表,规则列表页面将默认罗列出default环境的所有Mock规则(如“语音登录code获取”规则)。重新选择环境,可以罗列出所选环境中的Mock规则。每个Mock规则都处于详细信息展开的状态。点击“全部折叠”按钮,将把所有的规则详细信息给隐藏;点击“全部展开”按钮,将把所有的规则详细信息给展开。点击“只显示本人创建的规则”,将过滤得到mis账户用户创建的规则。点击“按创建时间排序”的开关按钮,将实现Mock规则的升序/降序显示。

6.png

点击导航栏的“新建规则”选项,可以创建一个Mock规则,需要填写规则名称、请求及响应,并选中环境。对于请求,需要填写URL及勾选Method,如果要求对于符合某种规则的请求才被Mock,则填写对应的Headers/Parameters/Body Like,这些数据都是正则匹配的形式。对于响应,如果勾选了“返回真实响应”,则只需要关注延时(延时是指返回请求需要的sleep时间,单位是毫秒)。此时需要将请求的URL地址给写完整了,需要包含host(IP)及port,不能只是path。如果不勾选“返回真实响应”,则将返回模拟响应。Status Code填写返回码,比如200,404;Format选择返回数据的格式,比如json,html等;还可以返回自定义的Headers及响应的Body。点击新建按钮以后,如果创建成功,则提示成功创建,并跳转到规则列表页面。

7.png

对于一个创建好的Mock规则,可以点击Action下拉菜单,进行操作。如果点击“克隆”,则跳转到“新建规则”页面,并将克隆的Mock规则信息给填充进去;点击“编辑”,则跳转到更新页面,更新页面填充了要编辑的Mock规则信息;点击“删除”,则弹出确认删除对话框,点击确定按钮,将删除此规则;点击取消按钮,则取消删除操作。如果此Mock规则处于详细信息展开状态,则可点击折叠来隐藏详细信息;如果处于详细信息折叠状态,则可点击展开选项,将显示详细信息。上移选项,可以将Mock规则上移一位;下移选项,可以将Mock规则下移一位。

8.png

使用方式

修改被测服务的HTTP依赖,将依赖的IP和端口分别设置为mock.ep.sankuai.com和80,并重启被测服务;

创建Mock规则;

调用被测服务的API,被测服务将调用Mock服务;

删除Mock规则(可选)。

编程使用

创建/删除Mock规则,除了可通过Mock Admin页面配置外,Mock Server还提供了SDK方式,用户可以通过编码来使用Mock Server。

在Maven工程pom.xml中添加mock-client依赖

com.sankuai.meituan.ep.mockserver

mock-client

1.0.6

创建/删除Mock规则

// 构造Mock规则

MockRule rule = new MockRule();

rule.setMockName("test-" + System.currentTimeMillis()); // Mock name必须设置

rule.setAuthor("yanshuai"); // author必须设置,设置为代码编写者的mis账号前缀,比如lining03

MockRequest mockRequest = new MockRequest();

mockRequest.setUri("/api/test/" + System.currentTimeMillis()); // Mock请求的uri必须设置

/**

* Mock请求的方法必须设置

* 如果只有GET请求,则写成GET;

* 如果有GET请求及PUT请求,则写成GET|PUT;

* 即用|分割请求方法,不能有空格。

*/

mockRequest.setMethod("POST|GET");

// 必要的话,设置Mock请求的匹配header

List mockRequestHeaders = new ArrayList();

mockRequestHeaders.add(new MockRequestHeader("device", "android2.3"));

mockRequest.setHeaders(mockRequestHeaders);

// 必要的话,设置Mock请求的匹配参数

List mockRequestParameters = new ArrayList();

mockRequestParameters.add(new MockRequestParameter("wd", "123.*"));

mockRequestParameters.add(new MockRequestParameter("version", "v1"));

mockRequest.setParameters(mockRequestParameters);

rule.setMockRequest(mockRequest);

MockResponse mockResponse = new MockResponse();

mockResponse.setDelay(1000L); // 设置Mock响应的延时

mockResponse.setStatusCode(200); // 设置Mock响应的状态码

/**

* 设置Mock响应的格式

* 如果是json返回,则为application/json;charset=UTF-8;

* 如果是文本返回,则为text/plain:charset=UTF-8;

* 如果是xml返回,则为text/xml;charset=UTF-8;

* 如果是html返回,则为text/html;charset=UTF-8。

*/

mockResponse.setFormat("application/json;charset=UTF-8");

List mockResponseHeaders = new ArrayList(); // 设置Mock响应的header

mockResponseHeaders.add(new MockResponseHeader("customHeaderName", "customHeaderValue"));

mockResponse.setMockResponseHeaders(mockResponseHeaders);

mockResponse.setBody("{\"code\":200}"); // 设置Mock响应的body

rule.setMockResponse(mockResponse);

// 创建Mock规则

final MockClient client = new MockClient();

String id = client.addRule("default", rule); // default为环境名,如果使用别的环境,则填写别的环境名

// 调用被测服务的API,被测服务将调用Mock服务

// 省略调用代码...

// 删除Mock规则

client.removeRule("default", id); // default为环境名,如果使用别的环境,则填写别的环境名

典型案例

相同Mock环境,同一接口,不同参数,可以有不同的Mock结果

按照下图,依次创建这两条规则(顺序相关),然后在default环境对应的机器上,访问http://mock.ep.sankuai.com/user/v1/info?token=fake,返回{"code":401,"type":"sys_err_auth_fail","message":"invalid token"};访问http://mock.ep.sankuai.com/user/v1/info?token=other,返回{"user": {"id": 29008301,"mobile": "15001245907","isBindedMobile": 1}}。

9.png

10.png

真实请求延时Mock

按照下图创建规则,在闫帅的测试机环境对应的机器上,访问http://mock.ep.sankuai.com/api/v1/divisions,将延迟5s返回城市列表json串。

11.png

不同Mock环境,完全相同的接口参数,可以有不同的Mock结果

按照下图创建规则,在闫帅的测试机环境对应的机器上,访问http://mock.ep.sankuai.com/cachier/paynotify返回值是failure;在支付php环境对应的机器上,访问http://mock.ep.sankuai.com/cachier/paynotify返回值是success。

12.png

13.png


http://chatgpt.dhexx.cn/article/ykCeq3ah.shtml

相关文章

Mock-- Server的使用

近日项目需求 使用mock-server来提供虚拟数据(API),方便在服务被调用方没有开发好的情况下,服务调用方能不被耽误的继续进行开发 。 我们的情况大概是这样: 我们的服务去调用 另一方提供的服务,另一方的服务可能还没有开发好&…

前端调试,模拟数据利器之Mock Server使用教程来啦~

文章目录 1 MockServer是什么2 为什么要使用MockServer3 MockServer的作用4 搭建MockServer服务4.1 部署MockServer服务详细步骤4.1.1 第一种方式(推荐)4.1.2 第二种方式 4.2 启动Shell脚本4.3 访问MockServer UI界面 5 MockServer服务的基础使用5.1 项目…

浅谈 Mock Server

What?什么是 Mock Server Mock 是模拟的意思。在测试中,通常表述为:对测试过程中不容易构造或者不容易获取的物件,用一个虚拟的物件来进行模拟的一个过程。能够提供 Mock 功能的服务就叫作 Mock Server。 Mock Server 通过模拟真…

Mock Server 入门

Mock Server介绍 什么是mock ? 我在去年的时候介绍一篇幅 python mock的基本使用,http://www.cnblogs.com/fnng/p/5648247.html 主要是针对单元测试的应用,它可以很方便的解除单元测试中各种依赖,大大的降低了编写单元测试的难度。 什么是Mo…

Matlab解决脚本中中文乱码问题

首先下载字体yahei consolas hybrid。百度网盘地址: 链接:https://pan.baidu.com/s/1Zv2FMt3uow7DZix2rtAbrA 提取码:am4d 然后将下载的字体保存在C:\Windows\Fonts中,启动Matlab2018a这里使用的是2018a版本,其他版…

WEB UI自动化测试之AutoMagic自动化测试

AutoMagic自动化测试平台 AutoMagic 是一个基于WebUI的自动化管理平台。为什么叫AutoMagic呢?因为自动化(Automation)在执行起来的时候是一个很神奇的事情,它可以无人值守的模拟人的操作,就像魔术(Magic&a…

Jupyter Notebook从入门到精通

下载 本课程练习完整代码 Jupyter Notebook: https://gist.github.com/zgpeace/8d3eb8c803a54d1ca797fa26cb68bd4c 财富500强 csv下载 https://github.com/zgpeace/fortune500.git 1. 什么是 Jupyter 笔记本? Jupyter Notebook 是一个非常强大的工具&…

dev shm mysql_新特性:/dev/shm对Oracle 11g的影响

ORACLE 从11g版本开始,引入了一个自动内存管理(Automatic Memory Management)特性,该特性需要更多的共享内存(/dev/shm),因此如 /dev/shm对Oracle 11g的影响: ORACLE 从11g版本开始,引入了一个自动内存管理(Automatic Memory Mana…

Git分布式版本控制工具

Git分布式版本控制工具 文章目录 Git分布式版本控制工具1、目标 2、概述2.1、开发中的实际场景2.2、版本控制器的方式2.3、Git工作流程图 3、Git安装与常用命令3.1、Git 环境配置3.1.1 下载与安装3.1.2 基本配置3.1.3 为常用指令配置别名3.1.4 解决 GitBash 乱码问题 3.2、获取…

关于我在windows使用volatility取证这档事

官网下载地址:https://www.volatilityfoundation.org/releases volatility3的官方文档:https://volatility3.readthedocs.io/en/latest/basics.html 下载 看清有两个版本,用法不一样 第一次我下载了Volatility 2.6 Windows Standalone Exe…

DLNLP学习笔记03(Speech Recognition: LAS模型)

Listen, Attend, and Spell (LAS) [Chorowski. et al., NIPS’15] 论文地址:https://arxiv.org/pdf/1508.01211.pdf 1 模型简介: 2 Listen:其中Encoder可以为RNN,CNN或者RNNCNN。 Listen-down sampling:(RN…

On Device Debug!IDA+GDB trace automagic.apk in s1

2019独角兽企业重金招聘Python工程师标准>>> http://forum.xda-developers.com/showthread.php?t2050393 Well... I have attached a debugger to native code, set breakpoints, analyzed registers, memory, etc. It wasnt that easy though. It took me severa…

【Jetson Nano 入门】环境配置汇总

文章目录 前言一、镜像烧写二、PWM风扇自动调速三、使用MicroUSB在电脑打开终端四、VNC实现局域网及网线直连通信五、SSH文件传输六、状态监控软件Jtop七、检查CUDA、OpenCV及cuDNN八、USB摄像头测试软件Camorama九、CSI摄像头测试十、实现Yolov4-tiny的USB摄像头实时检测 前言…

WEB UI自动化测试之AutoMagic自动化测试平台开源

作者介绍: 网名: Ray 介绍:笑起来像个孩子,冷起来是个迷。 博客:http://www.cnblogs.com/tsbc/ 2018年3月29日,Ray说准备把AutoMagic自动化测试管理平台开源了!!! 这是个好消息&…

三星s20 android auto,Automagic一个更简单的方式来自动化您的Android手机 | MOS86

你有没有想过你的智能手机会在你回家的时候开始播放音乐?当你关闭社交网络的时候怎么样?Automagic是一种替代方案,通过使用易于理解的流程图执行许多相同的任务,向用户提供了一种更简单的自动化Android手机的方法。 Automagic如何…

AutoMagic自动化测试平台简介

PS:给想做自动化平台同学一点思路。 AutoMagic 是一个基于WebUI的自动化管理平台。为什么叫AutoMagic呢?因为自动化(Automation)在执行起来的时候是一个很神奇的事情,它可以无人值守的模拟人的操作,就像魔术&#xff0…

AutoMagic设计思路简介及新增自定义关键字实例

目录 简介 AutoMagic介绍 SeleniumKey介绍 自定义关键字 简介 AutoMagic 是一个基于WebUI的自动化管理平台。为什么叫AutoMagic呢?因为自动化在执行起来的时候是一个很神奇的事情,它可以无人值守的模拟人的操作,就像魔术(Magic&am…

AutoMagic-开源自动化平台的容器化构建

github上看到AutoMagic自动化平台开源了,一时手痒,就试着搭了一套环境,现在把思路和大家说一说。 AutoMagic从其工作分工分两部分: 1:Web端管理平台 管理平台基于Python Django框架Mysql开发,主要用来管理自…

Automagic Premium 安卓上的自动化神器

每当我使用手机时,就对各种App的签到领奖非常反感,如果不签好像吃了亏,签一次花的时间自己也觉得不值。这时候我就在想,如果有一个App,能够自动帮我完成这种每天重复执行的任务就好了。之前找到一个叫uiautomator2的py…

[重磅消息]AutoMagic自动化测试平台开源

作者介绍: 网名: Ray 介绍:笑起来像个孩子,冷起来是个迷。 博客:http://www.cnblogs.com/tsbc/ 2018年3月29日,Ray跟我说准备把AutoMagic自动化测试管理平台开源了!!! 这是个好消息&…