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

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

Golang 单元测试基础

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

go 复制代码
package abs

import "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。

同包测试

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

go 复制代码
package abs

import "testing"

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

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

黑盒测试

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

go 复制代码
package abs_test

import (
    "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 次,以确保性能测量的可靠性。以下是一个基准测试的示例:

go 复制代码
package abs

import (
    "math/rand"
    "testing"
)

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

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

shell 复制代码
BenchmarkRandInt-8   	68453040	        17.8 ns/op

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

相关推荐
jieyucx2 小时前
Go语言深度解剖:Map扩容机制全解析(增量扩容+等量扩容+渐进式迁移)
开发语言·后端·golang·map·扩容策略
王码码20352 小时前
Go语言的内存管理:原理与实战
后端·golang·go·接口
~|Bernard|6 小时前
一.go语言中slice底层原理(2026-5-7)
golang·go
~|Bernard|9 小时前
二.go语言中map的底层原理(2026-5-8)
算法·golang·哈希算法
平凡但不平庸的码农9 小时前
Go 错误处理详解
开发语言·后端·golang
汽车仪器仪表相关领域10 小时前
Kvaser Air Bridge Light HS:免配置工业级无线 CAN 桥接器,70 米稳定传输,移动设备与动态场景的 CAN 互联理想之选
人工智能·功能测试·安全·单元测试·汽车·可用性测试
web守墓人12 小时前
【go语言】go语言实现go-torch, 完成Lenet-5的搭建,训练,以及pth和onnx模型导出
开发语言·后端·golang
平凡但不平庸的码农12 小时前
Go 语言常用标准库详解
开发语言·后端·golang
平凡但不平庸的码农13 小时前
Go context 包详解
开发语言·后端·golang
QH1392923188014 小时前
罗德与施瓦茨 FSW26 FSW43 FSW50高端信号分析仪
网络·功能测试·单元测试·集成测试·模块测试