如何编写和运行go语言单元测试?

单元测试可以帮助开发者及时发现代码中的错误,提高代码质量,当代码库变更时,单元测试可以快速发现新引入的回归错误;在 Go 语言中,单元测试是确保代码质量和稳定性的重要工具。Go 提供了一个强大的 testing 包,使得编写和运行测试变得高效而简便。

Golang 单元测试基础

在 Go 中,测试函数以 TestXxx 命名,其中 Xxx 是测试函数的名称,必须以大写字母开头。这些测试函数会被 go test 命令自动执行。以下是一个基本的测试函数示例:

package absimport "testing"// TestAbs 测试 Abs 函数的行为
func TestAbs(t *testing.T) {got := Abs(-1)if got != 1 {t.Errorf("Abs(-1) = %d; want 1", got)}
}

Golang 单元测试文件的组织

为了使测试与生产代码分开,Go 要求将测试代码放在单独的文件中。这些文件的名称必须以 _test.go 结尾。例如,如果我们正在测试一个名为 abs 的包,那么测试文件应该命名为 abs_test.go。

同包测试

如果测试文件和被测试的代码在同一个包中,那么测试文件可以访问该包的未导出的标识符。这使得测试可以更细粒度地检查包的内部实现。以下是一个同包测试的例子:

package absimport "testing"// TestAbs 测试 Abs 函数的行为
func TestAbs(t *testing.T) {got := Abs(-1)if got != 1 {t.Errorf("Abs(-1) = %d; want 1", got)}
}

测试文件与被测试的包处于同一目录下时,可以直接调用 Abs 函数,即使它是未导出的。

黑盒测试

如果测试文件和被测试的代码在不同的包中,测试文件必须显式导入被测试的包,并且只能访问其导出的标识符。这种测试方式被称为“黑盒测试”,因为测试者不需要了解被测试包的内部实现细节。以下是一个黑盒测试的例子:

package abs_testimport ("testing""path_to_pkg/abs"
)// TestAbs 测试 Abs 函数的行为
func TestAbs(t *testing.T) {got := abs.Abs(-1)if got != 1 {t.Errorf("Abs(-1) = %d; want 1", got)}
}

在这段代码中,测试文件位于一个不同的包 abs_test 中,我们通过导入 abs 包来访问其导出的函数。

基准测试(Benchmarks)

基准测试用于测量代码的性能。基准测试函数以 BenchmarkXxx 命名,其中 Xxx 是基准测试函数的名称,必须以大写字母开头。基准测试函数的参数是 *testing.B 类型。基准测试函数的目标是运行代码 b.N 次,以确保性能测量的可靠性。以下是一个基准测试的示例:

package absimport ("math/rand""testing"
)// BenchmarkRandInt 基准测试 rand.Int 的性能
func BenchmarkRandInt(b *testing.B) {for i := 0; i < b.N; i++ {rand.Int()}
}

BenchmarkRandInt 用于测试rand.Int 函数的性能。基准测试会多次运行,直到测试时间足够长以提供可靠的结果。测试输出会显示每秒执行的次数以及每次操作的平均时间,例如:


BenchmarkRandInt-8   	68453040	        17.8 ns/op

这表示循环运行了 68,453,040 次,每次操作的时间为 17.8 纳秒。

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

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

相关文章

淘宝/天猫按图搜索商品:taobao.item_search_img API的奇幻之旅

在这个看脸的时代&#xff0c;我们不仅对人要看颜值&#xff0c;连买东西都要“看脸”了。没错&#xff0c;我说的就是淘宝/天猫的按图搜索商品功能——taobao.item_search_img API。这个功能就像是电商平台的“人脸识别”&#xff0c;只不过它认的是商品的颜值。下面&#xff…

hive表批量造数据

目录 1 . 使用 INSERT INTO 从已有表批量插入数据2. 使用 INSERT OVERWRITE 从文件或目录导入数据3. 使用 Hive 中的 SELECT 语句生成数据4. 使用 RAND() 或 UUID() 生成随机数据5. 使用 hive 的自定义 UDF 生成批量数据6. 使用 Python 脚本结合 Hive 进行数据生成7. 使用 hive…

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析&#xff0c;特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力&#xff0c;以对象为为驱动的模型&#xff0c;主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

通过vmware虚拟机安装和调试编译好的 ReactOS

1. 首先创建 VMware 虚拟机配置脚本 setup_vmware.bat&#xff1a; batch echo off :: setup_vmware.bat :: 设置路径 set "REACTOS_BUILDE:\Reactos_WinDriver\reactos-master\build" set "VM_PATHE:\VMs\ReactOS_Debug" set "VMWARE_PATHC:\Progr…

STM32F405RGT6单片机原理图、PCB免费分享

大学时机创比赛时画的板子&#xff0c;比到一半因为疫情回家&#xff0c;无后续&#xff0c;&#xff0c;&#xff0c;已打板验证过&#xff0c;使用stm32f405rgt6做主控 下载文件资源如下 原理图文件 pcb文件 外壳模型文件 stm32f405例程 功能 以下功能全部验证通过 4路…

写一个记录函数执行时间的装饰器

装饰器&#xff0c;这可是Python开发中绕不开的经典话题&#xff0c;不论你是写代码的老手&#xff0c;还是刚入行的萌新&#xff0c;都得和它打上几轮交道。而记录函数执行时间这个功能&#xff0c;更是装饰器中的“常客”。 今天我就带大家来全面解锁一下这块儿的知识&#…

手机发展史介绍

手机&#xff0c;这个曾经在电影和科幻小说中出现的高科技产品&#xff0c;如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端&#xff0c;手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…

声纹识别好用的模型:speechbrain/spkrec-ecapa-voxceleb

speechbrain/spkrec-ecapa-voxceleb 是一个非常强大的声纹识别模型&#xff0c;基于 ECAPA-TDNN&#xff08;Enhanced Context-Dependent Adversarial Time Delay Neural Network&#xff09;&#xff0c;并使用了 VoxCeleb 数据集进行训练。它在声纹识别任务中表现非常出色&am…

Python 桌面应用开发:使用 Tkinter 创建 GUI 应用程序

Python 桌面应用开发&#xff1a;使用 Tkinter 创建 GUI 应用程序 引言 随着计算机技术的飞速发展&#xff0c;桌面应用程序依然在许多领域中发挥着重要作用。Python 作为一种强大的编程语言&#xff0c;提供了多种工具和库来创建桌面应用程序。其中&#xff0c;Tkinter 是 P…

第 2 章 - Go语言环境搭建

安装Go语言 下载Go&#xff1a; 访问Go的官方网站&#xff08;https://golang.org/dl/&#xff09;。根据你的操作系统&#xff08;Windows、Linux、macOS等&#xff09;选择合适的安装包进行下载。 安装Go&#xff1a; 对于Windows用户&#xff0c;运行下载的.msi文件&#x…

2021 NOIP 题解

21年的题有点难啊&#xff08;除了T1&#xff09;&#xff0c;竟然没绿题&#xff0c;直接紫题黑题。 T1 P7960 [NOIP2021] 报数 原题链接 这道题还是挺水的。 因为是多组询问&#xff0c;首先预处理出答案&#xff0c;然后 O ( 1 ) O(1) O(1)查询。 在 O ( l o g n ) O(lo…

vue3入门知识(一)

vue3简介 性能的提升 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 新的特性 1. Composition API&#xff08;组合API&#xff09; setupref与reactivecomput…

AI与就业:技术革命下的职业转型与挑战

内容概要 在当今时代&#xff0c;人工智能的迅猛发展正在深刻影响着我们的就业市场。这一技术革命不仅让我们看到了未来的职业转型&#xff0c;还引发了对于新兴技能需求的深思。随着AI技术的普及&#xff0c;许多传统行业面临着巨大的变革压力&#xff0c;同时也为新兴领域创…

软件测试基础十九 (接口相关知识详解)

接口相关知识详解 一、接口概述 &#xff08;一&#xff09;接口定义 接口是指系统或组件之间的交互点&#xff0c;是实现数据交互的通道。它就像是不同部分之间沟通的桥梁&#xff0c;使得数据能够在各个系统或组件之间顺畅地流动。 &#xff08;二&#xff09;接口的类型…

基于SSM(Spring + Spring MVC + MyBatis)框架开发的电能计量与客服服务管理系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架开发的电能计量与客服服务管理系统&#xff0c;旨在提高电力公司的运营效率和服务质量。该系统可以涵盖电能数据采集、客户信息管理、账单管理、客户服务等多个方面。下面是一个详细的实现方案&#xff0c;包括…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

Uubntu下的Boost库安装及使用

一、Boost库介绍 Boost库是为C语言标准库提供扩展的一些C程序库的总称。 Boost库由Boost社区组织开发、维护。其目的是为C程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C标准库共同工作&#xff0c;并且为其提供扩展功能。Boost库使用Boost License来授权使用&…

AIoT的协同计算

目录 AIoT的协同计算 一、背景与意义 二、原理与方法 三、关键技术与挑战 四、应用与实践 AIoT的协同计算 一、背景与意义 随着物联网和人工智能技术的快速发展,智能物联网(AIoT)成为了一个新兴的前沿领域。在这个领域中,多移动终端设备如智能手机、可穿戴设备、无人…

Rust里面针对Option和Result的and_then和map有什么区别

在 Rust 中&#xff0c;Option 和 Result 类型都提供了 map 和 and_then 方法&#xff0c;用于处理可能存在的值或错误。虽然它们都可以用于转换值&#xff0c;但它们的行为和用途有所不同。下面我将详细比较 map 和 and_then 的使用和区别。 map 方法 定义 map 方法用于对 …

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计&#xff08;MLE&#xff09; 二、最大后验估计&#xff08;MAP&#xff09; 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时&#xff0c;MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频&#xff1a; 贝叶斯解释“L1和L2正则化”&#xff…