18 January 2020
先上代码, 运行下面的测试, 猜一下, 这个测试是会通过呢? 还是会不通过?
理论上应该是不通过,对吧?’fail-0’这个case显然应该失败。
package main
import "testing"
import "github.com/stretchr/testify/assert"
func TestHello(t *testing.T) {
for _, tc := range []struct {
name string
age int
}{
{
name: "fail-0",
age: 0,
},
{
name: "success-1",
age: 1,
},
} {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
assert.Equal(t, 1, tc.age)
})
}
}
运行结果如下, 居然是通过的???
go test
PASS
ok github.com/noteanddata/learngo 0.006s
修改以后的代码, 在调用t.Run之前, 加一行 tc := tc
package main
import "testing"
import "github.com/stretchr/testify/assert"
func TestHello(t *testing.T) {
for _, tc := range []struct {
name string
age int
}{
{
name: "fail-0",
age: 0,
},
{
name: "success-1",
age: 1,
},
} {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
assert.Equal(t, 1, tc.age)
})
}
}
修改以后的运行结果
go test
--- FAIL: TestHello (0.00s)
--- FAIL: TestHello/fail-0 (0.00s)
simple_test.go:23:
Error Trace: simple_test.go:23
Error: Not equal:
expected: 1
actual : 0
Test: TestHello/fail-0
FAIL
exit status 1
FAIL github.com/noteanddata/learngo 0.007s
是不是非常奇怪???
具体原因, 我看了一点资料, 但是还没有完全理解, 大意好像是并行测试的时候导致测试数据被覆盖了?
下次完全搞明白了以后再来补充一个笔记