1 测试程序模板
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
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
关闭测试缓存。
方法1可以暂时清理测试缓存,方法2可以在每次执行测试的时候不使用测试缓存。