go test 包外测试

news2024/11/27 18:52:37

之前文章有介绍过 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.coloradmin.cn/o/607819.html

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

相关文章

【P48】JMeter 断言持续时间(Duration Assertion)

文章目录 一、断言持续时间(Duration Assertion)参数说明二、测试计划设计 一、断言持续时间(Duration Assertion)参数说明 可以控制取样器的执行是否超过某个时间,如果超时则报错,持续时间断言器也叫超时…

21天学会C++:Day6----内联函数

CSDN的uu们,大家好。这里是C入门的第六讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 知识引入 2. 知识点讲解 2.1 内联函数的使用 2.2 内联函数的特性 2.2 …

强大Excel 插件 Zbrainsoft Dose for Excel 3.6.2 Crack

强大的 Excel 插件 Zbrainsoft Dose for Excel 3.6.2 如果您厌倦了在Excel中消除重复的行,比较工作表或执行困难的活动,那么Dose for Excel是您需要的强大便捷解决方案,只需单击几下即可将所有这些复杂的杂务简化。它具有 100 多个强大的新功…

pytorch实战 -- 自动微分

autograd——自动求导系统 import torch torch.manual_seed(7) <torch._C.Generator at 0x7f3c1f9e0490> torch.autograd.backward(tensors, grad_tensorsNone, retain_graphNone, create_graphFalse) 功能&#xff1a;自动求取梯度 tensors&#xff1a;用于求导的张量&…

axios-CancelToken方法取消请求-控制多次同样api调用取消上一次接口调用

前言 开发当中看到了axios取消方法&#xff0c;经过查阅&#xff0c;axios这个包是提供了取消请求的方法的。 移动端当是tab栏类的页面&#xff0c;或者是下拉刷新和上拉加载是一个接口是&#xff0c;会出现20条情况&#xff08;接口调用2次&#xff09;。 pc端同一个按钮&am…

【欢迎您,xxx--JavaScript】

login.html <body><form action"index.html">用户名&#xff1a;<input type"text" name"usname"><input type"submit" value"登录"></form> </body> index.html <body><di…

BERT在GLUE数据集构建任务

0 Introduction 谷歌开源的BERT项目在Github上&#xff0c;视频讲解可以参考B站上的一个视频 1 GLUE部分基准数据集介绍 GLUE数据集官网GLUE数据集下载&#xff0c;建议下载运行这个download_glue_data.py文件进行数据集的下载&#xff0c;如果链接无法打开&#xff0c;运行…

七、Gitee码云的注册及使用(二)

1、创建远程仓库 (1)登录Gitee.com&#xff0c;点击右上角 号&#xff0c;再点击新建仓库。 (2)填写仓库名称&#xff0c;路径&#xff0c;仓库介绍 (3)选择是否开源 (4)初始化仓库 开源许可证&#xff1a;主要包括开源是否可以随意转载&#xff0c;开源但不能商业使用&…

yolov8改进大作战,开箱即用,提供yolov8魔术师专栏代码

1.yolov8魔术师专栏介绍 开箱即用&#xff1a;提供 yolov8魔术师专栏 代码&#xff0c;方便直接使用&#xff0c;无需自己重新添加引起的一些bug问题&#xff1a; https://blog.csdn.net/m0_63774211/category_12289773.html?spm1001.2014.3001.5482 专栏内容如下&#xff…

【深入浅出Spring Security(五)】自定义过滤器进行前后端登录认证

自定义过滤器 一、自定义过滤器自定义登录认证过滤器自定义 LoginFilter配置 LoginFilter测试 二、总结 一、自定义过滤器 在【深入浅出Spring Security&#xff08;二&#xff09;】Spring Security的实现原理 中小编阐述了默认加载的过滤器&#xff0c;里面有些过滤器有时并…

OpenGL实现第一个窗口-三角形

1.简介 此代码是基于QtOpenGL实现的&#xff0c;但是大部分的代码是OpenGL&#xff0c;Qt封装了一些类&#xff0c;方便使用。 2.准备工作 QOpenGLWidget提供了三个便捷的虚函数&#xff0c;可以重写&#xff0c;用来重写实现典型的OpenGL任务。不需要GLFW。 paintGL&#…

【C语言】Visual Studio社区版安装配置环境(保姆级图文)

目录 1. 官网下载社区版2. 选择安装项目2.1 点击使用C的桌面开发2.2 语言包选择简体中文2.3 设置安装位置 3. 创建新项目3.1 点击创建新项目3.2 点击空项目&#xff0c;下一步3.3 设置项目名称路径3.4 创建项目 4. 测试例程总结 欢迎关注 『C语言』 系列&#xff0c;持续更新中…

代码随想录 二叉树 Java (一)

文章目录 &#xff08;简单&#xff09;144. 二叉树的前序遍历&#xff08;简单&#xff09;94. 二叉树的中序遍历&#xff08;简单&#xff09;145. 二叉树的后序遍历二叉树的统一遍历方法&#xff08;参考代码随想录&#xff09;&#xff08;中等&#xff09;102. 二叉树的层…

横岗茂盛村旧改,已立项,一期已拆平。

项目位于龙岗区横岗街道红棉路与茂盛路交汇处&#xff0c;距离轨道3号线横岗站约700米。 茂盛片区城市更新单元规划&#xff08;草案&#xff09;已经在近日公示&#xff0c;该旧改被纳入《2012年深圳市城市更新单元计划第五批计划》&#xff0c;2019年曾被暂停&#xff0c;20…

Redis实战14-分布式锁基本原理和不同实现方式对比

在上一篇文章中&#xff0c;我们知道了&#xff0c;当在集群环境下&#xff0c;synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢&#xff1f;我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。 我们先来回顾&#xff…

【深度学习】混合精度训练与显存分析

混合精度训练与显存分析 ​ 关于参数精度的介绍可以见文章https://zhuanlan.zhihu.com/p/604338403 相关博客 【深度学习】混合精度训练与显存分析 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是&#xff0c;我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

2023 更新版:苏生不惑开发过的那些原创工具和脚本

苏生不惑第431 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 4年来苏生不惑这个公众号已经写了400多篇原创文章&#xff0c;去年分享过文章更新版&#xff1a;整理下苏生不惑开发过的那些工具和脚本 &#xff0c;今年再更新下我开发过的原创工具…

【Python开发】FastAPI 07:Depends 依赖注入

在 FastAPI 中&#xff0c;Depends 是一个依赖注入系统&#xff0c;用于注入应用程序中所需的依赖项&#xff0c;通过 Depends&#xff0c;我们可以轻松地将依赖项注入到 FastAPI 路由函数中。简单来说&#xff0c;Depends 依赖注入的目的就是将代码重复最小&#xff01; 目录 …

Vue学习3

文章目录 Vuex工作原理配置环境各种函数mapState对象写法数组写法 MapGetterMapMutations对象写法数组写法 Mapaction总结 模块化模块化1总结 Vuex 工作原理 那三个要通过store管理 配置环境 使用import时&#xff0c;回先执行Import中的代码,在后面的也会提前。 index.js…