Mock Server实践
背景
在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过REST API或是Thrift调用来进行通信。要对被测服务进行系统测试,一般做法是,部署好所有外部依赖模块,由被测服务直接调用。然而有时被调用模块尚未开发完成,或者调用返回不好构造,这将影响被测系统的测试进度。为此我们需要开发桩模块,用来模拟被调用模块的行为。最简单的方式是,对于每个外部模块依赖,都创建一套桩模块。然而这样的话,桩模块服务将非常零散,不便于管理。Mock Server为解决这些问题而生,其提供配置request及相应response方式来实现通用桩服务。本文将专门针对REST API来进行介绍Mock Server的整体结构及应用案例。
名词解释
- 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的整体结构如下图所示。
数据存储
- 将请求来源IP到Mock环境名的映射存储到mock-env.conf中,mock-env.conf的每一行定义了一条映射,如: 192.168.3.68 闫帅的测试机环境 这条映射表明来源是
192.168.3.68
的请求,使用Mock环境名为闫帅的测试机环境
的Mock规则。 - 将配置的Mock规则存放到<对应Mock环境名>.xml中,下面部分展示了Mock规则的存储格式。
<configuration>
...<mock id="716add4f-33f7-49ac-abf3-fc617712ffea" name="test001" author="yanshuai"><request><uri>/api/test/.*</uri><method>GET|POST|PUT|DELETE</method><parameters><parameter name="name" value="test.*"/>...</parameters><headers><header name="nb_deviceid" value="1E[0-9a-zA-Z]+"/>...</headers></request><response delay="1000" real="false"><statusCode>200</statusCode><format>application/json;charset=UTF-8</format><customHeaders>...</customHeaders><body>{"name":"闫帅"}</body></response></mock>
...
</configuration>
Mock Stub
当请求发送到Mock Stub时,Mock Stub会根据请求的来源IP找到对应的独立环境名,然后根据独立环境名获取所有预定义的Mock规则,遍历这些Mock规则,如果找到一条规则与接受到的请求匹配,那么返回预定义的模拟响应。如果找不到规则匹配,那么返回404错误。其中,规则匹配是根据请求中的uri/method/headers/parameters/body是否与Mock规则中定义的对应字段正则匹配来定的。
Mock Admin
- 打开Mock Admin配置页面,如果尚未映射来源IP地址到环境,则点击环境列表导航链接,进入环境列表页面,点击添加,输入源IP及环境名,点击确定按钮,实现源IP到所设环境的映射。
* 点击规则列表,规则列表页面将默认罗列出default环境的所有Mock规则(如“语音登录code获取”规则)。重新选择环境,可以罗列出所选环境中的Mock规则。每个Mock规则都处于详细信息展开的状态。点击“全部折叠”按钮,将把所有的规则详细信息给隐藏;点击“全部展开”按钮,将把所有的规则详细信息给展开。点击“只显示本人创建的规则”,将过滤得到mis账户用户创建的规则。点击“按创建时间排序”的开关按钮,将实现Mock规则的升序/降序显示。
* 点击导航栏的“新建规则”选项,可以创建一个Mock规则,需要填写规则名称、请求及响应,并选中环境。对于请求,需要填写URL及勾选Method,如果要求对于符合某种规则的请求才被Mock,则填写对应的Headers/Parameters/Body Like,这些数据都是正则匹配的形式。对于响应,如果勾选了“返回真实响应”,则只需要关注延时(延时是指返回请求需要的sleep时间,单位是毫秒)。此时需要将请求的URL地址给写完整了,需要包含host(IP)及port,不能只是path。如果不勾选“返回真实响应”,则将返回模拟响应。Status Code填写返回码,比如200,404;Format选择返回数据的格式,比如json,html等;还可以返回自定义的Headers及响应的Body。点击新建按钮以后,如果创建成功,则提示成功创建,并跳转到规则列表页面。
* 对于一个创建好的Mock规则,可以点击Action下拉菜单,进行操作。如果点击“克隆”,则跳转到“新建规则”页面,并将克隆的Mock规则信息给填充进去;点击“编辑”,则跳转到更新页面,更新页面填充了要编辑的Mock规则信息;点击“删除”,则弹出确认删除对话框,点击确定按钮,将删除此规则;点击取消按钮,则取消删除操作。如果此Mock规则处于详细信息展开状态,则可点击折叠来隐藏详细信息;如果处于详细信息折叠状态,则可点击展开选项,将显示详细信息。上移选项,可以将Mock规则上移一位;下移选项,可以将Mock规则下移一位。
使用方式
- 修改被测服务的HTTP依赖,将依赖的IP和端口分别设置为mock.ep.sankuai.com和80,并重启被测服务;
- 创建Mock规则;
- 调用被测服务的API,被测服务将调用Mock服务;
- 删除Mock规则(可选)。
编程使用
创建/删除Mock规则,除了可通过Mock Admin页面配置外,Mock Server还提供了SDK方式,用户可以通过编码来使用Mock Server。
* 在Maven工程pom.xml中添加mock-client依赖
<dependency><groupId>com.sankuai.meituan.ep.mockserver</groupId><artifactId>mock-client</artifactId><version>1.0.6</version>
</dependency>
- 创建/删除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<MockRequestHeader> mockRequestHeaders = new ArrayList<MockRequestHeader>();
mockRequestHeaders.add(new MockRequestHeader("device", "android2.3"));
mockRequest.setHeaders(mockRequestHeaders);
// 必要的话,设置Mock请求的匹配参数
List<MockRequestParameter> mockRequestParameters = new ArrayList<MockRequestParameter>();
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<MockResponseHeader> mockResponseHeaders = new ArrayList<MockResponseHeader>(); // 设置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}}。
Mock Server实践相关推荐
- 基于django rest framework的mock server实践
网上找了一下mock server的实现,发现python的基本都是基于flask来实现的,因最近在学django,就尝试用drf实现了下: A brief introduction of sui_m ...
- 搭建Mock Server实践(一)理论篇
背景 在我司 S 产品测试时,日常工作有百分之 70 是需要跟接口测试打交道,搭建的 MockServer 有数十个. 接触过多个搭建 MockServer 平台,整理成文,分享之. 目录 part1 ...
- 1分钟搭建极简mock server
摘自博客园:https://www.cnblogs.com/mikasama/p/9838480.html 1.无聊的背景.起源: 如今的业务系统越来越复杂庞大,各个功能直接的调用也是多如牛毛,但如果 ...
- 如何优雅的使用Mock Server
事出有因 昨天跟同事讨论我们在用的rap2(一个集接口编写和mock server的开源项目)和刚上线了一个easy-mock的server,到底哪个好用. 我们主要讨论的点有个两个: 接口的一致性. ...
- python接口测试实战_Python接口测试实战5(下) - RESTful、Web Service及Mock Server
课程目录 更多学习资料请加添加作者微信:superz-han获取 本节内容 REST及RESTful API Web Service XML解析 Mock Server REST及RESTful AP ...
- java mockserver搭建_搭建Mock Server
1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...
- SAP UI5 应用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深入介绍试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP UI5 应用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深入介绍
学习本步骤之前,请确保你已经复习了步骤 26 和 步骤 62 的知识: SAP UI5 应用开发教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解 SAP UI5 应用开发教程之六 ...
- 如何以 mock server 的方式本地启动 SAP UI5 应用,使它不连接服务器端 OData 服务
我们在做 SAP UI5 开发时,在视图逻辑没有开发完毕时,往往不希望连接服务器端的 OData 服务进行联调,而仅仅连接本地端的测试数据. 本文介绍如果启动本地 mock server,将 SAP ...
最新文章
- 2019 半导体领袖新年展望(一)| 半导体行业观察
- python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
- 推荐一个优化分页查询的办法(分页数很大的情况)
- javascript读取txt_JavaScript编程语言学习笔记——编程
- 前端学习(2580):提升开发效率的工具
- c#和python更适合爬虫_python在爬虫方面有哪些优势呢?
- 329. 矩阵中的最长递增路径
- 【项目合作】低清老视频转高清,视频超分辨
- 玩转代码|简单分析如何获取小程序的t值
- python实现微信自动回复
- 【R】【课程笔记】06 金融波动模型
- Linkin-1.0.0提交spark任务到HDP环境报错:failed to request external resource provider
- JAVA后台开发提升注解篇 @Deprecated
- openwrt查看flash、RAM、CPU信息【转】
- 解决windows10 无法开热点问题
- ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍
- Python数据库(MySQL、MongoDB、Redis)编程
- Nodejs 正则表达式
- 工作流程管理系统,表结构与运行机制
- java终结者改垫圈_邢窑终结者
热门文章
- 如何在本地搭建svn本地版本库
- 小白学数据分析-----数据指标 累计用户数的使用
- C语言 嵌入式 面试小知识点(一)
- 陆奇给工程师们的5个建议
- 做梦也想有一个这样的实验室
- 哇、、、、C++ 实现单向链表
- mysql查询数据库第一条记录_SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...
- mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...
- python模块讲解_python模块详解
- mysql数据库用户的创建_mysql创建用户及数据库