引言
Go提供了testing
包用来进行单元测试和基准测试(benchmark),使用go test
指令运行对应目录下的测试用例,并输出测试结果。
单元测试
一个例子引入,文件名为some_func_test.go
:
|
|
在some_func_test.go
文件的父级目录下打开shell,执行go test
,则会运行测试用例TestEcho()
- 测试文件的命名格式为
xxx_test.go
, 如本例子为some_func_test.go
- 测试用例命名规则为
TestXXX
, 如例子中的TestEcho(t *testing.T)
- 测试需要用到的包是
testing
testing.T
用于普通测试用例testing.M
用于TestMain
测试用例testing.B
用于基准测试(benchmark)
go test
其他参数go test -v
会显示每个测试用例的结果go test -cover
会显示覆盖率go test -run TestAdd
用-run
指定运行的测试用例, 支持正则表达式
子测试集
|
|
testing.M
与setup
、teardown
测试时可能需要申请资源以构建出指定的运行环境,如建立数据库连接,可以将其抽象在setup中,同样事后还需要释放资源,将其抽象在teardown
中:
|
|
基准测试(benchmark)
一个例子引入, benchmark_test.go:
|
|
运行命令:go test -benchmem -bench .
, 表明运行当前目录下的benchmark。输出:
|
|
其中:
-
文件命名格式为:
xxx_test.go
-
benchmark函数的函数名格式为:
BenchmarkXxxx
,例如BenchmarkEcho(b *testing.B)
,Echo
首字母大写 -
b.N
为运行次数,这个次数是1秒内的迭代次数,benchmark默认运行1秒 -
BenchmarkEcho-2
中的2指的是GOMAXPROCS
, 为CPU核数 -
210461787表示的是单位时间1秒内运行的次数
-
6.279 ns/op指的是每次迭代花费6.279 ns
-
210461787 * 6.279 != 2.519s 是因为创建和销毁的时耗没有包括在其中
-
36 B/op 指的是每次迭代平均分配(allocated)36 Byte
-
0 allocs/op 指的是每次迭代中平均有多少个不同的内存分配 how many distinct memory allocations occurred per op (single iteration)
-
-bench
是执行基准测试必须的命令行选项,go test
和benchmark相关的其他命令行选项-benchmem
添加额外的内存信息-benchtime
指定运行时间或运行次数,例如go test -benchtime=5s -bench .
指定时间,go test -benchtime=1000x -bench
指定op为100次数-count
指定benchmark运行次数,例如go test -bench . -count=3
-cpu
指定cpu数,例如go test -bench . cpu 1,2,4,8
, 分别以cpu=1,2,4,8进行基准测试
benchmark计时器、ResetTimer()、StopTimer()、StartTimer()
计时器相关的函数和方法可以使的时间计算更加灵活,参考伪代码:
|
|
并行benchmark
|
|
- 并行benchmark的原理是,将b.N次迭代分散到P个Goroutine上。
- 使用
func (b *B) SetParallelism(p int)
可以设置RunParallel()
使用的Goroutine的个数, 计算方法为p*GOMAXPROCS
- 对于CPU密集的测试没必要使用
SetParallelism()
测试用例写法之表驱动
和pytest类似