Go 工具链详解(三): 代码测试神器 go test

go test 作用

go test 是 Go 工具链中的一个命令,用于编译和运行按照要求编写的 Golang 测试代码,并生成测试报告。

要求将测试代码所在的文件命名为 *_test.go,如此命名的文件不会被 go build 命令编译,但是会被 go test 进行编译和运行。在 *_test.go 中有几种类型的函数:

  1. 单元测试函数:以 Test 为函数名的前缀,用于测试程序的逻辑行为,参数必须是t *testing.T,无返回值。
  2. 基准测试函数:以 Benchmark 为函数名的前缀,用于测试程序的性能,参数必须是 b *testing.B,无返回值。
  3. 模糊测试函数:以 Fuzz 为函数名的前缀,用于测试程序的健壮性,参数必须是 f *testing.F,无返回值
  4. 示例函数:以 Example 为函数名的前缀,用于提供示例文档,没有参数和返回值。

go test 使用方法和使用示例

go test 的使用方法比较简单,在项目的根目录或者某个包下直接运行如下命令:

go test 

go test 将会编译和运行当前项目或者当前包下所有的测试代码,并输出测试结果。

可以通过指定包或测试文件的路径来运行特定的测试,可以指定多个,也可以使用通配符进行匹配。例如:

go test [packages]
go test xxx.go

以下是一些常用的参数说明:

  • -v:显示详细的测试输出,包括每个测试用例的名称和结果。
  • -run:指定要运行的测试函数的正则表达式。
  • -cover:同时进行代码覆盖率分析,显示代码被执行的情况。
  • -coverprofile:将代码覆盖率分析的结果输出到指定文件中。
  • -count:指定测试的运行次数,默认为 1 次。
  • -timeout:设置测试的运行超时时间。
  • -bench:运行与性能测试有关的基准测试。
  • -benchmem:在运行基准测试时显示内存分配的统计信息。

关于单元测试、模糊测试和基准测试可以参考之前的几篇文章,《Golang单元测试详解(一):单元测试的基本使用方法》、《一文掌握 Golang 模糊测试(Fuzz Testing)》和《Golang 性能基准测试(benchmark)详解》。

这里要着重讲解一下 -coverprofile 参数,这个参数可以将测试用例的代码覆盖结果输出到指定文件中,然后可以借助 go tool cover 来做具体的分析。来看一下带上 -coverprofile 参数的效果,以 github.com/luduoxin/json-validator-go 项目为例,clone 代码后,切换到项目的 validator 目录,打开终端,执行如下命令:

 $ go test -coverprofile=c.out

截取 c.out 的前两行内容如下:

mode: set
github.com/luduoxin/json-validator-go/validator/scanner.go:11.30,15.2 3

第二行每个部分代表的意思如下:

"文件:起始行.起始列,结束行.结束列 该基本块中的语句数量 该基本块被执行到的次数"

搞清楚这个输出内容的格式可以做很多事情,例如自己做工具来统计长时间运行的项目的测试覆盖率,就可以在执行测试用例的过程中,先生成此种格式的文件,然后借助 go tool cover 这个工具来分析。

猜你喜欢

转载自blog.csdn.net/luduoyuan/article/details/131818785