什么是 Mock 测试?

什么是 Mock?
作为动词,Mock 是模拟、模仿的意思。
作为名词,Mock 是能够模仿真实对象行为的模拟对象。
那么,在软件测试中,Mock 所模拟的对象是什么呢?
模拟的是 SUT(System Under Test:被测系统) 的依赖,而不是其本身。
比如,我要测试 A,但 A 依赖 B,要模拟的对象就是 B。
为什么要模拟 B 呢?
提高 A 的测试覆盖率:通过 Mock 模拟 B 返回的正常和异常的结果,使用 A 的测试更充分。
避免 B 的因素对 A 产生影响:当 B 因各种原因无法正常使用时,导致 A 无法测试。
提高 A 的测试效率:B 的真实行为可能很慢,但模拟可以很快。
Mock 的两大功能:
记录真实的调用信息
生成模拟的返回信息
使用 Mock 的问题是什么?
可能导致问题遗漏:毕竟是模拟的,是理想可预见的情况,真实的情况可能更复杂。
可能导致维护成本变高:接口变更 Mock 用例要跟着改,改错和漏改都可能出问题。
常见的 Mock 类型:
方法级别:Mock的对象是一个函数调用,例如:获取系统环境变量。
类级别:Mock 的对象是一个类,例如:一个 HTTP server。
接口级别:Mock 的对象是一个 API 接口。
服务级别:Mock 的对象是整个服务。
使用 Mock 做接口测试时,一般分二步:
1.打桩:创建 Mock 桩,指定 API 请求内容及其映射的响应内容。
2. 调桩:被测服务来请求 Mock 桩并接收 Mock 响应。
在这二步之间还有一个 Mock 桩的注入,啥是 Mock 注入?
Mock 的本质就是用模拟桩来替换真实的依赖。所谓Mock 桩注入就是阻断被测服务与真实服务之间的链路,建立被测服务与 Mock 之间的链路过程。
如下图所示:

如何注入 Mock?
常见的方式包括但不限于以下五种:
API 请求构造
客户端 Mock:在被测服务内部工作,直接拦截被测服务的 API 请求方法,直接从方法内部返回预定义的 Mock 响应。
服务端 Mock:在被测服务外部工作,作为 HTTP 服务器接收被测服务发送的 API 请求,并返回预定义的 Mock 响应。
本地配置:
对于服务端 Mock,打桩之后会生成唯一的 Mock 桩地址,被测服务提供一个依赖服务地址配置项,在需要使用 Mock 时将依赖服务地址修改成 Mock 地址。
配置中心
对于服务端 Mock,为了避免修改依赖服务地址配置项导致被测服务重启,可以采用配置中心存储和管理依赖服务地址配置,或者使用注册中心记录服务与服务地址的映射关系。
反向代理
在微服务架构下,被测服务与依赖服务之间可能不是直连的,而是经过了一层反向代理,例如 API 网关。在这种情况下,被测服务是通过调用 API 网关来间接调用依赖服务的接口。
前向代理
服务端 Mock 除了作为 HTTP 服务器,还可以兼备 HTTP 代理的功能,这种架构又叫做 Mock 代理。
对比:

常用 Mock 工具:
单元测试级别:
easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit..
接口测试级别
Wiremock、Mockserver、Moco、Mock.js、RAP...

什么是 Mock 测试?的更多相关文章
- Python单元测试和Mock测试
单元测试 测试可以保证你的代码在一系列给定条件下正常工作 测试允许人们确保对代码的改动不会破坏现有的功能 测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误 良好的测试要求模块化,解耦代 ...
- mock测试到底是什么?
经常听人说mock测试,究竟什么是mock测试呢?mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍,之后会有详细的mock测试,感谢大家对测试梦工厂的持续关注. 概 ...
- mock测试框架Mockito
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- Spring MVC如何测试Controller(使用springmvc mock测试)
在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...
- mock测试
看到群里有人说mock测试,究竟什么是mock测试呢?开始自己也没明白,查了下相关资料.还是很有必要了解哈:那么mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍.mock测试就 ...
- Postman入门之Mock测试
1.什么是Mock测试: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.添加要Mock测试的接口为example: 2.1点击r ...
- java的mock测试框架
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- mock测试SpringMVC controller报错
使用mock测试Controller时报错如下 java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig at org.spr ...
- 【转】MOCK测试
mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象[mock对象]来创建以便测试的测试方法. mock对象:这个虚拟的对象就是mock对象. mock对象就是真 ...
- RPC接口mock测试
转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1 简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...
随机推荐
- Hi3559AV100 NNIE开发(5)mobilefacenet.wk仿真成功量化及与CNN_convert_bin_and_print_featuremap.py输出中间层数据对比过程
前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...
- 死磕生菜 -- lettuce 间歇性发生 RedisCommandTimeoutException 的深层原理及解决方案
0x00 起源 项目的一些微服务集成了 Spring Data Redis,而底层的 Redis 客户端是 lettuce,这也是默认的客户端.微服务在某些环境中运行很正常,但在另一些环境中运行就会间 ...
- 2019 GDUT Rating Contest I : Problem G. Back and Forth
题面: G. Back and Forth Input file: standard input Output file: standard output Time limit: 1 second Mem ...
- Git命令太多记不住?有了这个神器,从此告别输入命令行
一 .SourceTree简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subve ...
- OpenCV 之 图象几何变换
二维平面中,图像的几何变换有等距.相似.仿射.投影等,如下所示: 1 图象几何变换 1.1 等距变换 等距变换 (Isometric Transformation),是一种二维的刚体变换,可理解为 ...
- 你说,怎么把Bean塞到Spring容器?
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 小傅哥,你是怎么学习的? 有很多初学编程或者码了几年CRUD砖的小伙伴问我,该怎么学 ...
- K8S单集群桌面安装笔记【k8s-for-docker-desktop】
一.K8S集群基本的拓扑结构 二.下载 k8s-for-docker-desktop k8s桌面单集群安装,基本上选择 k8s-for-docker-desktop或者minikube两类,本文采用前 ...
- Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序
一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...
- 最小生成树,Prim和Kruskal的原理与实现
文章首先于微信公众号:小K算法,关注第一时间获取更新信息 1 新农村建设 大清都亡了,我们村还没有通网.为了响应国家的新农村建设的号召,村里也开始了网络工程的建设. 穷乡僻壤,人烟稀少,如何布局网线, ...
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控
Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...