Test_xxx func 访问 golang 中的共享数据安全吗?

wym*_*mli 2 unit-testing monkeypatching global-variables go

我对 golang 单元测试感到困惑。

我有 2 个Test_xxx函数,例如Test_1Test_2
在中Test_1,我将更改一个全局变量,可以Test_2看到变化吗?

此外,如果我使用monkey patch而不是更改全局变量,其他Test_xxx函数会感知到修补吗?
即,我是否有必要在返回时使用 defer 取消 func 替换Test_xxx

jub*_*0bs 6

Test_xxxfunc 访问 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)
}
Run Code Online (Sandbox Code Playgroud)

如果你跑步go test -race,比赛检测器会拍打你的手腕:

==================
WARNING: DATA RACE
--snip--
FAIL
exit status 1
FAIL    whatever    0.730s
Run Code Online (Sandbox Code Playgroud)

这应该让您相信在测试中处理全局状态时应该小心。如果可以的话,最好的办法是完全避免全局状态。或者,请记住,一旦激活并行测试执行,就必须注意同步对全局状态的访问。