1. 命名规则
- 可以通过以下命令查看go test命令的帮助文档:
$ go help test
- 执行
go test
命令,它会在*_test.go
中寻找 test 测试、benchmark 基准 和 examples 示例 函数。
- 测试函数必须以
TestXXX
的函数名出现(XXX 为以非小写字母开头) - 基准函数必须以
BenchmarkXXX
的函数名出现 - 示例函数必须以
ExampleXXX
的形式。
- 具体的规则可以通过以下命令,进行具体查看:
$ go help testfunc
2. 两种模式
go test
命令有两种模式:本地目录模式和包列表模式。- 本地目录模式:
- 当
go test
命令没有任何package参数时,例如go test
或go test -v
。 go test
命令会编译在当前目录下找到的*_test.go
文件,然后运行test的二进制文件。- 最后,会打印test的结果(
ok
或者FAIL
)、包名、运行时间。
ok archive/tar 0.011s
FAIL archive/zip 0.022s
- 包列表模式:
- 需要为
go test
命令明确指定package参数,例如go test math
、go test ./....
(运行当前目录下所有的package)等。 - 运行过程与本地目录模式一致。
- 如果只是包列表模式系统会自动缓存成功的package测试结果,下次执行时会自动重放以前的输出,而不是重新执行test的二进制文件。这时,运行时间会被
(cached)
取代。
3. 缓存的关闭
- 以下参数都是可以进行缓存的:
- -cpu
- -list
- -parallel
- -run
- -short
- -v
- 最开始的时候我就因为
go test
命令执行的是缓存结果,天真的以为自己的test通过了。 - 后来被小伙伴告知有错误,自己都傻眼了,明明是ok啊 😂
- 可以通过使用
-count=1
关闭缓存,可以发现两次的运行时间发生了变化。
4. 添加打印输出
- 在撰写Test函数时,我明明写了
fmt.Printf("Create contract %d on channel %s ...\n", m, channel)
这样的话,帮助我判断test的执行情况啊。 - 一旦告诉我
FAIL
我去哪里找原因啊。。。 - 后来,通过查阅资料,发现有一个
-v
参数,可以打印具体的信息。
- 加上
-v
参数以后,成功打印信息。
5. go test并发执行多个package
- 自己撰写了很多package分别用于测试不同的情况,单独测试每个package完全没压力啊,轻松过。
- 一旦通过他们的上级目录,执行
go test
命令,就乱套了。各种错误,啥子明明路径对的,结果说文件找不到;明明自己进行了相对路径改绝对路径的,咋个说没改呢???
$ go test -v -count=1 madledger/lucytest/...
- 后来和清华小伙伴猜测了原因,
go test
命令可能并行执行了package,这其实也是我想的原因,不然咋个这么神奇的错误。 - 为了撰写该博文,我发现
go help testflag
中,竟然有提示说go test
命令会并行执行。都怪自己都是以使用为主,那个不会查哪个。。。。
- 解决办法: 小伙伴的学弟说,可以加上
-p 1
参数,让go test
命令并行执行每个package。
$ go test -cover -count=1 -p 1 madledger/lucytest/...
6. cover参数
- 我发现小伙伴写的命令中,有
-cover
参数,通过以下命令知道了该参数的作用,该命令还展示了go test
其他很多参数。
$ go help testflag
-cover
参数的描述:开启覆盖分析,开启覆盖分析可能会在编译或测试失败时,会报告代码行数不对。
参考博客:
Go 测试,go test 工具的具体指令 flag
Go test 命令工作原理
Go test 命令行参数