Go测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import (
"errors"
"testing"

"github.com/lyloou/goer/pkg/basic"
"github.com/lyloou/goer/pkg/math"
)

// https://yar999.gitbooks.io/gopl-zh/content/ch11/ch11-02.html
// 表格驱动测试
func TestDivide(t *testing.T) {
var tests = []struct {
a int64
b int64
r int64
err error
}{
{4, 2, 2, nil},
{4, 3, 1, nil},
{2, 4, 0, nil},
{4, 0, 0, errors.New("division by zero")},
}

for _, test := range tests {
if r, err := math.Divide(test.a, test.b); r != test.r || !basic.IsSameError(err, test.err) {
t.Errorf("Divide(%d, %d) got (%d, %v), want (%d, %v)", test.a, test.b, r, err, test.r, test.err)
}
}
}

测试扩展包(External test package):
目的:解决包的循环依赖问题。
方法:给包名添加_test后缀。
https://yar999.gitbooks.io/gopl-zh/content/ch11/ch11-02.html

1
2
3
4
5
6
// 产品代码
$ go list -f={{.GoFiles}} github.com/lyloou/goer/pkg/math
// 包内测试
$ go list -f={{.TestGoFiles}} github.com/lyloou/goer/pkg/math
// 测试扩展包
$ go list -f={{.XTestGoFiles}} github.com/lyloou/goer/pkg/math

fmt/export_test.go中所表现的,通过提供一个秘密出口的小技巧,来进行测试扩展包的白盒测试。
—— https://yar999.gitbooks.io/gopl-zh/content/ch11/ch11-02.html (11.2.4)

开始一个好的测试的关键是通过实现你真正想要的具体行为,然后才是考虑简化测试代码。
最好的接口是直接从库的抽象接口开始,针对公共接口编写一些测试函数。