Mock 七宗罪

作者/分享人:肖鹏
向 Ta 提问
ADP技术与解决方案架构师,前ThoughtWorks持续交付中国区Lead。目前专注于响应式编程,以及企业系统集成与容器化。

我合作过的很多团队,特别是敏捷团队,都对Mock情有独钟。有些团队甚至达到了无Mock不UT的地步。2013开始我在团队中开始推行去Mock化,并取得了不错的效果。要在团队中去Mock必须要回答两个问题:第一Mock本身有什么缺陷;第二不用Mock怎么写(单元)测试。下面是我列的一个大纲,成稿的时候可能会有一些调整。

第一部分:Mock测试的缺陷

  1. 漏测核心逻辑
  2. 测试不存在的逻辑
  3. 漏测横切特性
  4. 掩盖坏味道
  5. 掩盖性能缺陷
  6. 阻碍重构
  7. 测试实现细节而非功能。

第二部分:不用Mock怎么写(单元)测试

  1. 消除『单元』情结
  2. 对象创建与依赖注入
  3. 文件、网络和数据库
  4. MVC和容器
  5. Reactive Programming

实录提要:

  • 没有 Mock 的话怎么保障测试用例专注于单个方法的功能验证?
  • 消除单元情结,消除之后单元测试和集成测试的分界线是什么呢?
  • 数据库相关的层如何测试?
  • 如何应用内存数据库达到测试实际数据库的目的?
  • 如果确实出现 private 方法,是怎么测试的,通过调用方法覆盖吗?
  • Mock 和自动化测试之间有什么关系?
已有257人预订
预订达标
文章出炉
交流日期
     
17.04.11
17.04.24
17.05.02 20:00
查看文章评论/提问
肖鹏
很荣幸的被盗版了,希望不是恶意。目前Trello上的版本有一些问题,特别是代码部分,请删除。也请至少在活动完成之前不要通过其他渠道分发。如果你不想花钱,等活动结束了,我可以发给你🙏🏻🙏🏻🙏🏻谢谢
it劫匪
(作者的意见是)不严格单元测试和集成测试,以此为前提的话,被mock的对象本身就在测试目标范围内,所以这时候上面mock的缺点是成立的。 如果把两类测试严格分开,对于单元测试,每个测试的目标代码仅限于孤立隔离开来了的代码单元,它所依赖的就可以被mock。被mock的代码本身则会被另外的单元测试所覆盖到。集成测试再关注于测试单元测试未覆盖到的代码单元间的的交互。 我支持区分单元测试和集成测试,出发点就不同,因此持反对意见。
Gary
赞一个,物有所值。
黄平
单元测试应该是在任何环境下都可以正常运行的,所以需要排除任何外界因素的干扰,比如:网络,io,数据库等,没有mock,这种情况怎么处理?进行单元测试更多的应该是关注当前方法的逻辑功能,没有mock的话可能怎么保障测试用例专注于单个方法的功能验证?谢谢
赵阳: 没有mock(应该说stub),其实可以根据依赖逻辑抽象出接口,针对接口做一个生产实现,把依赖逻辑转移过来,用构造注入或setter注入把原来的类和依赖类链接起来。在测试的时,做一个测试类把依赖stub掉
张克强
赞!赞同!
W.Y☞
如果依赖很多RPC 接口, 有什么好办法避免Mock 吗?
黄平
消除单元情结,消除之后单元测试和集成测试的分界线是什么呢?
肖鹏: 我一般是存在跨进程的测试算集成测试,否则单元测试。其实我不赞成严格区分单元测试和集成测试。但是我承认有一个比较容易在团队中达成共识的名词还是挺重要的。
肖鹏: 跨进程是指数据库,或者redis,或者REST Api等。
亚锐
有收获
何留留
老师,前后端开发的情况,前端同学mock后台接口的返回值进行自测,后台同学mock接口被调用进行自测,这样的策略可行吗,好处是什么,谢谢老师?
Dragon
能否详细谈一下数据库相关的层如何测试?如何应该内存数据库达到测试实际数据库的目的?
果子
谢谢分享,很有感触,对mock的理解更深入了。
Adele
这样的mock和自动化测试之间的是否有些关系?是不是可以作为自动化测试的基础。很想在项目里来做这件事情,还不知如何来做?有没有些案例分享,或者常见的业务类(比如针对登陆、权限)等有比较通用的Mock代码案例。
嗜血红魔
好 很好 非常好
李志博
写的不错看了这篇文章叫我知道某些场景下mock 还是有用的。。
傻子才悲伤
感觉最基本的测试概念都没有搞清楚啊。单元测试,组件测试,集成测试等等,都是不一样的。mock个人认为用在TDD的单元测试部分,再合适不过了。另外为了凑齐七宗罪,强列出七点,也是有点不优雅啊。反对意见。
你可能还喜欢
Docker+K8S 集群环境搭建及分布式应用部署
李熠lynn
JVM 精华知识点汇总
胡玉洋
前端游戏框架哪个好
cba
美团客户端响应式框架 EasyReact 开源
美团技术团队
知识图谱发展史
AI科技大本营
MySQL 数据同步双机互备
小闲丶
微信扫描登录