什么是模拟考试?

作为动词,Mock的意思是模仿或模仿。

作为名词,Mock是一个可以模仿真实物体行为的模拟物体。

那么,在软件测试中,Mock模拟的对象是什么呢?

它模拟SUT(被测系统)的依赖性,而不是它本身。

比如我想测试A,但是A依赖于B,要模拟的对象是B。

为什么要模拟B?

提高A的测试覆盖率:Mock模拟B返回的正常和异常结果,用A测试更充分。

避免B因素对A的影响:当B因为各种原因无法正常使用时,A无法测试。

提高A的测试效率:B的真实行为可能比较慢,但是模拟可以很快。

模拟的两个功能:

记录真实的呼叫信息

生成模拟退货信息

使用Mock有什么问题?

可能会导致问题的遗漏:毕竟是模拟的、理想的可预见情况,真实情况可能更复杂。

可能会导致更高的维护成本:接口变了,模拟用例也会随之改变,纠错和漏改都可能出现问题。

常见模拟类型:

方法级:Mock的对象是函数调用,比如获取系统环境变量。

类级别:Mock的对象是一个类,例如,一个HTTP服务器。

接口层:Mock的对象是一个API接口。

服务层面:Mock的对象是整个服务。

当使用Mock进行接口测试时,通常有两个步骤:

1.打桩:创建一个模拟桩,并指定API请求内容及其映射的响应内容。

2.桩调整:被测试的服务请求模拟桩并接收模拟响应。

在这两个步骤之间还有一个模拟桩注射。什么是模拟注射?

Mock的本质是用模拟堆代替真实的依赖。所谓模拟桩注入,就是阻断被测服务和真实服务之间的链接,建立被测服务和模拟之间的链接的过程。

如下图所示:

常见的方式包括但不限于以下五种:

API请求构造

客户端模拟:在被测服务内部工作,直接拦截被测服务的API请求方法,直接从方法内部返回预定义的模拟响应。

服务器模拟:在被测试的服务之外工作,它充当HTTP服务器,接收被测试的服务发送的API请求,并返回预定义的模拟响应。

本地配置:

对于服务器端的Mock,打桩后会生成一个唯一的Mock桩地址,被测服务会提供一个依赖的服务地址配置项,使用Mock时会变成一个Mock地址。

配置中心

对于服务器端Mock,为了避免修改依赖服务地址的配置项导致被测服务重启,可以使用配置中心来存储和管理依赖服务地址的配置,或者使用注册中心来记录服务和服务地址之间的映射关系。

反向代理

在微服务架构下,被测服务和依赖服务可能不直接连接,而是通过一层反向代理,比如API网关。在这种情况下,被测服务通过调用API网关间接调用依赖服务的接口。

正向代理

除了作为一个HTTP服务器之外,服务器端的Mock还可以具有HTTP代理的功能,也称为Mock代理。

对比度:

常见模拟工具:

单元测试级别:

easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit..

接口测试级别

Wiremock、Mockserver、Moco、Mock.js、RAP...