go test 分为两种模式
本地目录模式
- 命令:
go test或go test -v等 - 工作流程:编译包源码,执行测试用例并输出结果(不会 cache 该结果)
包列表模式
- 命令:
go test math或go 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 的值,作用于 tests 或 benchmarks,默认使用环境变量中 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 信息写入指定文件