单元测试之Mock
- 为什么需要Mock.
- 真实对象具有不确定的行为.所以会产生不可预测的结果.
- 真实对象很难被创建.
- 真实对象的某些行为很难被触发(如网络错误).
- 真实对象令程序的运行速度很慢.
- 真实对象有(或者是)用户界面.
- 测试需要询问真实对象它是如何被调用的.
- 真实对象实际上并不存在.例如其它小组开发的模块.
- 使用Mock的3个步骤
- 使用一个接口来描述该对象.
- 为产品代码实现该接口.
- 以测试为目的,在Mock对象中实现该接口.
- Test Double
- Dummy.被传递但是从不被实际使用的对象.通常用于填充参数列表.
- Fake.含有实际实现的对象.但通常使用一些不适用于实际项目的捷径(内存数据库).
- Stubs.对调用提供一些预设的响应.通常不会调用代码中实际调用会执行的代码.可以用来记录关于调用的信息.(Email中可以记录发送过的邮件).
- Mocks.预先编写的对象.接受特殊的调用,返回特定的预期行为.
- Mock的四个步骤:setup,exercise,verify,teardown.
- 只有Mock是进行行为测试验证.
- 主要对象和次要对象
- 单元测试中,我们通常关注的是主要测试对象的功能和行为.
- 对于主要测试对象涉及到的次要对象尤其是一些依赖,我们仅仅关注主要测试对象和次要测试对象的交互.
- 比如是否调用,何时调用,调用的参数,调用的次序,以及返回的结果或者异常等.
- 但是次要对象是如何执行这次调用的,并不关心.
- 因此,使用mock对象或者stub对象来替代真实的次要对象,从而模拟真实场景来进行对主要测试对象的测试.
- 测试工具
- 在.Net下大部分工具都是使用动态类型来进行Mock,因此,只能Mock接口或者overriable成员.
- 而TypeMock直接使用inject方式,即使是sealed或者不可覆盖方法也能进行Mock.
- 通常,如果发现必须要覆盖不可覆盖的方法才能够进行测试,那么很可能是设计问题.
- Mock行为依赖风险
- 被模型对象的行为必须与真实对象的行为完全一致.
- 开发者对API不够了解;被模拟对象的行为发生了改变(重构,添加新功能导致的).都可能引起错误假设(与真实对象行为不一致).错误假设会引入缺陷,并留下非法测试.
- 非法测试:看起来像测试,运行起来也是测试.但是几乎没有价值,几乎不会失败.
- Mock的优点
- Mock对象的行为简单,唯一.一旦设置好setup后总是返回同一值.
- Mock对象的行为可以预期,如果调用到了不希望调用的方法会让测试失败.若方法被调用了,还可以验证参数.
- 可以Mock一些在真实环境中难以模拟或者出现的错误或者异常.
- Mock是一种白盒测试方式.Mock对象的setup过程就是目标代码实现细节的设计过程.
- 接口为使用者而设计.所以当接口还未被实现时,Mock可以验证使用者是如何使用接口的.
- Mock的缺陷
- Mock对象的行为依赖风险.在对真实对象进行重构的时候,容易带来该问题.
- Mock对象的setup过程可能过于繁重.
- 另一个角度,过于复杂的Mock对象的setup过程,说明真实对象承担了过多的职责.
- 分出更多职责清晰的小类,可以避免这种情况.
- Mock对象的setup过程含有过多的语义.
- Mock对象的行为定义.调用方法的返回值;调用方法时的Throw Exception;给调用方法时传递的参数发送消息.
- Test Case期望assert的内容.方法是否被调用以及被调用的次数.调用方法时的参数是否合法.
单元测试之Mock的更多相关文章
- python笔记24-unittest单元测试之mock.patch
前言 上一篇python笔记23-unittest单元测试之mock对mock已经有初步的认识, 本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创 ...
- python文档2-unittest单元测试之mock.patch
介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 patch简介 1.unittest.mock.patch(target,ne ...
- CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager
单元测试的核心就是:只测试眼前的逻辑.这就要求所有的依赖项都要使用仿类来代替,也就是所谓的 Mock Object.在测试 ProfileRepository 和 AccountController ...
- python笔记23-unittest单元测试之mock
什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...
- python文档1-unittest单元测试之mock
什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定的 ...
- java单元测试之Mock静态方法
1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...
- 玩转单元测试之Testing Spring MVC Controllers
玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...
- 玩转单元测试之WireMock -- Web服务模拟器
玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 We ...
- [转载]单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...
随机推荐
- react工具库
采用了react框架后,需要找到一些常用的库,常见的需求比如: 1)react生成二维码 2)react的轮播banner图 随着react的社区的壮大,以上的需求都有专门的库帮我们做这个: 1)re ...
- marquee标签弹幕效果
播放个视频的时候看到很有趣的弹幕,想着前端能不能做个弹幕效果.弹幕是滚动的,所以首先想到了<marquee>标签.但事实上,<marquee>标签不是w3c的标准,只是主流的浏 ...
- Hadoop-2.2.0集群部署时live nodes数目不对的问题
关于防火墙,hadoop本身配置都确定没任何问题,集群启动不报错,但打开50070页面,始终live nodes数目不对,于是我尝试/etc/hosts文件配置是否存在逻辑的错误: 127.0.0.1 ...
- BZOJ 4712: 洪水 挖坑待补
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- UVA1339 - Ancient Cipher 【字符串+排序】【紫书例题4.1】
题意:给定两个字符串,你可以替换或者置换,替换是指可以将相同的字母替换为任意一个字母,而置换是指将字母替换为下一个,如A替换B,B替换为C,,,Z替换为A.你需要判断是否可以通过一系列操作使两个字符串 ...
- Centos 修改主机名称
Centos 配置主机名称: 1.首先查询一下当前的主机名称 [root@localhost~]# hostnamectl status Static hostname: ****** //永久主机名 ...
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- Zookeeper-单机/集群安装
简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少量信息.Hadoo ...
- FZU - 2062 - Suneast & Yayamao
先上题目: Problem 2062 Suneast & Yayamao Accept: 146 Submit: 319Time Limit: 1000 mSec Memory L ...
- 4443: [Scoi2015]小秃玩矩阵|二分答案|匈牙利
第K大看成第K小各种WA. .. 第K大也就是第n−K+1小.所以就能够愉快的二分答案了 二分答案找出比当前答案小的数的位置的坐标.推断一下能否够选出满足不在同一行同一列的n−K+1个数,然后就能够愉 ...