当前位置: 首页 > news >正文

如何编写和运行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.mrgr.cn/news/69256.html

相关文章:

  • 学Linux的第八天
  • [论文笔记]An LLM Compiler for Parallel Function Calling
  • JWT 过期后 自动刷新方案
  • 对接钉钉审批详情
  • linux逻辑卷练习
  • AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案
  • day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
  • 《手写Spring渐进式源码实践》实践笔记(第十七章 数据类型转换)
  • Linux网络管理和修改配置文件
  • 《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑
  • Pycharm,2024最新版Pycharm下载安装配置教程!
  • 【划分型 DP-最优划分】力扣2707. 字符串中的额外字符
  • C#(asp.net)民宿客房管理系统-计算机设计毕业源码76233
  • Leetcode刷题Python之3242.设计相邻元素求和服务
  • 不同系统,单点登录实现解决方案,一次登录多系统验证!
  • AHB Matrix 四星级 验证笔记(2.4) Tt3.3AHB总线协议测试时的 并行数据
  • 更改Ubuntu22.04锁屏壁纸
  • U盘@购买攻略@检测工具@扩容检测
  • 大数据面试题--kafka夺命连环问
  • 周末适合做一些总结性的工作,不适合开启新的探索性的任务
  • 【JavaEE初阶 — 多线程】死锁的产生原因和解决方法
  • 【51单片机】UART串口通信原理 + 使用
  • Spring Security(5.x, 6.x ) RBAC访问控制
  • 数据冒险-ld,ld,dadd
  • requestAnimationFrame与setInterval的抉择
  • 银行卡归属地查询API接口如何用Python调用