1. 单元测试基础
1. 含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件
2. 单元测试文件名_test.go前面的部分最好是被测试的方法所在go文件的文件名,比如例子中是main_test.go,因为测试的Add函数,在main.go文件里
3. 单元测试的函数名必须以Test开头,是可导出公开的函数
4. 测试函数的签名必须接收一个指向testing.T类型的指针,并且不能返回任何值
5. 函数名最好是Test+要测试的方法函数名,比如例子中是TestAdd,表示测试的是Add这个这个函数
例如:
// add.go
package main
func add(a,b int) int {
return a+b
}
// add_test.go
package main
import (
"testing"
)
func TestAdd(t *testing.T) {
test := []struct{a,b,c int}{
{1,2,3},
{-1,1,0},
{3,5,8},
{-2,-3,-5},
}
for _, tt := range test{
if result := add(tt.a, tt.b); result != tt.c{
t.Errorf("add(%d, %d) got %d, expected %d", tt.a, tt.b, result, tt.c)
}
}
}
在命令行下执行如下命令即可:
go test .
2. 代码覆盖率测试
编写完单元测试代码以后,在命令行执行如下命令:
// 生成测试结果文件
go test -coverprofile=c.out
// 如果想更详细的查看测试结果,可以执行
go tool cover -html=c.out
就可以在浏览器中查看测试结果
3. 性能测试
1. 基准测试的代码文件必须以_test.go结尾
2. 基准测试的函数必须以Benchmark开头,必须是可导出的
3. 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
4. 基准测试函数不能有返回值
5. b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
6. 最后的for循环很重要,被测试的代码要放到循环里
7. b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
测试实例:
func BenchmarkAdd(b *testing.B) {
a,s,c := 10000,30000, 40000
for i:=0; i<b.N; i++{
d := add(a,s)
if d != c{
b.Errorf("add(%d, %d) got %d, expected %d\n", a,s,d,c)
}
}
}
命令如下:
go test -bench .
如果想更详细的查看影响性能的代码段,可以使用如下命令:
go test -bench . -cpuprofile cpu.out
此时生成的是一个二进制文件,我们同样可以使用工具在浏览器查看:
go tool pprof cpu.out
此时会进入一个交互式的命令行:
(pprof)
命令行会有许多参数来方便调试,这里使用最简单的一种方法,直接输入web回车,即可在浏览器查看。此时生成的是一个svg图片,因此还需要到这里下载graphviz软件安装才行,安装完记得设置环境变量
http://www.graphviz.org