什么是Mock
如果将mock单独翻译过来,其意义为 “虚假、虚设”,因此在软件开发领域,我们也可以将其理解成 “虚假数据”,或者 “真实数据的替身”。
为什么使用Mock
1.解除依赖,团队并行工作
接口尚未开发完成,在系统交互双方定义好接口之后,我们可以提前进行开发和测试,并不依赖上游系统的开发实现。
2.开启TDD模式,即测试驱动开发
单元测试是TDD的基石,当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境中,提前创建测试。
3.隔离系统
通过编写Mock,隔离请求操作(Get、Post)对于数据库中数据的污染。
4.提升测试覆盖度
通过Mock接口返回的不同状态,来查看系统是否能够正常影响,提升测试的覆盖度。
5.方便演示
通过使用Mock模拟数据接口,我们即可在只开发了UI的情况下,无须服务端的开发就可以进行产品的演示。
除此之外,Mock可以加深我们对测试的理解,深入明白测试“输入”和“输出”的不同表达形式,同时还能提高自身技术,脱离功能测试对于开发的依赖。
市面上常见的Mock工具
市面上常见的Mock分为单元测试级别的Mock工具和接口测试级别的Mock工具
单元测试级别的mock工具
单元测试级别的Mock工具有Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。
EasyMock
EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
JMock
JMock是一个使用模拟对象机制测试Java代码的开发包。模拟对象(Mock Object)可以取代真实对象的位置,用于测试一些与真实对象进行交互或依赖于真实对象的功能,模拟对象的背后目的就是创建一个轻量级的、可控制的对象来代替测试中需要的真实对象,模拟真实对象的行为和功能,方便我们的测试。JMock就是这种机制的实现,使用JMock我们可以快速创建模拟对象,定义交互过程中的约束条件等,同时JMock也是易扩展的,你可以很方便添加自定义的需求。
Mockito
Mockito 无需准备昂贵的前期启动。他们的目标是透明的,让开发人员专注于测试选定的行为。
Mockito 拥有的非常少的 API,所有开始使用 Mockito,几乎没有时间成本。因为只有一种创造 mock 的方式。只要记住,在执行前 stub,而后在交互中验证。你很快就会发现这样 TDD java 代码是多么自然。
单元测试Mock工具对比
Features:
Feature | EasyMock | jMock | Mockito | UnitilsMock | PowerMock(EasyMock) | PowerMock(Mockito) | JMockit |
---|---|---|---|---|---|---|---|
Invocation count constraints(调用数限制) | √ | √ | √ | √ | √ | √ | |
Recording strict expectations(记录严格的预期结果) | √ | √ | √ | √ | |||
Explicit verification(显式验证) | √ | √ | √ | √ | |||
Partial mocking(部分mock) | √ | √ | √ | √ | √ | √ | |
Easier argument matching based on properties of value objects(基于值对象属性的简化参数匹配) | √ | √ | √ | √ | √ | √ | |
Cascading mocks(级联mock) | √ | √ | √ | √ | |||
Mocking of multiple interfaces(多接口mock) | √ | √ | √ | ||||
Mocking of annotation types(注释类型mock) | √ | √ | √ | √ | √ | ||
Partially ordered expectations | √ | √ | |||||
Auto-injection of mocks(mock的自动注入) | √ | √ | √ | √ | |||
Mocking of enums(枚举的mock) | √ | √ | √ | ||||
Declarative mocks for test methods (mock parameters) | √ | ||||||
Mocking of unspecified implementation classes(未实现接口类的mock) | √ | ||||||
“Duck typing” fakes for integration tests | √ | ||||||
Total | 4/14 | 4/14 | 8/14 | 6/14 | 5/14 | 9/14 | 14/14 |
Qualities:
Feature | EasyMock | jMock | Mockito | UnitilsMock | PowerMock(EasyMock) | PowerMock(Mockito) | JMockit |
---|---|---|---|---|---|---|---|
Argument matchers for some parameters only, not all | √ | √ | |||||
No method call to switch from record to replay(切换记录回放时无方法调用) | √ | √ | √ | √ | |||
No extra code for implicit verification(隐式验证没有额外代码) | N/A | N/A | N/A | √ | |||
No extra “prepare for test” code(没有额外的”prepare for test”代码) | √ | √ | √ | √ | √ | ||
No need to use @RunWith annotation or base test class(不需要用@runwith注解和测试基类) | √ | √ | √ | √ | |||
Consistent syntax between void and non-void methods(空和非空方法的语法一致) | √ | √ | √ | ||||
Mocking of constructors and final/static/private methods(构造函数、final、static和private方法的mock) | √ | √ | √ | ||||
Mocking of “new-ed” objects(“new-ed”对象的mock) | √ | √ | √ | ||||
Support for covariant return types | √ | ||||||
Single jar file in the classpath is sufficient to use mocking API(在classpath中的单个jar文件就能够使用mockAPI | √ | N/A | N/A | √ | |||
Total | 2/10 | 3/10 | 4/9 | 4/9 | 2/9 | 3/8 | 10/10 |
接口测试级别的mock工具
接口测试级别的Mock工具有RAP、Yapi、Moco等。
RAP
RAP是阿里团队出的一款接口管理工具,帮助开发人员有效的管理接口文档。包括阿里集团在内的三百五十多个企业都在使用RAP管理重要的接口文档。
Web接口管理工具,接口自动化,MOCK数据自动生成,自动化测试
能够通过分析接口结构自动生成Mock数据、校验真实接口的正确性
阿里产品,功能完善、结合了文档、Mock.js、可视化、Rest、接口过渡、文档修改提醒、支持本地部署
Yapi
YApi是去哪儿网移动架构组开发的一个开源项目,YApi的 Mock 功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、返回数据、生成 Mock 接口,这些接口会自动生成模拟数据,创建者可以自由构造需要的数据。mock模拟数据基于mock.js。
Mock.js 是一款模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
根据数据模板生成模拟数据
模拟 Ajax 请求,生成并返回模拟数据
基于 HTML 模板生成模拟数据
Moco
Moco 是一个简单搭建 stub 的框架,主要用于测试和集成。
Moco本身支持API和独立运行两种方式。通过使用API,开发人员可以在JUnit、JBehave等测试测试框架里使用Moco,极大程度地降低了集成点测试的复杂度
Moco可以提供以下服务:
HTTP APIs
Socket APIs
REST API
接口测试Mock工具对比
Yapi | Rap | Moco | |
---|---|---|---|
方便集成 | √ | √ | × |
Mock简便性 | √ | √ | √ |
文档管理 | √ | × | × |
开源程度 | √ | √ | √ |
部署难度 | 低 | 高 | 低 |
可视化界面 | √ | √ | × |
本文转自:搜狗测试
end