《Unit Testing》2.1 经典学派如何做测试隔离
经典学派如何解决隔离问题
首先,再回顾一下单元测试的三个重要特性:
验证一小段代码(或者叫一个单元)
执行速度快
使用隔离的方式进行
针对第一个特性就会引出一个问题:多小的一段代码才足够小?
如果你采用针对每个类进行隔离的话,那么这一小段代码肯定就是这个类了,或者类里面的一个方法。没法比这个范围更大了。
有些情况下,你可能需要同时测试好几个类。但大部分时候,你都应该尽量保证每次只测试一个类。
但是在经典学派的做法里,并不是被测试的代码需要隔离,而是单元测试之间需要互相隔离。这样的话,你可以并行、按顺序或按任意顺序进行单元测试。而且它们的结果不会受到影响。
让测试之间互相隔离意味着可以同时运行多个类,前提是它们都在内存里并且不会接触到共享的状态。
共享状态就是指测试之间可以通信,并且会影响相互的执行上下文。
典型的共享状态例子就是进程外依赖:数据库、文件系统等等。
共享、私有、进程外依赖
共享依赖是指:这种依赖在测试间被共享,并且能够提供影响相互结果的手段。
典型的例子就是静态可变字段
另一个例子就是数据库
私有依赖就是指不共享的依赖。
进程外依赖,这种依赖运行于程序执行进程以外。它是到暂时还未进入内存的数据的代理。
在大多数情况下,进程外依赖就是共享依赖,但也不全是。例如:
数据库既是共享依赖,又是进程外依赖。
但如果每次运行测试都启动一个内涵数据库的 docker 容器,那这是进程外依赖,而不是共享依赖。因为测试运行的不是同一个进程实例。
同理,只读数据库也是进程外依赖,但不是共享依赖。因为其数据不可变,所有测试间的结果不会互相影响。
针对隔离问题,经典学派对于 mock 和测试替身的使用,拥有更加温和的观点:你仍然可以使用它们,但通常只对那些在测试之间引入共享状态的依赖项这样做:
强调一下:共享依赖是指在单元测试间共享的依赖,而不是被测试类(单元)的依赖。
共享依赖与不稳定依赖
另一个意思相近,但不完全一样的术语就是不稳定依赖(volatile dependencies)。
不稳定依赖具有以下属性:
除了默认安装在开发人员的机器上之外,它还引入了设置和配置运行时环境的要求。数据库和API服务就是很好的例子。它们需要额外的设置,默认情况下不会安装在组织中的计算机上。
它包含不确定性行为。例如,随机数生成器或返回当前日期和时间的类。这些依赖关系是不确定的,因为它们在每次调用上提供不同的结果。
不稳定依赖与共享依赖在概念上多少还是有一些重叠的。例如:
数据库既是共享依赖,又是不稳定依赖。
而文件系统则不是,因为每个开发者电脑上都有文件系统。
随机数生成器是不稳定依赖,但它确不是共享的,因为每次测试都会运行它的一个实例。
替换掉共享依赖的另一个原因就是提升测试的速度。
因为共享依赖大多数都在程序执行进程之外,所以例如访问数据库就要比访问私有依赖慢得多。
经典学派对隔离的这种观点也导致了对单元(一小段代码)的不同理解。一个单元不一定要局限于一个类。你也可以对一组类进行单元测试,只要它们都不是共享依赖项。
《Unit Testing》2.1 经典学派如何做测试隔离相关推荐
- 《Unit Testing》2.1 伦敦学派如何做隔离
针对单元测试的定义,主要有两种看法: 经典学派.经典学派之所以经典,是因为这原本就是人们做单元测试和测试驱动开发的方式 伦敦学派.伦敦学派扎根于伦敦的编程社区. 单元测试的定义 单元测试有很多定义,但 ...
- 对 React 组件进行单元测试(unit testing)
2019独角兽企业重金招聘Python工程师标准>>> 在这里说一下前端开发的一个特点是更多的会涉及用户界面,当开发规模达到一定程度时,几乎注定了其复杂度会成倍的增长. 无论是在代码 ...
- 《Pragmatic unit testing:in java with Junit》阅读
SQ3R阅读法: Survey:阅读之前的浏览,查阅 1.书名:<Pragmatic unit testing:in java with Junit>,中文译名<单元测试之道Ja ...
- Unit testing Cmockery 简单使用
/*********************************************************************** Unit testing Cmockery 简单使用* ...
- 《Unit Testing》1.1 -1.2 单元测试的目的
本系列是<Unit Testing> 一书的读书笔记 + 精华提取. 书中的例子 C# 语言编写,但概念是通用的,只要懂得面向对象编程就可以. 单元测试当前的状态 目前,在(美国的)大部分 ...
- 我的测试生活感悟2 - Art Of Unit Testing
今天把<Art Of Unit Testing>的前四个章节读完了,作者以自己的亲身经历,使用简洁清晰的语言,为我们展现了单元测试的艺术. 怎么定义一个好的测试案例呢?好的测试案例应该是在 ...
- Unit Testing in iOS
2019独角兽企业重金招聘Python工程师标准>>> Introduction Unit testing is a standard technique in computer p ...
- 体验VS2017的Live Unit Testing
相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的bac ...
- AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享
AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 原文:AY写给国人的教程- VS2017 Live Unit Testin ...
最新文章
- static用法总结
- 通过grub硬盘安装centos7
- linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译
- JZOJ 5439. 【NOIP2017提高A组集训10.31】Calculate
- IOS开发学习记录第2天之熟悉Xcode常用快捷键
- P5395 【模板】第二类斯特林数·行
- 160 - 24 Chafe.2
- c# 窗体启动后自动执行 Form_Load事件注册及调用
- [Android]Thread线程入门3--多线程
- java开发按键精灵_一个使用JAVA编写的类似按键精灵的程序
- 2000w mysql_MySQL数据库优化(基于酒店2000w条数据)
- 切换不了摄像头 高拍仪_高拍仪常见问题解答
- 整车电子电气架构EEA
- Windows10开启虚拟化
- android 视频画面切割,安卓手机如何剪裁视频 手机视频裁剪多余部分
- Ubuntu14.04上安装calamari
- 新能源汽车行业资讯-2022-9-17
- linux 冒号用法
- 头文件 INTRINS.H 的用法
- uniapp 开发安卓App实现高德地图路线规划导航
热门文章
- Comparable、Iterator接口和Collections类的实现方法
- php 设计模式 - 单例
- Android后台强制结束进程,Application入口或者activity回调的是哪个方法?
- 基本配置1-被忽悠进了CentOS 6
- android sim iso,android – 意外的telephonyManager.getSimCountryIso()行为
- C#自定义字符串压缩和解压缩源码库
- Oracle即将发布的全新Java垃圾收集器 ZGC
- centos 新建swap区文件
- 浅谈SQL注入风险 - 一个Login拿下Server(转)
- 查看和修改Oracle数据库服务器端的字符集