go 单元测试

目前最近的工作要接触一些有关于测试方面的知识,但是本人之前并没有做测试的经验,所以开始在网上做收集研究。接下来言归正传。

单元测试

go 语言本身就自带了一个建议的测试库叫做 testing,使用方法蛮简单的 。

比如测试

1
2
3
4
package main
func add(i int,i2 int) int{
return i + i2
}
1
2
3
4
5
6
7
8
9
10
11
package main
import "testing"

func Test_add(t *testing.T) {
sum := add(1,2)
if sum == 3{
t.Log("ok")
}else{
t.Fatal("error")
}
}

我这里的命名是 GoLand 自动生成的,而go标准的测试 func 名一般为TestXXX ,而文件名为 文件名_test.go 。

这里t.Log() 输出信息 , 并继续。

1
2
3
4
=== RUN   Test_add
--- PASS: Test_add (0.00s)
coding_test.go:8: ok
PASS

t.Fatal() 标记为测试不通过,终止并输出错误信息

1
2
3
4
=== RUN   Test_add
--- FAIL: Test_add (0.00s)
coding_test.go:10: error
FAIL

如果我们使用 t.Error(), 虽然测试不通过,但仍继续测试下去,适用在测试多 case 的时候。

Logf 、 Errorf 、Fatalf 我就不多赘述,也就是format的意思。

当测试多案例的时候,我们可以使用goland或vscode 生成的测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import "testing"

func Test_add(t *testing.T) {
type args struct {
i int
i2 int
}
tests := []struct {
name string
args args
want int
}{
// TODO: Add test cases.
{"case 1",args{1, 2,},3},
{"case 2",args{2, 4,},6},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := add(tt.args.i, tt.args.i2); got != tt.want {
t.Errorf("add() = %v, want %v", got, tt.want)
}
})
}
}

第一个参数为测试名称 ,第二为 我们需要传入的参数,当参数较多的时候,使用结构体 , 第三个参数即我们最终需要的结果。查了下这种叫做 Table-Driven Test ,还蛮形象的 。

并行测试和基准测试以及覆盖率测试什么的我个人不大会,暂时略过,择日再写。