Z
ZHANK
工程化

测试与基准

_test.go、TestXxx 函数、表驱动测试、go test -bench

测试与基准

Go 测试零依赖——标准库 testing 包搞定一切。表驱动测试是 Go 社区的标志性实践。

学完本章你将: 掌握 _test.go、TestXxx、表驱动测试、go test -bench。


测试文件约定

go
// math_test.go(和 math.go 同目录)
package math

import "testing"

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("Add(2,3) = %d; want 5", result)
    }
}
bash
go test           # 运行所有测试
go test -v        # 详细输出
go test -run TestAdd  # 运行特定测试
go test -cover    # 测试覆盖率

表驱动测试(Go 的测试美学)

go
func TestDivide(t *testing.T) {
    tests := []struct {
        name string
        a, b float64
        want float64
        wantErr bool
    }{
        {"正常除法", 10, 2, 5, false},
        {"除零", 10, 0, 0, true},
        {"零除以某数", 0, 5, 0, false},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got, err := Divide(tt.a, tt.b)
            if (err != nil) != tt.wantErr {
                t.Errorf("Divide() error = %v", err)
                return
            }
            if got != tt.want {
                t.Errorf("Divide() = %v, want %v", got, tt.want)
            }
        })
    }
}

基准测试

go
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {  // b.N 自动调整
        Add(2, 3)
    }
}
bash
go test -bench=.
go test -bench=. -benchmem  # 同时显示内存分配