Go 程序编写三类测试,即:功能测试(test)、基准测试(benchmark,也称性
能测试),以及示例测试(example)。
- 测试源码文件的主名称应该以被测源码文件的主名称为前导,并且必须以“_test”为后缀。
- 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只应有一个*testing.T类型的参数声明。
- 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型的。
- 对于示例测试函数来说,其名称必须以Example为前缀,但对函数的参数列表没有强制规定
功能测试
1,测试单个文件,一定要带上被测试的原文件
go test -v wechat_test.go wechat.go
2,测试单个方法
go test -v -test.run TestRefreshAccessToken
基准测试
$ go test -bench=. -run=^$ puzzlers/article20/q3
goos: darwin
goarch: amd64
pkg: puzzlers/article20/q3
BenchmarkGetPrimes-8 500000 2314 ns/op
PASS
ok puzzlers/article20/q3 1.192s
解析
-
第一个标记及其值为-bench=.,只有有了这个
标记,命令才会进行性能测试。该标记的值.表明需要执行任意名称的性能测试函数。 -
第二个标记及其值是-run=^ $ ,这个标记用于表明需要执行哪些功能测试函数,这同样也是以函数名称为依据的。该标记的值^$意味着:只执行名称为空的功能测试函数,换句话说,不执行任何功能测试函数。你可能已经看出来了,这两个标记的值都是正则表达式。实际上,它们只能以正则表达式为值。
此外,如果运行go test命令的时候不加-run标记,那么就会使它执行被测代码包中的所有功能测试函数。 -
再来看测试结果,重点说一下倒数第三行的内容。BenchmarkGetPrimes-8被称为单个性能测试的名称,它表示命令执行了性能测试函数BenchmarkGetPrimes,并且当时所用的最大P 数量为8。
-
最大 P 数量相当于可以同时运行 goroutine 的逻辑 CPU 的最大个数。这里的逻辑 CPU,也可以被称为 CPU 核心,但它并不等同于计算机中真正的 CPU 核心,只是 Go 语言运行时系统内部的一个概念,代表着它同时运行 goroutine 的能力。
-
顺便说一句,一台计算机的 CPU 核心的个数,意味着它能在同一时刻执行多少条程序指令,代表着它并行处理程序指令的能力。我们可以通过调用 runtime.GOMAXPROCS函数改变最大 P 数量,也可以在运行go test命
令时,加入标记-cpu来设置一个最大 P 数量的列表,以供命令在多次测试时使用。 -
在性能测试名称右边的是,go test命令最后一次执行性能测试函数(即
BenchmarkGetPrimes函数)的时候,被测函数(即GetPrimes函数)被执行的实际次数。这是什么意思呢? -
go test命令在执行性能测试函数的时候会给它一个正整数,若该测试函数的唯一参数的名称为b,则该正整数就由b.N代表。我们应该在测试函数中配合着编写代码,比如:
我在一个会迭代b.N次的循环中调用了GetPrimes函数,并给予它参数值1000。go test命令会先尝试把b.N设置为1,然后执行测试函数。如果测试函数的执行时间没有超过上限,此上限默认为 1 秒,那么命令就会改大b.N的值,然后再次执行测试函数,如此往复,直到这个时间大于或等于上限为止。当某次执行的时间大于或等于上限时,我们就说这是命令此次对该测试函数的最后一次执行。这时的b.N的值就会被包含在测试结果中,也就是上述测试结果中的500000。 -
我们可以简称该值为执行次数,但要注意,它指的是被测函数的执行次数,而不是性能测试函数的执行次数。
-
最后再看这个执行次数的右边,2314 ns/op表明单次执行GetPrimes函数的平均耗时为2314纳秒。这其实就是通过将最后一次执行测试函数时的执行时间,除以(被测函数的)执行次数而得出的。
F:\Development\Go\src\otherPractice\go36\tests>go test -v -bench=. -benchtime=3s -benchmem -run=none
goos: windows
goarch: amd64
pkg: otherPractice/go36/tests
BenchmarkMap-4 3000 1347727 ns/op 687122 B/op 275 allocs/op
BenchmarkMapCap-4 10000 641282 ns/op 322236 B/op 11 allocs/op
PASS
ok otherPractice/go36/tests 11.283s
- -benchtime设置运行时间,默认是1秒
- -run=none用于不运行单元测试代码
- -benchmem可以提供每次操作分配内存的次数,以及每次操作分配的字节数。从结果我们可以看到,指定容量的函数,每次操作进行11次内存分配,而不指定容量的函数的那个要分配275次;性能高的每次操作分配322236个字节内存,而慢的每次需要分配687122 字节的内存.