Go语言测试与调试:单元测试与基准测试

143 阅读2分钟

以下是《Go语言实战指南》中关于 测试与调试:单元测试与基准测试 的详细内容,涵盖测试编写、运行、覆盖率分析与性能测试,适用于实际项目开发与性能优化阶段。

一、Go 的测试体系概览

Go 提供原生的测试工具包 testing,无需第三方框架,即可实现:

  • • ✅ 单元测试(Unit Test)
  • • ✅ 基准测试(Benchmark)
  • • ✅ 示例测试(Example)

运行测试命令:

go test                # 运行所有测试
go test -v             # 显示详细信息
go test -cover         # 查看覆盖率
go test -bench=.       # 运行所有基准测试

二、编写单元测试

1. 创建测试文件

测试文件需以 _test.go 结尾,如:math_test.go

2. 编写测试函数

测试函数以 TestXxx(t *testing.T) 命名,必须以大写 Test 开头。

// math.go
package mymath

func Add(a, b int) int {
    return a + b
}
// math_test.go
package mymath

import "testing"

func TestAdd(t *testing.T) {
    result := Add(23)
    if result != 5 {
        t.Errorf("Expected 5, got %d", result)
    }
}

3. 多组用例可使用表驱动测试

func TestAddCases(t *testing.T) {
    cases := []struct {
        a, b int
        want int
    }{
        {123},
        {000},
        {-110},
    }

    for _, c := range cases {
        got := Add(c.a, c.b)
        if got != c.want {
            t.Errorf("Add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)
        }
    }
}

三、基准测试(Benchmark)

用于评估函数性能(耗时、吞吐量等)。

1. 编写基准测试函数

以 BenchmarkXxx(b *testing.B) 命名。

func BenchmarkAdd(b *testing.B) {
    for i := 0i < b.Ni++ {
        Add(12)
    }
}

运行:

go test -bench=.

输出类似:

BenchmarkAdd-8       1000000000             0.34 ns/op

b.N 是自动设定的运行次数,确保结果稳定。

2. 重置计时器

用于排除初始化干扰:

func BenchmarkHeavy(b *testing.B) {
    // 初始化
    data := make([]int10000)
    b.ResetTimer() // 重置计时器

    for i := 0; i < b.N; i++ {
        _ = process(data)
    }
}

四、测试覆盖率分析

go test -coverprofile=cover.out
go tool cover -func=cover.out        # 命令行查看函数级别覆盖率
go tool cover -html=cover.out        # 生成HTML覆盖率报告

五、测试技巧与建议

技巧描述
表驱动测试编写多组用例,提高测试可读性与扩展性
子测试(t.Run)支持结构化、并发测试子用例
覆盖边界条件零值、负数、空输入等情况需覆盖
Mock 外部依赖可使用接口和伪造实现来隔离测试逻辑(如数据库、网络)
并发安全测试可通过 -race 选项检测数据竞争:go test -race

六、推荐:结合 CI/CD 自动测试

可将 go test 与 go vetgolint 等组合进 CI 流程(GitHub Actions、GitLab CI):

go fmt ./...
go vet ./...
go test -v ./...

七、小结

类型关键函数命令
单元测试TestXxx(t *testing.T)go testgo test -v
基准测试BenchmarkXxx(b *testing.B)go test -bench=.
覆盖率分析-go test -cover-coverprofile
并发检测-go test -race