18 January 2020

go语言并行测试的一个坑

先上代码, 运行下面的测试, 猜一下, 这个测试是会通过呢? 还是会不通过?
理论上应该是不通过,对吧?’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


是不是非常奇怪???

具体原因, 我看了一点资料, 但是还没有完全理解, 大意好像是并行测试的时候导致测试数据被覆盖了?
下次完全搞明白了以后再来补充一个笔记

参考资料

扫一扫关注微信公众号