什么是模拟考试?
作为名词,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...