• 单元测试之Mock


    • 为什么需要Mock.
      • 真实对象具有不确定的行为.所以会产生不可预测的结果.
      • 真实对象很难被创建.
      • 真实对象的某些行为很难被触发(如网络错误).
      • 真实对象令程序的运行速度很慢.
      • 真实对象有(或者是)用户界面.
      • 测试需要询问真实对象它是如何被调用的.
      • 真实对象实际上并不存在.例如其它小组开发的模块.
    • 使用Mock的3个步骤
      • 使用一个接口来描述该对象.
      • 为产品代码实现该接口.
      • 以测试为目的,在Mock对象中实现该接口.
    • Test Double
      • Dummy.被传递但是从不被实际使用的对象.通常用于填充参数列表.
      • Fake.含有实际实现的对象.但通常使用一些不适用于实际项目的捷径(内存数据库).
      • Stubs.对调用提供一些预设的响应.通常不会调用代码中实际调用会执行的代码.可以用来记录关于调用的信息.(Email中可以记录发送过的邮件).
      • Mocks.预先编写的对象.接受特殊的调用,返回特定的预期行为.
      • Mock的四个步骤:setup,exercise,verify,teardown.
      • 只有Mock是进行行为测试验证.
    • 主要对象和次要对象
      • 单元测试中,我们通常关注的是主要测试对象的功能和行为.
      • 对于主要测试对象涉及到的次要对象尤其是一些依赖,我们仅仅关注主要测试对象和次要测试对象的交互.
      • 比如是否调用,何时调用,调用的参数,调用的次序,以及返回的结果或者异常等.
      • 但是次要对象是如何执行这次调用的,并不关心.
      • 因此,使用mock对象或者stub对象来替代真实的次要对象,从而模拟真实场景来进行对主要测试对象的测试.
    • 测试工具
      • 在.Net下大部分工具都是使用动态类型来进行Mock,因此,只能Mock接口或者overriable成员.
      • 而TypeMock直接使用inject方式,即使是sealed或者不可覆盖方法也能进行Mock.
      • 通常,如果发现必须要覆盖不可覆盖的方法才能够进行测试,那么很可能是设计问题.
    • Mock行为依赖风险
      • 被模型对象的行为必须与真实对象的行为完全一致.
      • 开发者对API不够了解;被模拟对象的行为发生了改变(重构,添加新功能导致的).都可能引起错误假设(与真实对象行为不一致).错误假设会引入缺陷,并留下非法测试.
      • 非法测试:看起来像测试,运行起来也是测试.但是几乎没有价值,几乎不会失败.
    • Mock的优点
      • Mock对象的行为简单,唯一.一旦设置好setup后总是返回同一值.
      • Mock对象的行为可以预期,如果调用到了不希望调用的方法会让测试失败.若方法被调用了,还可以验证参数.
      • 可以Mock一些在真实环境中难以模拟或者出现的错误或者异常.
      • Mock是一种白盒测试方式.Mock对象的setup过程就是目标代码实现细节的设计过程.
      • 接口为使用者而设计.所以当接口还未被实现时,Mock可以验证使用者是如何使用接口的.
    • Mock的缺陷
      • Mock对象的行为依赖风险.在对真实对象进行重构的时候,容易带来该问题.
      • Mock对象的setup过程可能过于繁重.
        • 另一个角度,过于复杂的Mock对象的setup过程,说明真实对象承担了过多的职责.
        • 分出更多职责清晰的小类,可以避免这种情况.
      • Mock对象的setup过程含有过多的语义.
        • Mock对象的行为定义.调用方法的返回值;调用方法时的Throw Exception;给调用方法时传递的参数发送消息.
        • Test Case期望assert的内容.方法是否被调用以及被调用的次数.调用方法时的参数是否合法.
  • 相关阅读:
    jquery使用
    网站重构?
    WEB应用从服务器主动推送Data到客户端有那些方式?
    异步加载和延迟加载?
    平时如何管理你的项目?
    对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
    约定优于配置(convention over configuration)
    JavaEE的13种核心技术
    The Spring Framework ConfigurableListableBeanFactory.java
    mySQL的boolean类型为tinyint(1)
  • 原文地址:https://www.cnblogs.com/robyn/p/3793315.html
Copyright © 2020-2023  润新知