golang中testing包用于单元和基准测试,测试文件以_test.go结尾,测试函数以Test开头并接收*testing.T参数;通过go test命令运行测试,-v显示详情,-run按名称过滤测试;支持覆盖率分析,使用-go test -coverprofile生成数据,go tool cover -html查看HTML报告;基准测试以Benchmark开头,用-bench标志运行;推荐表格驱动测试结合t.Run实现子测试,可并行执行t.Parallel();t.Cleanup()用于注册测试后清理操作;掌握这些方法可提升测试效率与代码质量。

在golang中,testing 包是标准库中用于编写单元测试和基准测试的核心工具。它无需额外安装,配合 go test 命令即可运行测试。下面介绍常见的测试运行方法和技巧,帮助你高效使用 Golang testing 框架。
编写基本测试函数
测试文件以 _test.go 结尾,与被测代码放在同一包中。测试函数必须以 Test 开头,参数为 *testing.T。
例如,对 math.go 中的加法函数进行测试:
func Add(a, b int) int { return a + b }
对应测试文件 math_test.go:
立即学习“go语言免费学习笔记(深入)”;
func TestAdd(t *testing.T) {
if Add(2, 3) != 5 {
t.Errorf(“期望 5,实际 %d”, Add(2, 3))
}
}
运行测试的基本命令
使用 go test 命令运行当前目录下的所有测试:
go test
显示更详细输出(包括运行了哪些测试):
go test -v
只运行名称匹配某个模式的测试(如测试函数名包含 “Add”):
go test -run TestAdd
支持正则表达式,比如运行所有以 TestA 开头的测试:
go test -run ^TestA
测试覆盖率分析
Golang 支持生成测试覆盖率报告。使用以下命令生成覆盖率数据:
go test -coverprofile=coverage.out
生成 HTML 可视化报告:
go tool cover –html=coverage.out
直接查看覆盖率百分比:
go test -cover
按函数级别显示覆盖情况:
go test -cover -covermode=count -coverprofile=count.out
运行基准测试(Benchmark)
基准测试函数以 Benchmark 开头,接收 *testing.B 参数。例如:
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 1)
}
}
运行基准测试:
go test -bench=.
跳过普通测试,仅运行基准测试:
go test -run=^$ -bench=.
指定单次迭代目标时间(如每次运行 3秒):
go test -bench=. -benchtime=3s
子测试(Subtests)与表格驱动测试
推荐使用表格驱动测试来验证多种输入场景:
func TestAdd(t *testing.T) {
tests := []Struct {
name String
a, b, expect int
}{
{“2+3=5”, 2, 3, 5},
{“0+0=0”, 0, 0, 0},
{“负数测试”, -1, 1, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if Add(tt.a, tt.b) != tt.expect {
t.Errorf(“期望 %d,实际 %d”, tt.expect, Add(tt.a, tt.b))
}
})
}
}
可单独运行某个子测试:
go test -run TestAdd/负数测试
清理操作与测试并行执行
如果测试之间无依赖,可使用 t.Parallel() 并行运行:
func TestSomething(t *testing.T) {
t.Parallel()
// 测试逻辑
}
需要在测试结束时执行清理操作,使用 t.Cleanup():
func TestWithCleanup(t *testing.T) {
tempFile := createTempFile()
t.Cleanup(func() {
os.Remove(tempFile)
})
// 使用临时文件进行测试
} 基本上就这些常用方法。掌握 go test 的各种参数和 testing 包的特性,能大幅提升测试效率和代码质量。