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

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

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

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

  • 执行速度快

  • 使用隔离的方式进行

 

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

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

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

 

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

 

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

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

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

 

共享、私有、进程外依赖

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

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

  • 另一个例子就是数据库

 

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

 

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

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

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

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

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

 

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

 

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

 

共享依赖与不稳定依赖

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

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

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

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

 

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

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

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

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

 

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

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hacker News热文:请停止学习框架,学习领域驱动设计(DDD)(获500个点赞)

在 Hacker News 上获得接近 500 个点赞的一篇名为《停止学习框架》的文章称:我们是程序员,每天都在了解最新的技术,每天都在学习编程语言、框架和库,因为我们知道的现代编程工具越多越好,对吧?不停地追随 A…

C#跨平台开源项目实战(WPF/Android/IOS/Blazor)

个人介绍由于本人从业WPF开发, 考虑到国内的WPF开发环境并不是很好, 资源少、项目案例少, 所以导致很多初学者就已经断了念头。所以我作为WPF的从业者, 就在2019年,开始了发布自己的WPF相关的免费教学视频。发布开源的项目实践, WPF的基础视频、项目实践视频, 包括WPF UI设计视…

[开源] .Net 使用 ORM 访问 神舟通用数据库(神通)

前言天津神舟通用数据技术有限公司(简称“神舟通用公司”),隶属于中国航天科技集团(CASC)。是国内从事数据库、大数据解决方案和数据挖掘分析产品研发的专业公司。公司获得了国家核高基科技重大专项重点支持&#xff0…

在 Xunit 中使用依赖注入

在 Xunit 中使用依赖注入Intro之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection, 来自大师的作品,让你在测试代码里使用依…

C#由转换二进制所引起的思考,了解下?

【导读】最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时,非常开心,收到再一次连任MVP的邮件&#xff0c…

.Net Core In Docker 在容器内编译并发布

Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker。.Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写。你搜.Net core程序发布到Docker网上一般常见的有两种方案:1、在本地编译成Dll文件…

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年,以 docker、kubernetes 为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图“放长线钓大鱼”。就说腾讯吧,目前基本所有业务都跑在云上&#xff0…

C# 9.0 新特性之 Lambda 弃元参数

阅读本文大概需要不到 1 分钟。弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的,但它却不被分配存储空间,即没有值,所以不能从中读取值。弃元用…

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星,其本质是反向代理负载均衡类软件,领域上归于应用交付,那么作为应用交付领域的老兵如何看待 Envoy,Envoy 又引发了哪些关于传统应用交付领域的思考?关于作者林静,F5 软件方向解决方…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间,陆陆续续的把手里头项目都迁移到了k8s中,期间遇到很多的坑,并且也学到了许多k8s的知识(从0-1),大家都知道k8s中的一大特性是自动扩容,对此结合自己的业务发现很是有“用武之地…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「149」篇原创敬上大家好,我是Z哥。不管是日常的工作中还是生活中,我们每天会用到很多软件系统。不知道你有没有过这样的感受,当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行,与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代,各种编程语言大行其道,各有各的优势。但是有一点未曾改变,那就是他们服务的方式,工作的时候各司其职&#xff0…

如何在ASP.NET Core中集成ElasticSearch

本文来自:https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌,您肯定会被要求向Web应用程序中添加高级搜索功能,而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时,非常开心,收到再一次连任MVP的邮件&#xff0c…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目:.netcore采集程序向Azure事件中心(EventHubs)发送数据,通过Azure EventHubs Capture转储到Azure BlogStorage,供数据科学团队分析。为什么使用Azure事件中心?Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…

Mysql@和@@符号的详细使用说明

一、概述 是用户变量&#xff0c;是系统变量。 二、使用语法及实践 用户自定义变量 1、用户定义变量语法 SET var_name expr [, var_name expr] 如&#xff1a;set t1 100; 2、获取用户定义变量值方式&#xff0c;如&#xff1a; select t1 from dual; 如下图 系统变…

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》&#xff0c;最近看到有人提出弱密钥问题&#xff0c;换个强密钥不就完了吗&#xff0c;猜测可能是与第三方对接导致很无奈不能更换密钥&#xff0c;所以产生本文解决.NET Core中3DES弱密钥问题&#xff0c;写…