经典学派如何解决隔离问题

首先,再回顾一下单元测试的三个重要特性:

  • 验证一小段代码(或者叫一个单元)

  • 执行速度快

  • 使用隔离的方式进行

针对第一个特性就会引出一个问题:多小的一段代码才足够小?

  • 如果你采用针对每个类进行隔离的话,那么这一小段代码肯定就是这个类了,或者类里面的一个方法。没法比这个范围更大了。

  • 有些情况下,你可能需要同时测试好几个类。但大部分时候,你都应该尽量保证每次只测试一个类。

但是在经典学派的做法里,并不是被测试的代码需要隔离,而是单元测试之间需要互相隔离。这样的话,你可以并行、按顺序或按任意顺序进行单元测试。而且它们的结果不会受到影响。

让测试之间互相隔离意味着可以同时运行多个类,前提是它们都在内存里并且不会接触到共享的状态。

  • 共享状态就是指测试之间可以通信,并且会影响相互的执行上下文。

    • 典型的共享状态例子就是进程外依赖:数据库、文件系统等等。

共享、私有、进程外依赖

共享依赖是指:这种依赖在测试间被共享,并且能够提供影响相互结果的手段。

  • 典型的例子就是静态可变字段

  • 另一个例子就是数据库

私有依赖就是指不共享的依赖。

进程外依赖,这种依赖运行于程序执行进程以外。它是到暂时还未进入内存的数据的代理。

在大多数情况下,进程外依赖就是共享依赖,但也不全是。例如:

  • 数据库既是共享依赖,又是进程外依赖。

  • 但如果每次运行测试都启动一个内涵数据库的 docker 容器,那这是进程外依赖,而不是共享依赖。因为测试运行的不是同一个进程实例。

  • 同理,只读数据库也是进程外依赖,但不是共享依赖。因为其数据不可变,所有测试间的结果不会互相影响。

针对隔离问题,经典学派对于 mock 和测试替身的使用,拥有更加温和的观点:你仍然可以使用它们,但通常只对那些在测试之间引入共享状态的依赖项这样做:

强调一下:共享依赖是指在单元测试间共享的依赖,而不是被测试类(单元)的依赖。

共享依赖与不稳定依赖

另一个意思相近,但不完全一样的术语就是不稳定依赖(volatile dependencies)。

不稳定依赖具有以下属性:

  • 除了默认安装在开发人员的机器上之外,它还引入了设置和配置运行时环境的要求。数据库和API服务就是很好的例子。它们需要额外的设置,默认情况下不会安装在组织中的计算机上。

  • 它包含不确定性行为。例如,随机数生成器或返回当前日期和时间的类。这些依赖关系是不确定的,因为它们在每次调用上提供不同的结果。

不稳定依赖与共享依赖在概念上多少还是有一些重叠的。例如:

  • 数据库既是共享依赖,又是不稳定依赖。

  • 而文件系统则不是,因为每个开发者电脑上都有文件系统。

  • 随机数生成器是不稳定依赖,但它确不是共享的,因为每次测试都会运行它的一个实例。

替换掉共享依赖的另一个原因就是提升测试的速度。

因为共享依赖大多数都在程序执行进程之外,所以例如访问数据库就要比访问私有依赖慢得多。

经典学派对隔离的这种观点也导致了对单元(一小段代码)的不同理解。一个单元不一定要局限于一个类。你也可以对一组类进行单元测试,只要它们都不是共享依赖项。

《Unit Testing》2.1 经典学派如何做测试隔离相关推荐

  1. 《Unit Testing》2.1 伦敦学派如何做隔离

    针对单元测试的定义,主要有两种看法: 经典学派.经典学派之所以经典,是因为这原本就是人们做单元测试和测试驱动开发的方式 伦敦学派.伦敦学派扎根于伦敦的编程社区. 单元测试的定义 单元测试有很多定义,但 ...

  2. 对 React 组件进行单元测试(unit testing)

    2019独角兽企业重金招聘Python工程师标准>>> 在这里说一下前端开发的一个特点是更多的会涉及用户界面,当开发规模达到一定程度时,几乎注定了其复杂度会成倍的增长. 无论是在代码 ...

  3. 《Pragmatic unit testing:in java with Junit》阅读

    SQ3R阅读法: Survey:阅读之前的浏览,查阅   1.书名:<Pragmatic unit testing:in java with Junit>,中文译名<单元测试之道Ja ...

  4. Unit testing Cmockery 简单使用

    /*********************************************************************** Unit testing Cmockery 简单使用* ...

  5. 《Unit Testing》1.1 -1.2 单元测试的目的

    本系列是<Unit Testing> 一书的读书笔记 + 精华提取. 书中的例子 C# 语言编写,但概念是通用的,只要懂得面向对象编程就可以. 单元测试当前的状态 目前,在(美国的)大部分 ...

  6. 我的测试生活感悟2 - Art Of Unit Testing

    今天把<Art Of Unit Testing>的前四个章节读完了,作者以自己的亲身经历,使用简洁清晰的语言,为我们展现了单元测试的艺术. 怎么定义一个好的测试案例呢?好的测试案例应该是在 ...

  7. Unit Testing in iOS

    2019独角兽企业重金招聘Python工程师标准>>> Introduction Unit testing is a standard technique in computer p ...

  8. 体验VS2017的Live Unit Testing

    相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的bac ...

  9. AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享

    AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 原文:AY写给国人的教程- VS2017 Live Unit Testin ...

最新文章

  1. static用法总结
  2. 通过grub硬盘安装centos7
  3. linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译
  4. JZOJ 5439. 【NOIP2017提高A组集训10.31】Calculate
  5. IOS开发学习记录第2天之熟悉Xcode常用快捷键
  6. P5395 【模板】第二类斯特林数·行
  7. 160 - 24 Chafe.2
  8. c# 窗体启动后自动执行 Form_Load事件注册及调用
  9. [Android]Thread线程入门3--多线程
  10. java开发按键精灵_一个使用JAVA编写的类似按键精灵的程序
  11. 2000w mysql_MySQL数据库优化(基于酒店2000w条数据)
  12. 切换不了摄像头 高拍仪_高拍仪常见问题解答
  13. 整车电子电气架构EEA
  14. Windows10开启虚拟化
  15. android 视频画面切割,安卓手机如何剪裁视频 手机视频裁剪多余部分
  16. Ubuntu14.04上安装calamari
  17. 新能源汽车行业资讯-2022-9-17
  18. linux 冒号用法
  19. 头文件 INTRINS.H 的用法
  20. uniapp 开发安卓App实现高德地图路线规划导航

热门文章

  1. Comparable、Iterator接口和Collections类的实现方法
  2. php 设计模式 - 单例
  3. Android后台强制结束进程,Application入口或者activity回调的是哪个方法?
  4. 基本配置1-被忽悠进了CentOS 6
  5. android sim iso,android – 意外的telephonyManager.getSimCountryIso()行为
  6. C#自定义字符串压缩和解压缩源码库
  7. Oracle即将发布的全新Java垃圾收集器 ZGC
  8. centos 新建swap区文件
  9. 浅谈SQL注入风险 - 一个Login拿下Server(转)
  10. 查看和修改Oracle数据库服务器端的字符集