测试人必会的 Mock Server 技能
这是无量测试之道的第193篇原创
Mock 是什么?
Mock Server 是什么?
Mock Server 的常用场景
Mock Server 搭建
1.借助第三方工具直接提供 Mock Server
2.自主编码实现 Mock Server(Flask)
总结
Mock 是什么?
Mock 是模拟的意思。在测试中,通常表述为:对测试过程中不容易构造或者不容易获取的对象,用一个虚拟的对象来进行模拟的一个过程。
那么哪些对象不容易构造?哪些对象不容易获取呢?
拿微服务举例,在一个调用链条上,微服务 A 依赖 B 服务才能提供服务,而微服务 B 依赖 C 服务, 微服务 C 依赖 D 服务.....在这样的情况下,把每个依赖的服务都构造完毕再开始测试,就变得不太现实。这种情况我们称之为不容易构造。
又比如,假设我们的服务依赖银行的接口提供资金的查询。在测试中,银行不可能无条件或者随意提供接口给我们调用。那么,在我们开发完毕但是要依赖对方才能开始测试时,我们称这种情况为不容易获取。
无论是哪种情况,使用 Mock 的前提条件是:我们仅关注测试对象自身内部逻辑是否正确,而不关心其依赖对象逻辑的正确性。
Mock Server 是什么?
了解了什么是 Mock,理解 Mock Server 就比较容易了。简而言之,能够提供 Mock 功能的服务就叫作 Mock Server。Mock Server 通过模仿真实的服务器,提供对来自客户端请求的真实响应。
那么 Mock Serve 如何模仿真实的服务器呢?
一般情况下,搭建 Mock Server 前,需要了解将要 Mock 的服务,都能提供哪些功能?对外提供功能时,又以哪种格式提供服务?例如,以接口方式提供服务,接口的种类、接口的定义,以及接口输出的参数等信息。
了解了这些,Mock Server 就可以根据请求的不同,直接静态地返回符合业务规范的接口,也可以在 Mock Server 内部经过简单计算,动态返回符合业务规范的接口。
在实际工作中,Mock Server 通常以 Mock API Server 的形式存在,也就是我们一般以接口的形式对外提供服务,Mock Server 搭建在本地或者远程均可以对外提供服务。
Mock Server 的常用场景
最常见的 Mock Server 的使用场景如下:
前后端联调使用,通过事先约定接口规范,使前端可以不依赖后端服务独立开展工作,这也是开发最常用的功能。
使用 Mock Server 屏蔽无关的真实服务,从而专注于要测试的服务本身。仅仅测试需要测试的服务,其他不在我负责范围的服务使用 Mock。
供测试工程师使用,在测试环境避免调用第三方收费服务。比如,企查查等服务是收费的,在测试环境就可以不调用,以节省费用。
破除第三方依赖。比如,本公司业务流程的某一个步骤需要获取第三方服务的正确返回才能继续进行,那么在测试中就可以用 Mock Server,直接模拟外部 API 的响应来断言系统的正确行为。
以上四条基本可以概括 Mock Server 绝大多数的使用情况。
可以看到,前两条主要是开发之间在使用,那么这个 Mock Server 通常是开发之间协调提供;或者是前端开发根据 API 接口规范,直接写 Hard Code 的响应供自己调用;
或者是后端直接提供一个返回值给前端调用,基于成本和时间考虑,这个返回值通常也是 Hard Code 的。
而后两条就都是跟测试密切相关了,也是今天的分享需要重点关注的。
Mock Server 搭建
Mock Server 的搭建有两种方式,分别是借助第三方工具直接提供 Mock Server,以及自主编码实现 Mock Server。下面将会分别介绍下这两种方式。
1.借助第三方工具直接提供 Mock Server
可以直接提供 Mock Server 功能的第三方工具很多,Postman 是测试人常用的接口测试工具 ,这里我就选择使用Postman的 Mock 功能。Postman 提供了三种方式创建 Mock Server,我们直接选择第一种,并以 Postman 官方给的例子来看下如何不写代码创建 Mock Server。
(1)打开 Postman, 点击"+New" button。
(2)在弹出来的"Create New"选项中点击 Mock Server 。
(3)Postman 支持"Create a new API"或者"Use collection from this workspace"两种方式来创建 Mock Server。
简单起见,我们选择“Create a new API”。在下图中我们选择请求方法,可以是 GET、POST、UPDATE,也可以是 DELETE,也就是我们常说的增删查改。然后输入请求路径,需要返回的 HTTP 响应码,以及响应的 Body,可以模拟多个 API 接口。全部设置好后点击下一步。
(4)然后,你将看到下图 4 个需要配置的地方。
输入 Mock Server 的名称。
选择一个环境(可选),通常我们的测试环境有好几个,你可以配置使用不同的测试环境。
是否要将 Mock Server 设为私有。
是否将 Mock Server 的 URL 保存为环境变量。
等你都配置好后,单击下一步继续。
(5)当你看到如下界面,说明配置成功。此时你的简易版 Mock Server 就生成了。记录下生成的 URL,然后在你的测试中调用相应的 URL 地址即可。
在上述例子中,我在第(3)步设置了 echo 这个接口,它是个 GET 请求,你就可以直接在浏览器输入 http://mock-server-url/echo 这样的方式来访问,需要替换这里 mock-server-url 为图中的地址。
如果是 POST 请求,你也可以自定义参数,Request Body 等等。
2.自主编码实现 Mock Server(Flask)
使用第三方工具创建 Mock Server 比较简单,但是由于严重依赖于第三方工具,在实际工作中,一般用作开发完成后的第一轮手工测试。而业务上线后,在测试框架中使用时,我们还是倾向于根据业务规则自主编码实现 Mock Server。
当前,Github 上有很多成熟的 Mock Server 可供我们使用,根据编程语言的不同,最常见的有如下几个:
Java - Mock Server(https://github.com/mock-server)
Python - responses(https://github.com/getsentry/responses)
JavaScript - easy Mock(https://github.com/easy-mock/easy-mock)
这些 Mock Server 的搭建非常简单,按照步骤操作即可。
下面讲下 Mock Server 的另外一个普遍搭建过程,即使用 Flask 框架来充当 Mock Server。
Flask 是一个微 Web 框架,使用 Python 语言编写。使用它可以快速完成功能丰富的中小型网站或 Web 服务的实现。
(1) 首先你要保证系统已经安装好 Flask,并确保你的机器有 Python 运行环境。
pip install flask
(2) 创建一个 Python 文件,例如:test_mock_with_flask.py,代码如下:
from flask import Flask, request, json, abort
app = Flask(__name__)
@app.route('/', methods=['GET'])
def hello():
return 'hello world'
@app.route('/mock', methods=['POST','GET'])
def mock():
"""
模拟调用第三方服务,查询账户余额。
:return:
"""
if request.method == 'GET':
abort(404)
else:
try:
name = request.form['name']
print(name)
if name == 'Candy':
data = {"status": 200, "message": "success", "text": {"available_balance": 200000}}
else:
data = {"status": 400, "message": "fail", "text": {}}
except:
data = {"status": 500, "message": "system error", "text": {}}
return json.dumps(data)
if __name__ == "__main__":
app.run()
这段代码实现了这一功能:访问 http://127.0.0.1:5000,直接返回“hello world”,如下图所示:
直接使用 GET 方式访问http://127.0.0.1:5000/mock,会出现 404 错误,如下图所示。
如果使用 POST 方式,假设提交的数据中包括“name=Candy”这个键值对,则返回如下结果:
{"status": 200, "message": "success", "text": {"available_balance": 200000}}
如果你提交的数据中不包括“name=Candy”, 则返回如下结果:
{"status": 400, "message": "fail", "text": {}}
如果代码在运行过程中发生了错误,则返回如下结果:
{"status": 500, "message": "system error", "text": {}}
这其实就是一个最简单的Mock Server。
(3) 启动这个 Flask 服务。
打开命令行工具,在你的 Terimal 里运行以下命令行,以启动这个 Mock Server。
python test_mock_with_flask.py
(4) 测试 Mock Server。
首先安装 curl。
curl 是一个利用 URL 语法在命令行方式下工作的文件传输工具。由于它支持 HTTP 协议及其请求方法,故也可以用来发送 HTTP 请求。
# curl的安装和配置,根据操作系统的不同,步骤也不同。
# 如果你使用pip, 可以直接以如下方式安装。
pip install curl
# 如果你发现在你的操作系统下,上述安装方式不起作用,你可以直接在搜索引擎中搜索相关的安装方式。
curl 常用的语法如下:
# 直接发送GET请求
$ curl https://www.helloworld.com
# 添加HTTP请求头访问
$ curl -H "Content-type: application/json" https://www.helloworld.com
# 指定HTTP请求
# -X 表示请求方法
# -d 表示发送 POST 请求的数据体
$ curl -X POST -d 'wlTesting=Good' https://www.helloworld.com
最后,我们通过 curl 发送 HTTP 请求,来验证下搭建的 Mock Server 是否功能正确:
# 通过curl直接调用,返回500
curl -H "Content-type: application/json" -X POST -d '{"name":"Candy"}' http://127.0.0.1:5000/mock
# 返回400
curl -d'name=Candy01' -X POST http://127.0.0.1:5000/mock
# 返回200
curl -d'name=Candy' -X POST http://127.0.0.1:5000/mock
可以看到,根据请求输入的参数及请求方式的不同,Mock Server 返回了期望的结果。
到这里,两种方式的 Mock Server 已经搭建完毕。之后在你的测试代码里,涉及调用第三方应用的情况,你就可以直接转而调用 Mock Server 来继续你的测试了。
当然,你的 Mock Server 实现要考虑第三方应用的业务逻辑和输出结果的格式、参数以及数据等方面。
总结
今天分享的内容是从 Mock 的定义出发,讲解了 Mock Server 的含义、常用场景,以及 Mock Server 在我们开发测试中的重要性,接着又采用两种方式实现了Mock Server,分别是:
使用 API 接口工具 Postman。它的优点是无须编程,缺点是生成是 Server URL 地址无法更改。
使用 Python 的 Flask 框架编程。它的优点是可以把 Mock Server 集成至自己的测试框架中,缺点是需要一定的编程能力。
Mock Server 能够大大提升我们的测试效率,希望通过这些内容,让你能掌握 Mock Server 并运用于测试工作实践中。
end
你的鼓励将会是我创作的最大动力。
点个赞,点个在看再走啦~~~
本文分享自微信公众号 - 无量测试之道(gh_858a1aa25a6d)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
链表算法题二,还原题目,用debug调试搞懂每一道题
文章简述 大家好,本篇是个人的第4篇文章。 承接第3篇文章《开启算法之路,还原题目,用debug调试搞懂每一道题》,本篇文章继续分享关于链表的算法题目。 本篇文章共有5道题目 一,反转链表(经典题目) 1.1.1 题目分析 反转链表是经典的题目,题中信息描述很清晰,给定一个单链表,将其反转。 先说说有什么思路呢?从题中给的案例输出结果看,是不是只需要将输入的链表的指针改成相反方向,就可以得到要输出的结果。 就好比如下图所示: 但是问题来了,我们是单链表,是没办法将下个节点直接指向该节点的上个节点。 因此就需要定义一个辅助指针,用来指向该节点的上个节点,这样就能完成,如下图所示。 那按照我们上面分析也就是将cur指针指向pre节点就可以了。 注意:此处有坑 当我们将当前节点【cur】指向上一个节点【pre】的时候,如何将指针向下移动呢? 此时的节点【cur】已经指向了上一个节点【pre】了,所以我们还需要一个临时变量去保存当前节点的下个节点,具体为什么这么做,我们在下面代码演示的时候debug看下过程。 接着我们上面的步骤,将指针向下移动,如图所示。 移动指针后,再将当前节点的next指...
- 下一篇
K8S线上集群排查,实测排查Node节点NotReady异常状态
一,文章简述 大家好,本篇是个人的第 2 篇文章。是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查。 文章中所描述的是本人在项目中线上环境实际解决的,那除了如何解决该问题,更重要的是如何去排查这个问题的起因。 关于 Node 节点不可用的 NotReady 状态,当时也是花了挺久的时间去排查的。 二,Pod 状态 在分析 NotReady 状态之前,我们首先需要了解在 k8s 中 Pod 的状态都有哪些。并且每个状态都表示什么含义,不同状态是很直观的显示出当前 Pod 所处的创建信息。 为了避免大家对 Node 和 Pod 的概念混淆,先简单描述下两者之间的关系(引用一张 K8S 官方图)。 从图中很直观的显示出最外面就是 Node 节点,而一个 Node 节点中是可以运行多个 Pod 容器,再深入一层就是每个 Pod 容器可以运行多个实例 App 容器。 因此关于本篇文章所阐述的 Node 节点不可用,就会直接导致 Node 节点中所有的容器不可用。 毫无疑问,Node 节点是否健康,直接影响该...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案