go test随笔

313 阅读3分钟

go test 分为两种模式

本地目录模式

  • 命令:go testgo test -v
  • 工作流程:编译包源码,执行测试用例并输出结果(不会 cache 该结果)

包列表模式

  • 命令:go test mathgo test ./...go test .
  • 工作流程:编译每个包的源码然后逐个输出结果(如果某个包的测试结果之前 cache 过,则再次运行后会得到 cache 中的结果,当然也是有条件的,测试用例的二进制文件必须是相同的,而且使用的是 cacheable test flags,比如 -cpu, -list -parallel, -run, -short, and -v,如果存在非 cacheable test flag 的其他 test or non-test flag,则结果不会被 cache
  • 惯用的关闭缓存的方式是使用 -count=1

go test flags 详解

  • -bench

默认是不执行 benchmarks 的,执行所有 benchmarks 可用-bench .-bench=.

  • -benchtime

控制每 个benchmark 的运行时间,默认是1s,eg:-benchtime 1h30s,特殊语法 Nx 表示运行 benchmark N 次,eg:-benchtime 100x

  • -benchmem

打印基准测试的内存分配的统计信息

  • -count

运行每个 test and benchmark N 次,默认为1次,如果-cpu被设置,则表示每个 GOMAXPROCS 运行 N

  • -cover

开启覆盖率分析,由于go test -cover采用了一种编译前重写源代码的方式以注入埋点注释,所以如果有 test failures 的情况,则覆盖率会可能会不准确

  • -coverprofile

所 有test pass 后会将覆盖率分析数据写入文件,eg:go test -coverprofile=cover.out-coverprofile会自动启用覆盖率分析,不必再增加-cover。要研究这份数据的话,还需要借助一些工具。 将覆盖率按函数分解:go tool cover -func=cover.out 将覆盖率以html的方式展示:go tool cover -html=cover.out,将生成的html文件在浏览器中打开,可以看到3种颜色,已覆盖(绿色),未覆盖(红色)和 未埋点(灰色),通过这些手段可以轻易的看到哪些代码没有被覆盖到,然后增加测试用例以提高覆盖率

  • -covermode

覆盖率分析的模式:set、count、atomic,默认是set模式,表示每个语句是否都执行?count表示每个语句都执行了几次?atomic类似count,但表示的是并发程序中精确计数,同时也会带来昂贵的资源消耗。一般使用count就可以,工作速度和set模式相当。eg:go test -covermode=count -coverprofile=cover.out,然后执行go tool cover -html=cover.out,打开html文件,可以看到颜色的明暗变化,颜色越亮,表示执行次数越多,光标悬浮可以看到具体执行了多少次的tips。

  • -cpu

可以设置一组 GOMAXPROCS 的值,作用于 testsbenchmarks,默认使用环境变量中 GOMAXPROCS 的值

  • -cpuprofile

退出前将cpu的信息写入指定文件

  • -memprofile

test pass 后将内存分配信息写入指定文件

  • -mutexprofile

mutex 的争用情况写入指定文件

  • -outputdir

替换输出文件的指定目录,默认在 go test 命令的执行目录

  • -trace

输出 trace 信息到指定文件

  • -failfast

test failure 则快速中断

  • -parallel

允许并行执行 test functions,需要调用t.Parallel。默认并行数为 GOMAXPROCS 的值

  • -v

打印 t.Log or t.Logf 的结果

  • -vet

配置 go vet 检查项,eg: go test -vet all

  • -timeout

设置 tests 执行的超时时间,默认10m,设置为0表示关闭超时设置,如果tests执行的时间超过设置的时间,则会直接报 panic

  • -blockprofile

将阻塞的 goroutine 信息写入指定文件