Mock工具介绍,为什么使用Mock()

冲天香阵透长安,满城尽带黄金甲。这篇文章主要讲述Mock工具介绍,为什么使用Mock?相关的知识,希望能为你提供帮助。
什么是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简便性
文档管理 × ×
开源程度
部署难度
可视化界面 ×
【Mock工具介绍,为什么使用Mock()】?

    推荐阅读