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