Go 语言提供了丰富的测试工具,包括单元测试、模糊测试和基准测试(Benchmark),它们分别用于验证代码的正确性、发现边缘用例和评估性能。以下是它们的详细说明和使用方法:
1. 单元测试(Unit Testing)
作用:验证代码的最小单元(如函数、方法)是否符合预期行为。
特点:
- 测试文件以
_test.go
结尾,函数名以Test
开头,参数为*testing.T
。 - 支持子测试(
t.Run
)和表格驱动测试(Table-Driven Tests)。 - 可通过
-cover
参数生成代码覆盖率报告。
示例:
func TestAdd(t *testing.T) {
if add(1, 2) != 3 {
t.Error("1 + 2 did not equal 3")
}
}
常用命令:
go test -v ./... # 运行所有测试并显示详情
go test -cover # 输出覆盖率
go test -run TestAdd # 仅运行特定测试
2. 基准测试(Benchmark)
作用:测量代码性能(如执行时间、内存分配)。
特点:
- 函数名以
Benchmark
开头,参数为*testing.B
,需包含for i := 0; i < b.N; i++
循环。 - 支持并行测试(
b.RunParallel
)和内存分析(-benchmem
)。
示例:
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
add(1, 2)
}
}
常用命令:
go test -bench . -benchmem # 运行基准测试并显示内存分配
go test -benchtime=2s # 指定测试时长
3. 模糊测试(Fuzz Testing)
作用:通过随机输入发现代码中的边缘错误。
特点:
- 函数名以
Fuzz
开头,参数为*testing.F
,需定义种子语料库(f.Add
)和模糊目标。 - 自动生成输入并最小化失败用例。
示例:
func FuzzAdd(f *testing.F) {
f.Add(1, 2)
f.Fuzz(func(t *testing.T, a, b int) {
_ = add(a, b) // 验证随机输入是否引发错误
})
}
常用命令:
go test -fuzz FuzzAdd -fuzztime=10s # 运行模糊测试10秒
对比总结
测试类型 | 目的 | 函数前缀 | 参数类型 | 关键参数 |
---|---|---|---|---|
单元测试 | 验证逻辑正确性 | Test | *testing.T | -run , -cover |
基准测试 | 测量性能 | Benchmark | *testing.B | -bench , -benchmem |
模糊测试 | 发现边缘错误 | Fuzz | *testing.F | -fuzz , -fuzztime |
最佳实践
- 单元测试:覆盖所有分支逻辑,结合表格驱动测试提高覆盖率。
- 基准测试:关注
ns/op
和内存分配,优化高频调用代码。 - 模糊测试:针对复杂输入的函数(如解析器),设置合理的
-fuzztime
。