测试程序模板
func TestFunction(t *testing.T) {
var tests = []struct { // Test table
in string
out string
}{
{“in1”, “exp1”},
{“in2”, “exp2”},
{“in3”, “exp3”},
...
}
for i, tt := range tests {
cache := make([]uint32, tt.cacheSize/4)
generateCache(cache, tt.epoch, seedHash(tt.epoch*epochLength+1))
dataset := make([]uint32, tt.datasetSize/4)
generateDataset(dataset, tt.epoch, cache)
want := make([]uint32, tt.datasetSize/4)
prepare(want, tt.dataset)
if !reflect.DeepEqual(dataset, want) {
t.Errorf("dataset %d: content mismatch: have %x, want %x", i, dataset, want)
}
}
}
2 测试单个函数
一个测试文件可能有多个测试函数,指定特定的测试函数运行:
go test -test.run TestXXX
1
TestXXX指的是测试函数名称,系统会自动匹配测试函数名称。如一个测试文件中有两个测试函数TestCheckSig和TestCheckSigSm2,那么执行测试命令:
$ go test -test.run TestCheckSig -v
=== RUN TestCheckSig
--- PASS: TestCheckSig (0.00s)
=== RUN TestCheckSigSm2
--- PASS: TestCheckSigSm2 (0.00s)
PASS
ok github.com/bytom/protocol/vm 0.014s
$ go test -test.run TestCheckSigSm2 -v
=== RUN TestCheckSigSm2
--- PASS: TestCheckSigSm2 (0.00s)
PASS
ok github.com/bytom/protocol/vm 0.013s
可见,系统会自动匹配符合TestCheckSig的测试函数名称,因此两个函数都会测试到。这里的匹配只是简单匹配,并非正则匹配。
如果TestXXX不存在,则会返回错误:
$ go test -test.run TestCheckSigSm22 -v
testing: warning: no tests to run
PASS
ok github.com/bytom/protocol/vm 0.008s
3 测试缓存
运行 Go 测试函数的时候,如果已经运行过 go test,则之后如果文件没有发生改变,则就会自动应用上次测试缓存。如下所示:
PASS
ok tester/apitests (cached)
如果不想应用上次测试缓存,则有两种方式删除缓存:
使用 go clean -testcache 清理所有测试结果。
在执行 go test 时添加 -count=1 关闭测试缓存。