Go 单元/模糊/基准测试

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

最佳实践

  1. 单元测试:覆盖所有分支逻辑,结合表格驱动测试提高覆盖率。
  2. 基准测试:关注 ns/op 和内存分配,优化高频调用代码。
  3. 模糊测试:针对复杂输入的函数(如解析器),设置合理的 -fuzztime
滚动至顶部