测试相关函数

golang测试相关函数 #

test函数的种类 #

  • func TestXxx(t *testing.T) { ... }
    • 注意下这个Xxx需要大写
  • func BenchmarkXxx(b *testing.B) { ... }
    • 注意下这个Xxx需要大写
  • ExampleXxx
    • prints output to os.Stdout
    • “Output:”
    • “Unordered output:”

go help testfunc

go test命令 #

测试结果输出结果:test status ('ok' or 'FAIL') package name elapsed time

  • go test [build/test flags] [packages] [build/test flags & test binary flags]
    • 当前目录模式: 如果当前没有go.mod,那么会自动生成 一个临时_path:_/tmp/hello
      • go test
      • go test -v
    • 包列表模式
      • go test <module name>
      • go test .
      • go test ./...
        • 打印更详细的信息
          • go test -v .
          • go test -bench .

go help test

运行文件的单个测试单元 #

  • 运行某个test文件的某个test例子。
    • go test -v -run="Regrex$" main_test.go
// tree

.
├── go.mod
├── main.go
└── main_test.go

0 directories, 3 files

// cat main_test.go
package hello

import (
	"testing"
	"time"
)

func TestHello(t *testing.T) {
    want := "Hello, world."
    if got := Hello(); got != want {
        t.Errorf("Hello() = %q, want %q", got, want)
    }
    time.Sleep(time.Second)

}

func TestRegrex(t *testing.T) {
    want := "Hello, world. --- regrex"
    if got := Hello(); got != want {
        t.Errorf("Hello() = %q, want %q", got, want)
    }
    time.Sleep(time.Second)

}

// cat go.mod
module example.com/hello

go 1.13

测试过程

benchmark #

  • go test 命令默认不运行 benchmark 用例的,如果我们想运行 benchmark 用例,则需要加上-bench参数。

    • -bench参数支持传入一个正则表达式,匹配到的用例才会得到执行。
    • -cpu
      • GOMAXPROCS,默认等于 CPU 核数。可以通过 -cpu 参数改变 GOMAXPROCS,-cpu 支持传入一个列表作为参数
  • 提升测试准确度的一个重要手段就是增加测试的次数。

    • 我们可以使用-benchtime-count两个参数达到这个目的.
      • -benchtime的默认时间是 1s,那么我们可以使用-benchtime指定为 5s.
        • 还可以是具体的次数。-benchtime=30x(执行30次)
      • -count 参数可以用来设置 benchmark 的轮数。例如,进行 3 轮 benchmark。
    • -benchmem参数可以度量内存分配的次数。

基准测试的测试次数 #

b *testing.B,有个属性 b.N 表示这个用例需要运行的次数。b.N 对于每个用例都是不一样的。

那这个值是如何决定的呢?b.N 从 1 开始,如果该用例能够在 1s 内完成,b.N 的值便会增加,再次执行。b.N 的值大概以 1, 2, 3, 5, 10, 20, 30, 50, 100 这样的序列递增,越到后面,增加得越快。

精确 #

  • ResetTimer
func BenchmarkFib(b *testing.B) {
	time.Sleep(time.Second * 3) // 模拟耗时准备任务
	b.ResetTimer() // 重置定时器
	for n := 0; n < b.N; n++ {
		fib(30) // run fib(30) b.N times
	}
}
  • StopTimer & StartTimer

附录 #