GO语言 单元测试
注:go的测试文件需要和被测试的文件处于同一个包内。并且测试文件需要以_test.go结尾,测试文件内测试函数的书写方式为Testxxx(以Test开头
1.普通测试
这个用于编写基本的测试函数。来看实例
假设我们在main函数里面有一个求和函数,我想测试一下这个求和函数是否可以正常运行并计算正常结果
func GetSum(j, k int) int { return j + k }
我们需要创建一个main_test.go函数,这个命名规则没有硬性要求,主要看后缀。我们一般测试哪个文件就用那个文件_test.go命名。
在main_test.go文件中,我们不需要main函数。直接编写测试函数即可,这里我的被测试函数是GetSum,我就写一个TestGetSum(t *testing.T){}函数,函数具体编写如下:
func TestGetSum(t *testing.T) { re := GetSum(1, 3) if re != 40 { t.Errorf("getsum(1,3) = %d; want 4", re) } }
其实测试函数就是在函数内部调用被测试函数,通过预设的实参来检测返回值是否与我们预期的相符。如果不符合就调用t的方法来输出结果
t的方法最常用的是t.Errorf("")格式化输出错误信息,
t.Errorf("getsum(1,3) = %d; want 4", re)这条语句的作用就是输出:getsum(1,3)=变量re的值;want 4
这就是最简单的单元测试运用实例
2.跳过部分测试内容
如果在单元测试中有的部分我们不想测试的话,可以通过一些设置进行跳过。也就是说正常来说一个单元内有十个被测元素,正常顺序是从一到十一个一个来。我么可以通过t.Skip()进行跳过
假设测试函数内我们有步骤
1
22
333
4444
55555
五个步骤,如果在2前面加一个t.Skip()那么2345都不会执行,这个有点类似于普通函数里面的return,一旦遇到就结束函数。
跳过的设置有两种,一种是无论什么情况都跳过。第二种是只有在终端运行go build -short的时候才会跳过
第一种
func TestGetSum2(t *testing.T) { t.Skip("跳过本测试函数testgetsum2") re := GetCheng(5, 5) if re != 250 { t.Errorf("getsum(5,5) = %d; want 25", re) } }这种情况,无论怎么运行go test都会跳过这个函数,并且在终端输出跳过本次测试函数信息
有的时候可能会遇到没有输出的情况,这时候我们需要运行的命令时:go text -v这个命令会输出完整的信息
第二种
func TestGetSum2(t *testing.T) { if testing.Short() { t.Skip("跳过本测试函数testgetsum2") } re := GetCheng(5, 5) if re != 250 { t.Errorf("getsum(5,5) = %d; want 25", re) } }这种情况要注意的是只有在终端运行:go test -short的时候testing.Short()才会返回true才会跳过测试信息。如果没有-short后缀就会返回false,则测试函数正常运行
而且如果在ide里面运行函数而不是通过终端的话,ide命令默认的是不带-short后缀的
3.多组数据测试
如果一个测试函数内需要用到多组数据进行测试,我们要是单独的为每一组数据写一个测试函数是很麻烦的。这时候我们可以定义一个结构体,结构体内字段是输入值和结果值。然后遍历这个结构体,每一次遍历的时候都进行一次测试。如果有一次测试不合格,就说明函数有问题
func TestGetSum2(t *testing.T) { var dataTable = []struct { a int b int out int }{ {1, 1, 2}, {1, 2, 3}, {100, 100, 200}, } for _, data := range dataTable { re := GetSum(data.a, data.b) if re != data.out { t.Errorf("getsum(%d, %d) = %d; want %d", data.a, data.b, re, data.out) } } }这个的实现是非常简单的,主要是能想到这一点是比较难的。