一、简介

单元测试主要是通过模拟业务中的参数,调用我们的函数,然后获取执行结果,再判断结果是否符合规则;同时还可以对某一个方法进行性能分析

testinggo test_test.go

规则:

  • 单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件
  • 单元测试的函数名必须以Test开头,是可导出公开的函数。备注:函数名最好是Test+要测试的方法函数名
  • 测试函数的签名必须接收一个指向testing.T类型的指针作为参数,并且该测试函数不能返回任何值

math_func.go:

package mathfunc

func Add(num1 int, num2 int) int {
	return num1 + num2
}

add_test.go: 

package mathfunc

import (
	"testing"
)

func TestAdd(t *testing.T) {
	tests := []struct{ a, b, c int }{
		{1, 2, 3},
		{4, 5, 9},
		{5, 5, 10},
		{40000, 50000, 90000},
	}

	for _, test := range tests {
		if actual := Add(test.a, test.b); actual != test.c {
			t.Errorf("Add(%d,%d) actual is %d , expected is %d", test.a, test.b, actual, test.c)
		}
	}
}

  search.go:

package searchutil

func SearchNoRepeatStrMaxLength(str string) int {
	runeStrArray := []rune(str)
	var strRune = make([]rune, 0)
	var ensureStrRune []rune = nil
	var length = -1
	for _, r := range runeStrArray {
		if len(strRune) != 0 {
			if strRune[len(strRune)-1] != r {
				strRune = append(strRune, r)
			} else {
				if len(strRune) > length {
					length = len(strRune)
					ensureStrRune = make([]rune, 0)
					ensureStrRune = append(ensureStrRune, strRune...)
				}
				strRune = strRune[0:0]
				continue
			}
		} else {
			strRune = append(strRune, r)
		}
	}

	if len(strRune) > length {
		length = len(strRune)
		ensureStrRune = strRune
	}

	return len(ensureStrRune)
}

 benchmark_test.go:

package searchutil

import (
	"fmt"
	"testing"
)

func BenchmarkAdd(b *testing.B) {
	var str = "hellottthelloyyytuiopioyytestt"
	for i := 0; i < 13; i++ {
		str += str
	}

	fmt.Println(len(str))

	var res = 9

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		if actual := SearchNoRepeatStrMaxLength(str); actual != res {
			b.Errorf("SearchNoRepeatStrMaxLength(%s) : actual => %d ; expected: %d", str, actual, res)
		}
	}
}

二、单元测试使用

2.1 普通测试

普通测试主要是验证返回的结果是否符合预期,执行的命令如下所示

go test -v add_test.go math_func.go

命令执行后,返回的结果如下所示

 从上图中可以看到,单元测试提示测试通过,说明我们程序符合预期

2.2 性能测试

性能测试主要是通过多次调用程序,总耗时来分析程序的性能,类似于AB压力测试,执行命令如下所示

go test -v --bench="BenchmarkAdd$" --run=none benchmark_test.go search.go 
-bench="BenchmarkAdd$"

 2.3 测试覆盖率

go test -coverprofile c.out

go tool cover -html=c.out

 生成的代码覆盖率页面:

2.4 性能分析

-cpuprofile cpu.out
go test -v --bench="BenchmarkAdd$" --run=none -cpuprofile cpu.out benchmark_test.go search.go

 通过go 自带工具分析保存的文件

go tool pprof cpu.out

 提示需要安装Graphviz,下载链接如下:

go tool pprof cpu.out

 交互式输入web,即可打开性能分析图: