Go 常见 Test

89 阅读2分钟

本文翻译自我的英文博客,最新修订内容可随时参考:​​Go Common Test​

Go语言中的测试方法主要分为三种类型:单元测试、基准测试和示例测试。

首先:

  1. 你需要先导入​​testing​​包。
  2. 在包目录中,所有后缀为​​*_test.go​​的源代码文件都是go test测试的一部分,并且不会被go build编译到最终的可执行文件中。

单元测试

基本格式/签名为:

func TestXxx(t *testing.T) {
    // ...
}

将_test.go和.go文件放在同一目录下,运行​​go test -v​​可以详细执行测试,运行​​go test -cover​​可以检查测试覆盖率。

基准测试

基准测试默认不会执行,你需要使用​​go test -bench=Xxx​​来执行基准测试。

基本格式/签名为:

func BenchmarkXxx(b *testing.B) {
    for i := 0; i < b.N; i++ {
        // ...
    }
}

​b.N​​是测试运行的次数,这个值由go test工具自动调整。

BenchmarkSplit-8        10000000               215 ns/op
  • ​-8​​表示测试在8个GOMAXPROCS上运行
  • ​10000000​​表示测试运行了10000000次
  • ​215 ns/op​​表示每次操作平均耗时215纳秒

​go test -bench=Xxx -benchmem​​可以检查内存分配和每次操作的分配次数。

BenchmarkSplit-8        10000000               215 ns/op             112 B/op          3 allocs/op
  • ​112 B/op​​表示每次操作分配112字节
  • ​3 allocs/op​​表示每次操作分配3次

性能比较

// 注意:这里的n是Fib函数的参数,而不是b.N,b.N是测试运行的次数,由go test工具自动调整。
func benchmarkFib(b *testing.B, n int) {
    for i := 0; i < b.N; i++ {
        Fib(n)
    }
}

func BenchmarkFib1(b *testing.B)  { benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B)  { benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B)  { benchmarkFib(b, 3) }

​go test -bench=.​​会对所有以​​Benchmark​​为前缀的函数执行基准测试。

func BenchmarkSplit(b *testing.B) {
    time.Sleep(5 * time.Second) // 一些耗时操作
    b.ResetTimer()              // 重置计时器(忽略上面的时间)
    for i := 0; i < b.N; i++ {
        // 一些耗时操作
    }
}

// 你也可以使用这种方法

func BenchmarkSplit(b *testing.B) {
    b.StopTimer()
    // 一些耗时操作
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        // 一些耗时操作
    }
}

并行测试

签名:

func BenchmarkSplitParallel(b *testing.B) {
    // b.SetParallelism(1) // 设置使用的CPU数量
    b.RunParallel(func(pb *testing.PB) {
        for pb.Next() {
            // 一些耗时操作
        }
    })
}

示例测试

签名:

func ExampleName() {
    // 无参数和返回值
}