1.048596

Go原生测试代码工具

Go自带了测试框架和工具,在testing包中,以便完成单元测试Test和性能测试Benchmark。一般测试代码放在后缀_test文件中,与被测代码放于同一个包中,在编译的过程中不会把这些文件编译进可执行文件中,而使用指令可以区测试这些代码查看是否能够得到正确结果,就像评测机一样还能测试性能。

命令测试指令

在命令行中使用如下命令就可以自动开始测试包内的测试用例。

测试指令

# simple test pass or not
go test
# output test details
go test -v

测试参数

有些有用的参数可以客制化测试的过程,比如显示测试覆盖率和指定某些测试的函数而不是运行并测试全部的。

运行对象指定

  • 全部对象

这里就像文件的选定一样,用.来代表当前目录所有的测试文件。

go test -v -run=.
  • 选择测试方式

通常有单元测试和基准测试两种,使用参数也可以选择这些测试方法全部进行还是只进行一种。

# select the unit test
go test -v -run=. -brench=^$
# elect the benchmark
go test -v -brench=. -test=^$
  • 选择特定函数测试用例

只要测试函数名包含这字段就会测试,反之不进行测试。

go test -v -run="Add|Sub"

测试覆盖率

一个好的稳定的Go项目离不开好的测试检测,有时候对项目的测试覆盖率有很高的要求。

  • 本次覆盖率
go test -cover
  • 生成覆盖率日志
go test -v -coverprofile=cover.out

单元测试

单元测试可以对单个函数进行测试,测试的函数命名要以Test开头之后加上非小写开头的函数原名。

规定必须加上一个*testing.T的参数才能测试

func TestAdd(t *testing.T) {
	type args struct {
		a int
		b int
	}
	tests := []struct {
		name string
		// test the parameter structure
		args args
		// target of the test
		want int
	}{
		{
			// Add a test case arguments structure here.
			name: "case",
			args: args{
				a: 1,
				b: 4,
			},
			want: 5,
		},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			// Test functions to test the format as above.
			if got := Add(test.args.a, test.args.b); got != test.want {
				t.Errorf("Add() = %v, want %v", got, test.want)
			}
		})
	}
}

基准测试

如果要进行基准测试来测试代码性能可以使用Benchmark前缀加上函数名来进行基准测试。可以增添对各种因素的监控和测试结果数据,比如CPU和内存状态的设定,采用几个核心,采用多大内存等等。

必须加上*testing.B参数才能够被视作是完全的基准测试

书写方法

func BenchmarkAdd(b *testing.B) {
	// The number of tests b.N is pre-made by the system.
	for i := 0; i < b.N; i++ {
		Add(3, 1)
	}
}

如果测试的时候需要加载一些资源,但是这些资源又不需要加入进测试当中可以使时间重置从测试真正开始的部分开始计时。

func BenchmarkAdd(b *testing.B) {
	Loading()
	// reset record time
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		Add(2, 4)
	}
}

测试参数

有很多独有的测试参数可以被使用用于获得更加详细的测试数据,还可以多次进行性能测试来保证测试结果的有效性。

指定逻辑核心数

现在很多机器都有了多核心处理器,那么它的逻辑核心就是最大物理线程数。-cpu可以进行指定测试时使用的逻辑核心数来测试不同环境下的运行情况。

# Specifying the number of logical cores at test time produces multiple sets of results.
go test -bench=. -cpu=1,2,4

测试次数

对于测试的次数越多越好,因为测试过程会受到种种外部因素的影响而且实际使用的过程中也会有不同的外部环境。

# set number of tests
go test -bench=. -count=10