隐藏在mock之后的‘快感’

简介:

      最近某同事抱怨他们的测试难写,经常花费在测试的时间比产品代码更多,而且每次重构后都必须修改一大堆的测试。和同事闲谈后得知,在其项目中大量的使用了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),如果你对外部依赖,耗时依赖的分离,这我相信将不再是问题所在,测试的优化将是另一个有趣的话题,将不是本问内容之列。



 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/1212841,如需转载请自行联系原作者
相关文章
Ant Design 中表单内容如何设置,更改,回显功能写法
Ant Design 中表单内容如何设置,更改,回显功能写法
237 0
|
JSON 前端开发 数据格式
前端(二十一):label语句、with语句、JSON、生成器、解析赋值、历史状态管理、将页面可编辑
label语句、with语句、JSON、生成器、解析赋值、历史状态管理、将页面可编辑
158 0
|
JavaScript
Vue中解决v-show & 三目表达式 判断后中的值改变,但视图不刷新问题。
Vue中解决v-show & 三目表达式 判断后中的值改变,但视图不刷新问题。
|
前端开发 JavaScript 小程序
【‘极端’测试提的问题】输入栏填入表情图片需要进行异常处理
【‘极端’测试提的问题】输入栏填入表情图片需要进行异常处理
149 0
【‘极端’测试提的问题】输入栏填入表情图片需要进行异常处理
|
缓存 API
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
|
存储 Python
Python 自动化-pywinauto库print_control_identifiers()方法打印内容显示不全解决办法,cmd展示更多内容设置方法
Python 自动化-pywinauto库print_control_identifiers()方法打印内容显示不全解决办法,cmd展示更多内容设置方法
892 0
Python 自动化-pywinauto库print_control_identifiers()方法打印内容显示不全解决办法,cmd展示更多内容设置方法
|
数据采集 JavaScript
puppeteer 清空input原本的值
puppeteer 中 使用 page 输入 input 的时候,有可能需要清除 input 原本就有的值。
关于使用load_model加载包含自定义函数的模型,找不到自定义函数的问题。
关于使用load_model加载包含自定义函数的模型,找不到自定义函数的问题。
235 0
|
机器人 测试技术 Windows
Robot Framework之创建变量和执行用例
一、变量的使用 种子变量 变量可以在命令行中设置,个别变量设置使用--variable (-v)选项,变量文件的选择使用--variablefile (-V)选项。
1669 0