背景

在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过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>{&quot;name&quot;:&quot;闫帅&quot;}</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规则下移一位。

使用方式

  1. 修改被测服务的HTTP依赖,将依赖的IP和端口分别设置为mock.ep.sankuai.com和80,并重启被测服务;
  2. 创建Mock规则;
  3. 调用被测服务的API,被测服务将调用Mock服务;
  4. 删除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为环境名,如果使用别的环境,则填写别的环境名

典型案例

  1. 相同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实践相关推荐

  1. 基于django rest framework的mock server实践

    网上找了一下mock server的实现,发现python的基本都是基于flask来实现的,因最近在学django,就尝试用drf实现了下: A brief introduction of sui_m ...

  2. 搭建Mock Server实践(一)理论篇

    背景 在我司 S 产品测试时,日常工作有百分之 70 是需要跟接口测试打交道,搭建的 MockServer 有数十个. 接触过多个搭建 MockServer 平台,整理成文,分享之. 目录 part1 ...

  3. 1分钟搭建极简mock server

    摘自博客园:https://www.cnblogs.com/mikasama/p/9838480.html 1.无聊的背景.起源: 如今的业务系统越来越复杂庞大,各个功能直接的调用也是多如牛毛,但如果 ...

  4. 如何优雅的使用Mock Server

    事出有因 昨天跟同事讨论我们在用的rap2(一个集接口编写和mock server的开源项目)和刚上线了一个easy-mock的server,到底哪个好用. 我们主要讨论的点有个两个: 接口的一致性. ...

  5. python接口测试实战_Python接口测试实战5(下) - RESTful、Web Service及Mock Server

    课程目录 更多学习资料请加添加作者微信:superz-han获取 本节内容 REST及RESTful API Web Service XML解析 Mock Server REST及RESTful AP ...

  6. java mockserver搭建_搭建Mock Server

    1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...

  7. SAP UI5 应用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深入介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. SAP UI5 应用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深入介绍

    学习本步骤之前,请确保你已经复习了步骤 26 和 步骤 62 的知识: SAP UI5 应用开发教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解 SAP UI5 应用开发教程之六 ...

  9. 如何以 mock server 的方式本地启动 SAP UI5 应用,使它不连接服务器端 OData 服务

    我们在做 SAP UI5 开发时,在视图逻辑没有开发完毕时,往往不希望连接服务器端的 OData 服务进行联调,而仅仅连接本地端的测试数据. 本文介绍如果启动本地 mock server,将 SAP ...

最新文章

  1. 2019 半导体领袖新年展望(一)| 半导体行业观察
  2. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
  3. 推荐一个优化分页查询的办法(分页数很大的情况)
  4. javascript读取txt_JavaScript编程语言学习笔记——编程
  5. 前端学习(2580):提升开发效率的工具
  6. c#和python更适合爬虫_python在爬虫方面有哪些优势呢?
  7. 329. 矩阵中的最长递增路径
  8. 【项目合作】低清老视频转高清,视频超分辨
  9. 玩转代码|简单分析如何获取小程序的t值
  10. python实现微信自动回复
  11. 【R】【课程笔记】06 金融波动模型
  12. Linkin-1.0.0提交spark任务到HDP环境报错:failed to request external resource provider
  13. JAVA后台开发提升注解篇 @Deprecated
  14. openwrt查看flash、RAM、CPU信息【转】
  15. 解决windows10 无法开热点问题
  16. ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍
  17. Python数据库(MySQL、MongoDB、Redis)编程
  18. Nodejs 正则表达式
  19. 工作流程管理系统,表结构与运行机制
  20. java终结者改垫圈_邢窑终结者

热门文章

  1. 如何在本地搭建svn本地版本库
  2. 小白学数据分析-----数据指标 累计用户数的使用
  3. C语言 嵌入式 面试小知识点(一)
  4. 陆奇给工程师们的5个建议
  5. 做梦也想有一个这样的实验室
  6. 哇、、、、C++ 实现单向链表
  7. mysql查询数据库第一条记录_SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...
  8. mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...
  9. python模块讲解_python模块详解
  10. mysql数据库用户的创建_mysql创建用户及数据库