我对 golang 单元测试感到困惑。
我有 2 个 Test_xxx
函数,比如 Test_1
和 Test_2
。
在 Test_1
中,我将更改一个global 变量,Test_2
可以看到更改吗?
此外,如果我使用 monkey patch
而不是更改 global var,其他 Test_xxx
函数会感知到补丁吗?
即,当 Test_xxx
返回时,我是否有必要使用 defer 取消函数替换?
最佳答案
Is
Test_xxx
func safe to access shared data in golang?
答案完全取决于那些测试函数是否允许并行运行。
默认情况下,go test
按顺序调用给定包的测试函数。然而,如果
- 你调用
t.Parallel()
在两个测试函数中,以及 - 两个函数访问(写/写或写/读)同一个全局变量,它们之间没有任何同步,
您可能会遇到数据竞争。
要修复想法,请考虑这个简单的测试文件:
package main
import (
"fmt"
"testing"
)
var count = 0
func Test_1(t *testing.T) {
t.Parallel()
count++
fmt.Println(count)
}
func Test_2(t *testing.T) {
t.Parallel()
count++
fmt.Println(count)
}
如果你运行 go test -race
,比赛检测器会拍打你的手腕:
==================
WARNING: DATA RACE
--snip--
FAIL
exit status 1
FAIL whatever 0.730s
这应该使您相信在测试中处理全局状态时应该小心。最好的办法是avoid global state altogether , 如果可以的话。或者,请记住,一旦激活并行测试执行,就必须注意同步对全局状态的访问。
关于unit-testing - Test_xxx func 是否可以安全地访问 golang 中的共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68126459/