go学习之 单元测试

go test工具

任何语言都会有自己的单元测试啥测试啥的呀,像java常用的就是junit注解测试呀,我们go也不例外呢,go语言中测试依赖 go test 命令进行测试,编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。非常银性哈

  • go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。

在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。

类型格式作用
测试函数函数名前缀为Test测试程序的一些逻辑行为是否正确
基准函数函数名前缀为Benchmark测试函数的性能
示例函数函数名前缀为Example为文档提供示例文档
  • go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数
  • 然后生成一个临时的main包用于调用相应的测试函数
  • 构建并运行、报告测试结果,最后清理测试中生成的临时文件。

单元测试函数

  • 每个测试函数必须导入testing包
  • 测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头

我们来做个小例子来看看吧

  • 这里我们来实现一个strings包里面split函数,用于分割字符串的
package split_string

import (
	"strings"
)

// Split 对字符串按sep进行分割
func Split(str, sep string) []string {
	// 先计算出str里面有多少个sep
	var a []string
	index := strings.Index(str, sep)
	for index > 0 {
		a = append(a, str[:index])
		str = str[index+1:]
		index = strings.Index(str, sep)
	}
	a = append(a, str[:])
	return a
}

  • 要放在同一个包下,而且还要以_test结尾哦

在这里插入图片描述

  • 可以看到哈,函数可以写多个测试,然后开头必须以Test,还要放在测试包里面
  • 里面就是一个实际值和一个预期值进行相比对,然后我们go test 一下就可以了
  • 找到要测试的包,是程序包哦,右击 go test 即可完成测试

在这里插入图片描述

在这里插入图片描述

  • 可以看到啦,这就是表示通过测试了,以后如果代码发生改变,该套测试工具还是可以复用的。

但是这一个一个函数跑实在是在哪个啥了,所以我们可以整合一下,搞个结构体啥的,方便的一点

func TestSplit(t *testing.T) {
	// 测试集合的结构体
	type testCase struct {
		str  string   // 要测试的字符串
		sep  string   // 指定分割的字符串
		want []string // 期望的字符串
	}

	testGroup := []testCase{
		{"a:b:c", ":", []string{"a", "b", "c"}},
		{"abcdfebf", "b", []string{"a", "cdfe", "f"}},
		{"abcef", "bc", []string{"a", "ef"}},
		{"深圳南山可南山了", "南山", []string{"深圳", "可", "了"}},
	}

	for _, ans := range testGroup {
		got := Split(ans.str, ans.sep)
		if !reflect.DeepEqual(got, ans.want) {
			t.Errorf("want: %v  , but got: %v\n", ans.want, got)
		}
	}

}
  • 这样子,每次添加测试样例的时候就简单多了。

但是这样又会出现一个新的问题哈,我们不能得到单独的一个样例是否出错的数据呢,对不对

所以针对这种情况,go官方提供了t.run这种子测试的方法来帮助我们哈,还是挺人性的哈。

子测试

在这里插入图片描述

  • 可以看到哈,我们故意搞了个错误,程序也告诉我们 case 4 出错了。这就很方便了。
  • 然后我们来看点厉害的,基准测试

基准测试

  • 基准测试就是在一定的工作负载之下检测程序性能的一种方式
  • 基准测试以 Benchamark 为前缀,需要一个 *testing.B 类型的参数b,基准测试必须要执行b.n次,这样的测试才会有对照性,并且它还有很多方法。
  • 然后我们以上面那个split函数为例子来写一个吧

在这里插入图片描述

  • 通过右击包,Run,然后点击gobench就可以看到啦

在这里插入图片描述

  • 运行结果也很明显哈,一共运行了3984140次,一次op(操作)用了306ns(纳秒)
  • 我们还可以查看内存相关的东西,
  • 这样,我们通过不同的代码进行比较,就可做到优化我们的程序的一个效果。

版权声明:本文为qq_43514659原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。