Mock工具介绍

https://cloud.tencent.com/developer/article/1684199?from=article.detail.1465591

什么是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简便性

√

√

√

文档管理

√

×

×

开源程度

√

√

√

部署难度

低

高

低

可视化界面

√

√

×

‍

 
posted @ 2022-09-21 17:42  小学生II  阅读(773)  评论(0)    收藏  举报