go test 包外测试

news/2024/12/20 7:47:15/

之前文章有介绍过 go test coverage 单测覆盖率 和Go test基础用法,今天这里主要介绍 go 单测中比较特殊的一种场景:包外测试。初次看到这个名字,我还以为就是单独创建一个新目录,所有的单测用例统一都汇总到这个目录下,但其实并不是。

go语言限定在一个目录下只能声明一个 package,如果尝试在一个目录下声明多个 package,编译器会有报错提示:Multiple packages in the directory:。但这种情况也是例外的,包外测试就是一个例外。

go语言如何存放单测文件呢,最通用的方式就是在当前目录下创建*_test.go 文件。形如下面这样,但 main_test.go 和 main.go 声明的 package 是相同的。

在这里插入图片描述
结合图示,go 包外测试就是 main_test.go 中声明的 package 不再是 main,而是 main_test。这样就出现了同一个目录下,同时存在 package 为 main 和 mian_test 的情况,这是被编译器支持的。

现在包外测试已经搞明白了:同一个目录下,比如声明的 package 为 ol,还可以声明 ol_test 的包。但也有前提限制,声明 package ol_test 的 go 文件需要是单测文件(文件后缀是_test.go)。

问题来了,包外测试用来解决什么问题呢,我怎么就没有遇到过包外测试的情况?

虽然 ol 和 ol_test 在同一个目录下,但因为它俩的 package 不相同,两个包的就是独立隔离的,ol_test 中的单测用例就不能访问 ol 中的私有方法了。

外包测试模式对应了黑盒测试,包内测试对应了白盒测试。从黑盒和白盒的角度来看,包外测试和单独创建一个包目录,然后统一将单测文件集中到这个目录下,没有什么区别。包外测试真正重要的地方是:解决循环依赖问题。

我们思考一个问题,go 里面单测使用的包是 testing,单测需要引入这个包来执行。testing 包内部会有很多处理逻辑,也需要依赖其他底层的包,比如说 strings、strconv、fmt 等等。问题来了,如果 strings 包想要写单测文件该怎么办呢?testing 内部依赖了 strings 包,现在 strings 包反过来又要依赖 testing 包,这就形成了循环依赖问题。

我们看看 strings 包的单测文件,它内部的单测使用的就是包外测试。在同一个目录下,也只能使用包外测试来规避这种情况。

在这里插入图片描述

我们看 testing 包的单测用例,也是用了包外测试的模式。这么想来,我们业务代码中最好不要使用这种模式,在设计代码结构结构时,包的调用层级我们就应该设计好,避免出现循环调用的情况。

在这里插入图片描述

现在通过包外测试将代码做了隔离,包外测试就访问不到包内的私有方法和变量了。神奇的是,go没有彻底把这个路给封死,我们可以通过包内测试来把他们暴露出来。

举个例子,我声明一个包 order:order.go 文件中声明了一个私有变量 number,order_test 是包外测试,声明的包名是 order_test。无论如何,order_test 是无法访问这个是有变量的。

在这里插入图片描述

所以,我们声明了一个 order 包内的变量导出单测文件,order_export_test,已这个单测文件为沟通桥梁,将私有变量变得可导出。

在这里插入图片描述

最后在包外测试中,引用 order 包,直接使用这个导出的变量就可以。通过这里例子我们发现,同一个包下,包外测试可以通过包内测试做中转,来访问包内的私有成员。但这也仅限于同一个报下,跨包的单测导出是不能被访问的。

在这里插入图片描述


http://www.ppmy.cn/news/203891.html

相关文章

Hitcon 2016 SleepyHolder-fastbin_dup_consolidate.c

参考/题目下载: https://github.com/mehQQ/public_writeup/tree/master/hitcon2016/SleepyHolder https://blog.csdn.net/seaaseesa/article/details/105856878 1,三联 保护:基本都开了 功能: 0、唤醒功能; 1、创建-secret&#…

计算机参数配置解读,教你看懂电脑配置参数,了解组装电脑基本知识

很多小白用户在挑选电脑的时候都不知道该如何下手,今天电脑配置为为大家带来一篇电脑硬件扫盲的文章,让大家了解一些电脑配置的基本知识,以及如何看懂电脑配置参数。这里我们所说的电脑配置包括台式机和笔记本,虽然它们的外形不一…

新电脑快速配置

最近换了台新电脑,开发环境这些都要重新装,主要记录下步骤。 系统 双系统少不了,由于默认都是windows,而我偏爱linux系统。所以,第一件事就是装ubuntu,也纠结过要不要换个发行版,比如mint,不过…

新电脑配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言新电脑配置 前言 新电脑如何配置才可以更加好用,便捷呢? 提示:以下是本篇文章正文内容,下面案例可供参考 新电脑配置 1.设…

Asana替代方案推荐:盘点2023年8种优质的免费和付费替代工具

Asana是一个项目管理和团队合作软件平台,自2008年成立以来,一直在彻底改变团队合作的方式。Asana以其直观的用户界面而闻名,是项目经理和团队领导的热门选择。然而在快节奏的项目管理世界中,技术发展很快。因此,当涉及…

CPM-Bee本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

R9 7945HX参数 R97945HX核显怎么样 锐龙R97945HX相当于什么水平

R9 7945HX采用Zen 4架构,16核心32线程设计,基础频率2.5GHz,加速频率5.4GHz,二级缓存16MB,三级缓存64MB,默认TDP为55W。核显为Radeon 610M,配备2个CU,共计128个流处理器,基…

r9 5900hx和i7 10875h参数对比哪个好

R9 5900HX 为 8 核 16 线程,主频 3.3GHz,睿频 4.6GHz,16MB 三级缓存 选r9 5900hx还是i7 10875h这些点很重要看过你就懂了 http://www.adiannao.cn/dy i7-10875H是一款高端笔记本电脑处理器,具有基于Comet Lake架构(CM…