go test
用法:go test [build/test flags] [packages] [build/test flags & test binary flags]
go test
自动测试通过导入路径命名的包。命令按下面的格式打印测试结果的概要:
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...
之后是每个失败的包的详细输出。
go test
重新编译每个包以及所有名字匹配 “*_test.go” 的文件。这些额外的文件可以包含测试函数,基准测试函数和示例函数。查看 go help testfunc
获取更多信息。每个列举的包执行一个单独的二进制测试。忽视以 “_” (包括 “_test.go”) 或 “.” 开始的文件。
声明了后缀为 “_test” 的包的测试文件会作为一个单独的包被编译,然后被主二进制测试链接和运行。
go tool
会忽视 “testdata” 命名的目录,使得可以包含测试所需的辅助数据。
作为编译一个二进制测试的一部分,go test
在包及其测试源文件上运行 go vet
以识别显著的问题。如果 go vet
发现任何问题,go test
报告这些问题并且不再运行二进制测试。只使用了默认 go vet
检查的高可信度的子集。这些子集包括:atomic、bool、buildtags、nilfunc 和 printf。你可以通过 go doc cmd/vet
查看他们的文档以及其他的 vet 测试。使用 -vet=off 标识禁用 go vet
的运行。
即使测试打印输出到它自己的标准错误,所有的测试输出和总结行会被打印到 go 命令的标准输出。(保留 go 命令的标准错误用于打印编译这些测试的错误。)
go test
运行包括两种模式:
- 叫做本地目录模式。当调用
go test
不带包参数时发生(如go test
或go test -v
)。在这种模式,go test
在当前目录找到的包源文件和测试文件,然后运行生成的二进制测试。在这种模式,禁用缓存(后面会讨论)。包测试结束之后,go test
打印一个总结行显示测试状态(“ok” 或 “FAIL”)、包名和用时。 - 叫做包列表模式。当调用
go test
携带显式的包参数时发送(如go test math
、go test ./...
甚至go test ..
)。在这种模式,go test
编译和测试命令行列举的每个包。如果一个包测试通过,go test
只打印最后的 “ok” 总结行。如果一个包测试失败,go test
打印完整的测试输出。如果调用时携带 -bench 或 -v 标识,go test
也会为通过测试包打印完整的输出,以显示请求的基准测试结果或错误日志。当所有列举的包测试结束且打印了他们的输出之后,如果任何一个包测试失败,go test
打印一个最终的 “FAIL” 状态。
只有在包列表模式,go test
会缓存成功的包测试结果以避免不必要的重复运行测试。当一个测试的结果可从缓存中恢复时,go test
会再次显示之前的输出而不是再次运行二进制测试。这时,go test
打印 “(cached)” 取代总结行中的用时。
缓存匹配的规则是 go 命令调用相同的二进制测试,且命令行标识完全来自受限的可缓存的测试标识集合,被定义为 -cpu、-list、-parallel、-run、-short 和 -v。如果允许一次 go test
包含任何这个集合之外的测试标识或非测试标识,结果都是不可缓存的。要禁用测试缓存,使用除了可缓存的标识以外的任意的测试标识或参数。惯用的显式禁用测试缓存的方法是使用 -count=1。打开在包的源根(通常是 $GOPATH)或者查询环境变量的测试只有在这些文件和环境变量不改变时才会与之后的运行匹配。一个缓存的测试结果被视为立刻执行,因此无论如何设置 -timeout,一个成功的包测试结果会被缓存且重用。
除了编译标志,go test
专属的标识包括:
- args:传递命令行的剩余部分(-args 之后的所有)给二进制测试,不解释且不修改。因为这个标识使用了命令行的剩余部分,包列表(如果有)必须出现在这个标识之前。
- -c:编译二进制测试为 pkg.test 但不要运行(pkg 是包导入路径的最后一个元素)。文件名可以使用 -o 标识修改。
- -exec xprog:使用 xprog 运行二进制测试。这个行为和
go run
相同。查看go run
获取更多信息。 - -i:安装测试的依赖包。不要运行测试。
- -json:将测试输出转化为 JSON 用于自动处理。查看
go doc test2json
获取编码信息。 - -o file:编译二进制测试到指定名称的文件。测试仍然运行(除非指定 -c 或 -i)。
二进制测试也接收控制测试执行的标识;这些标识也可被 go test
访问。查看 go help testflag
获取更多信息。
需要更多关于编译标识,查看 go help build
。需要更多关于指定包的,查看 go help package
。
查看其他:go build
、go vet