单元测试艺术之打破依赖

发表于:2021-6-11 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Never、C    来源:博客园

  本节索引:
  · 伪对象、桩对象、模拟对象
  · 为什么需要伪对象,如何处理
  · 手工新建伪对象
  · 用隔离框架创建伪对象
  一、伪对象(fake)桩对象(stub)模拟对象(mock)
  伪对象是一个通用术语,它即可指桩对象,也可指模拟对象。
  桩对象是指对系统中现有依赖项的一个替代品,可人为控制。
  模拟对象是用来决定一个单元测试是通过还是失败的伪对象。
  说明:fake是stub和mock的统称,因为看起来都像是真的对象。如果是用来检查交互的就是模拟对象,否则就是桩对象。
  桩对象:
  模拟对象:
  二、为什么需要伪对象
  外部依赖(系统中代码与其交互的对象,而且无法对其做人为控制)。
  反测试(而一旦测试中存在外部依赖,那么这个测试就是一个集成测试。运行慢,需要配置,依赖异常)。
  如何处理?
  本质上都是外部依赖导致的,所以要做的是消除依赖。
  1、分析接口
  2、实现可人为控制的接口
  注入桩对象
  1、在构造函数上接受一个接口,并保存在一个字段里,以备后用
  2、保存在属性上
  3、在调用方法前,使用方法参数,工厂类,依赖注入等
  隐藏桩对象(由于生产环境等其他原因,我们不希望暴露桩对象)
  1、使用条件编译
  2、使用条件特性
  3、使用internal和[InternalVisibleTo]
  三、手工新建伪对象
  使用桩对象(适用于模拟返回值,不适用于检查对象间的交互情况。)
  这是非常常见的方式,但是这种方式受限制很多,如文件需要配置,运行慢。
   
  改写注入:
   
  测试代码:
  使用模拟对象(适用于对象之间的交互)
  当上面的方法返回false的时候,需要调用别的web服务记录下。而web服务还未开发好,即使开发好了,测试的时间也会变长很多。
  这里其实也体现了,stub的优点,可以任意的控制返回结果。
  新建一个mock:
  测试代码:
  注意:一个测试只有一个mock,其他伪对象都是stub,如果存在多个mock,说明这个单元测试是在测多个事情,这样会让测试变得复杂和脆弱。
  四、使用隔离框架创建伪对象
  隔离框架简介
  手写stub和mock非常麻烦耗时,而且不易看懂等缺点。
  隔离框架是可以方便的新建stub和mock的一组可编程API。
  .net下常见的有RhinoMocks,Moq
  这里使用RhinoMocks做示例(将使用录制回放模式和操作断言2种)。
   
  录制回放
  新建mock对象
  来实现一个和上面mock的例子:
   
  严格模拟对象:是指只要出现预期行为以外的情况,就报错。
  非严格模拟对象:是指执行到最后一行,才会报错。
  新建stub对象
   
  操作断言
   
  注意:使用框架创建的动态伪对象,肯定没手工编写的伪对象执行效率高。

   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号