mock浅析
来源:互联网 发布:免费tk域名注册的网站 编辑:程序博客网 时间:2024/06/06 09:30
因为今天在牛壳网上刷一道题,看到了mock,不知道是什么,所以写一篇博文。
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
mock对象使用范畴
真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报)真实对象很难被创建的 真实对象的某些行为很难被触发真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道)等等。
使用mock对象测试的关键步骤
使用一个接口来描述这个对象。在产品代码中实现这个接口,在测试代码中实现这个接口,在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象,还是mock对象。
MockObject
使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。
目前,在Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock等。
维基百科:Mock通常是指,在测试一个对象A时,我们构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试A在正常逻辑,异常逻辑或压力情况下工作是否正常。
引入Mock最大的优势在于:Mock的行为固定,它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果。
Mock Object的使用通常会带来以下一些好处:
一. 隔绝其他模块出错引起本模块的测试错误。
二.隔绝其他模块的开发状态,只要定义好接口,不用管他们开发有没有完成。
三.一些速度较慢的操作,可以用Mock Object代替,快速返回。
对于分布式系统的测试,使用Mock Object会有另外两项很重要的收益:
通过Mock Object可以将一些分布式测试转化为本地的测试
其次,将Mock用于压力测试,可以解决测试集群无法模拟线上集群大规模下的压力
Mock的应用场景
在使用Mock的过程中,发现Mock是有一些通用性的,对于一些应用场景,是非常适合使用Mock的:
真实对象具有不可确定的行为
真实对象很难被创建(比如具体的web容器)
真实对象的某些行为很难触发(比如网络错误)
真实情况令程序的运行速度很慢
真实对象有用户界面
测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
当然,也有一些不得不Mock的场景:
一些比较难构造的Object:这类Object通常有很多依赖,在单元测试中构造出这样类通常花费的成本太大。
执行操作的时间较长Object:有一些Object的操作费时,而被测对象依赖于这一个操作的执行结果,例如大文件写操作,数据的更新等等,出于测试的需求,通常将这类操作进行Mock。
异常逻辑:一些异常的逻辑往往在正常测试中是很难触发的,通过Mock可以人为的控制触发异常逻辑。
在一些压力测试的场景下,也不得不使用Mock,例如在分布式系统测试中,通常需要测试一些单点(如namenode,jobtracker)在压力场景下的工作是否正常。而通常测试集群在正常逻辑下无法提供足够的压力(主要原因是受限于机器数量),这时候就需要应用Mock去满足。
在这些场景下,我们应该如何去做Mock的工作了,一些现有的Mock工具可以帮助我们进行Mock工作。
由于本人对测试不太理解,也对JAVA不甚理解,故而,推荐一篇博文点击打开链接
还有一篇也可以查考一下点击打开链接
- mock浅析
- Mock
- mock
- mock
- mock
- Mock Objects
- Mock Objects
- Mock(1)
- Mock(2)
- mock 测试
- mock测试
- MOCK测试
- mock测试
- Mock RequestContextListener
- mock 测试
- mock 例子
- Mock &Dbunit
- Google Mock
- C语言基础 将摄氏温度转换为华氏温度
- http协议_思维导图总结1
- 分页工具类分装
- Node.js Buffer学以致用
- htML+CSS3-》第4阶段:HTML5之CSS3进阶
- mock浅析
- 移动端布局方案 讲解与实例
- 19PL_SQL过程之创建存储过程
- HexToFloat和HexToDouble
- 跨域解决方案
- sql注入
- 过滤器和拦截器
- 【SQL*Loader】设置参数之ROWS、BINDSIZE和READSIZE
- Android基础学习之SharedPreferences的使用