最近某同事抱怨他们的测试难写,经常花费在测试的时间比产品代码更多,而且每次重构后都必须修改一大堆的测试。和同事闲谈后得知,在其项目中大量的使用了mock,或者说对mock的使用过度极端对所谓的单元测试“快速”,“独立“的过度。 在前边转载过《软件开发中没有所谓正确的方法》,当你把某一种方法论作为银弹使用的时候,早晚魔鬼会伴随在你身边。

Mock给我带来了感知,剥离了类与类之间的依赖,有助于我们更好的工作在当前的关注点 .但同时由于太多的对场景的假设,导致这块代码成为了信息的孤岛,甚至很多时候不得不用mock的第二特性verify,order,以至于你的测试关心的不再是代码存在的business逻辑,而倾向代码层面的设计实现,这就把你单元测试推向了“白盒测试“的位置,导致测试变为脆弱的测试。每当简单的重构导致内部的变化,你的测试也必须随着改变。

鄙人认为作为一个好的测试而言,在一次合法的简单重构之下,是不需要修改测试的,因为你修改的只是内部实现,而不是business的改变,如果你边改测试边重构或者重构后挂到一大堆测试,这意味这你的测试不是一个稳定的测试或者你不是一次合法的重构(也许redesign,override)。

在同事的项目中对mock的极端到了对简单的View Object 也采用builder模式,可是内部却全是mock given。在我看来而言View Object只是一个简单的数据载体,不存在行为逻辑,我们毫无必要去做mock,mock该是针对假设,而应该尽量避免对状态mock。在同事的项目中导致需要写一个测试之前,作为测试的准备given ,必须理解存在代码的实现,因为你需要一堆given,比如对于person对象,如果你在实现中需要得到account则:

given(person.getAccount()).willReturn(some account);

导致我需要了解实现需要什么property,如果我需要新的的property也许只是简单的把某个“依恋情结”放入了object,测试也需要被修改,导致重构者对自己的重构并不那么自信,这将影响重构成为日常行为,随着堆积的”坏味道“这将一点一点的侵蚀你的代码,项目慢慢的也许会不能的不可控。

Mock并不是一个坏的东西,结果的好坏在于使用的人,团队 的意识,如果是mock anywhere或者杜绝mock走向两个任意的极端都将是一个错误的抉择。

Mock更多的使用场景为对外界资源解依赖增强感知能力,以及对无响应的重要business的验证,后者长体现于一个没有返回子void的method,但是method比如增加用户积分,记录用户信息等的。然而对于有响应的business,我需要的不是mock而应该是assert,对于测试来说对于business来说应试是我的输入应该得到我预期的响应,而非我verify某个行为发生了,那么其结果一定就正确,当然对于实现来说这是成立的,但是从测试的价值来说这厮无意义的,这将是一个脆弱的测试,我认为一个好的测试将是“黑盒测试“,是一个business的描述,对一份约定,契约的阐述。

附言,如果你因为测试的速度,独立性来为自己的mock证明,那将是无意义的,不是每一个测试都必须在黄金法则内(0.1s),如果你对外部依赖,耗时依赖的分离,这我相信将不再是问题所在,测试的优化将是另一个有趣的话题,将不是本文内容之列。

隐藏在mock之后的‘快感’相关推荐

  1. 干货!用大白话告诉你什么是Mock测试

    初识mock 作为一个动词,mock是模拟.模仿的意思:作为一个名词,mock是能够模仿真实对象行为的模拟对象. 在软件测试中,mock所模拟的对象是什么呢? 它一定不是我们所测试的对象,而是 SUT ...

  2. go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...

    Gopher China作为国内最权威和最实力干货的Go大会,致力于为广大的Gopher提供一线分享交流机会,也为众多一线互联网公司大咖深入探讨Go语言的应用发展提供契机. 在近日于上海召开的第六届G ...

  3. Google Mock启蒙篇 [1] (Google C++ Mocking Framework for Dummies 翻译)

    Google C++ Mocking Framework for Dummies Google Mock启蒙篇 Version: 0.07< xmlnamespace prefix =" ...

  4. Google Mock启蒙篇 [2] (Google C++ Mocking Framework for Dummies 翻译)

    Setting Expectations 成功地使用Mock对象的关键是在它上面设置合适的期望.如果你设置的期望太过严格,你的测试可能会因为无关的改变而失败.如果你把期望设置的太过松驰,bugs可能会 ...

  5. Mock Server实践

    背景 在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过REST API或是Thrift调用来进行通信.要对被测服务进行系统测试,一般做法是,部署好所有外部依赖模块,由被 ...

  6. 使用Mockito对类成员变量进行Mock

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mock ...

  7. app接口服务器请求为什么会报错307_Vue接口代理和数据Mock,你会了吗

    基于Vue和React脚手架演示各自项目的接口代理和数据Mock. Vue接口代理实现步骤 vue中文官方文档:https://cn.vuejs.org/ vue-cli中文官方文档:https:// ...

  8. 网易有数的“正确”使用方式——洞察数据中隐藏的故事

    此文已由作者王文开授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 网易有数提供了用户非常灵活的图表制作能力,其设计原理是希望用户能够通过"搭积木"的形式, ...

  9. 小程序高级电商前端第1周走进Web全栈工程师一----小程序注册、开发工具推荐、《风袖》首页布局详尽分析、Webstorm开发小程序必配配置、mock数据...

    接下来开启一门全新的课程的学习,其实这是去年6月份所记录的,只是木有公开,然后到目前为止已经间隔了快1年没管了,基本上是已经快放弃的节奏,但是呢它又是我一直特别想学习的,所以决定公开,鞭策自己得继续前 ...

最新文章

  1. vs2008格式化代码
  2. 要毁灭人类、喷马斯克、还获得公民身份的Sophia,是假的
  3. SQL一对多特殊查询,取唯一一条
  4. 红队攻防之从边界突破到漫游内网(无cs和msf)
  5. 在c语言中下面指针,c语言指针的知识点
  6. 配置纯净版Debian
  7. 使用Entity Framework Core访问数据库(Oracle篇)
  8. java 不定参数_Java不定参数
  9. RDMBorderedButton
  10. JAVA包装类及自动封包解包示例代码
  11. 高级Java程序员面试宝典
  12. 基于OpenCV视频帧差分的身高检测
  13. ASO优化图标篇:App图标优化的几点建议
  14. excel快速删除奇偶数行
  15. 学习使用 OpenCV 中的函数 cv2.kmeans() 对数据进行分类
  16. 2019.7.summary
  17. 工资,一般讲税前还是税后?
  18. java 批量读取excel表格内容_java 使用POI批量导入excel数据
  19. Windows环境下安装PyMySQL(已安装Anaconda)
  20. 论文《ImageNet Classification with Deep Convolutional Neural Networks》阅读及AlexNet的Tensorflow2复现

热门文章

  1. 人工智能、应用、程序
  2. express 设置跨域
  3. 移动设备的配置测试(译)
  4. Vue 踩坑日志 - 有关路由传参的坑
  5. MB_SELECT_GR_BLOCKED_STOCK 读取物料收货冻结库存
  6. javsscript练习
  7. CentOS-6.4 minimal - 安装VMware Tools(linux)
  8. Ffmpeg 定位文件(seek file)
  9. Eclipse 常用最新插件.标记
  10. Javascript(6)