加油,打工人,今天又是美好的一天

十四郎君

一日不思量,也攒眉千度

Mock 测试概念

1.Mock的定义(what)
mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为(假事件,但有真作用或产出)
 
2.为什么要使用mock(why)
在做单元测试过程中,经常会有以下的场景:
即:
(1)被测对象依赖的对象构造复杂
如:我们相对class A进行单元测试,需要构造大量的classB、C、D等依赖对象,他们的构造过程复杂(体现在构造步骤多、耗时较长),这时我们可以利用mock去构造虚拟的classB、C、D对象用于classA的测试,因为我们只是想测试classA的行为是否符合预期,我们并不需要测试依赖对象。
(2)被测单元的模块尚未开发完成,而被测对象需要依赖模块的返回值进行测试
如:service层的代码中,包含对dao层的调用,但dao层代码尚未开发
或者web前端依赖后端接口返回数据进行连调测试,但后端接口并未开发完成
 
3.哪些时机和场合需要使用mock(when&where)
(1)单元测试/接口测试中测试对象依赖其他对象,这些对象的构造复杂、耗时或者根本无法构造(未交付)
(2)我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性
 
4.是否应该在测试中使用mock,投入产出比如何(how much)
我们可以基于以下2个原则去做mock,这样mock的投入产出比是最高的
(1)不需要对所有的依赖对象/服务进行mock,只对那些构造步骤复杂、构造耗时较长、不稳定的依赖对象/服务进行mock
(2)如果做分层测试(比如分层自动化),高层的测试设计可以基于以下假设:
底层的测试已保证底层对象的质量,高层对低层的依赖可以mock,无需关心所依赖的低层对象的质量。
 
5.Local Mock和Remote Mock
local mock和 remote Mock的区别在于依赖对象的行为调用时本地/远程调用
(1)Mock本地依赖对象
如果依赖对象的调用是本地调用,就属于Local Mock。EasyMock/Mockito都可以实现对本地依赖对象的Mock
(2)Remote Mock
如果被测对象依赖对象的是一些远程服务(HTTP/RPC服务),就属于Remote Mock,Remote Mock一般实现对指定的服务/接口、客户端(消费者)进行Mock。可以通过Mock Server等方式去实现。
                                                                                                 被测对象和依赖对象/服务的关系
 
                                                                                                 Loca & Remote Mock
  • LocalMock相当于使用Mock对象替换依赖对象。
  • RemoteMock相当于使用MockServer替换真实的HTTP/RPC Server。
6.Mock工具
(1)第三方工具,如EasyMock,postman这些
(2)mock框架(局限于java)如PowerMock
(3)工具包,如mockito,moco server

posted @ 2020-12-21 21:50  十郎  阅读(333)  评论(0编辑  收藏  举报