51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3160|回复: 1
打印 上一主题 下一主题

[转贴] 单元测试艺术之打破依赖

[复制链接]
  • TA的每日心情
    擦汗
    3 小时前
  • 签到天数: 1047 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-6-17 09:14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     本节索引:
      · 伪对象、桩对象、模拟对象
      · 为什么需要伪对象,如何处理
      · 手工新建伪对象
      · 用隔离框架创建伪对象
      一、伪对象(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对象

      操作断言

      注意:使用框架创建的动态伪对象,肯定没手工编写的伪对象执行效率高。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 12:42 , Processed in 0.066146 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表