go test

语法:

go test [build/test flags] [package] [build/test flags && test binary flags]

test flag

go help testflag

  • -bench 指定运行的基准测试,默认不进行基准测试,常用-bench=.来运行所有的基准测试
  • -benchtime 指定每个基准测试运行的时间,默认是1s,例如-benchtime=3s制定每个基准测试运行3s,也可以通过Nx的方式来指定基准测试运行的次数,例如-benchtime=10x表示每个基准测试运行10次,这里的N对应基准测试的b.N
  • -count 指定执行测试的次数,默认执行1次,如果设置了-cpu指定GOMAXPROCS,那么对指定的cpu数测试n次。
  • -cpu 1,2,4指定一个或多个GOMAXPROCS来进行测试
  • -cover 是否显示测试覆盖率,默认是不显示,通过-cover=true开启显示
  • -covermode 指定测试覆盖率的模式,count:统计代码访问次数;set:统计代码是否被访问;atomic:一般在并发工程中使用
    *-coverpkg 指定要统计覆盖率的包 ./…表示当前目录下的所有包
  • -failfast 一个测试用例失败后,不进行下面的测试
  • -list
  • -parallel 运行在测试用例中条用t.Parallel来进行并发测试,-parallel可以指定并发的数量,默认是与GOMAXPROCS一致
  • -run 指定运行的单元测试,例如-run=TestA来指定运行TestA测试
  • -short
  • -timeout 指定超时时间
  • -v 打印详细信息
  • -vet 检查静态错误
  • -benchmem 在执行基准测试时打印内存分配信息
  • -blockprofile 将goroutine阻塞信息写入文件
  • -coverprofile 将测试覆盖率信息写入文件
  • -memprofile 将内存分配信息写入文件
  • -memprofilearate 更精准的内存分配信息
  • -mutexprofile 锁信息
  • -mutexprofilefraction
  • -outputdir 输出文件的目录
  • -trace 写入trace信息

常用用法:

1.单元测试
func TestRandomString(t *testing.T){
	str:=RandomString(32)
	t.log(str)
}

go test -v -run ^TestRandomString$ ./…
-v 打印详细信息
-run 指定要进行的单元测试用例

2.基准测试
func BenchmarkRandomString(b *testing.B){
	// do something
	b.ReserTimer()
	for i:=0;i<b.N;i++{
		RandomString(32)
	}
	b.StopTimer()
	// do something
}

go test -bench . -run=none -benchtimes=2s -cpu=1,2,4 -count=2 -benchmem

-run=none 只运行基准测试
-benchtimes=2s 每个基准测试运行2s
-cpu=1,2,4 运行在GOMAXPROCS分别为1,2,4的情况下进行基准测试
-count=2 分别在1,2,4的cpu下分别跑两次基准测试
-benchmem 输出内存分配信息

3.并发基准测试
func BechmarkRandomString2(b *testing.B){
	b.RunParallel(func(pb *testing.PB){
		for pb.Next(){
			RandomString(32)
		}
	})
}

go test -bench . -run=none
RunParallel创建多个goroutinue然后把b.N个迭代测试分布到这些goroutine上。goroutinue的数目默认是GOMAXPROCS,如果要增加non-COU-bound的benchmark的并发个数,在执行RunParallel之前调用SetParallelism。

4.测试覆盖率

go test -cover -covermode=count -coverpkg ./… -coverprofile=out.cov .
统计当前目录下的包的测试覆盖率,并生成文件
go tool cover -html=out.cov
使用网页的方式查看测试覆盖率(推荐)
go tool cover -func=out.cov