unit-testing - Test_xxx func 是否可以安全地访问 golang 中的共享数据?

标签 unit-testing go global-variables monkeypatching

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

我有 2 个 Test_xxx 函数,比如 Test_1Test_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/

相关文章:

android - 基于 BroadcastReceiver 获取 wifi SSID 列表并返回 Rx.Observable 的服务进行单元测试

unit-testing - 使用流测试类

docker - 如何使用 Docker 引擎 SDK 和 Golang 运行 docker 安装卷

javascript - 我应该使用 window.variable 还是 var?

javascript - 如何访问 if 语句中的变量

java - 全局变量重置

unit-testing - 将单元测试集成到 Visual Studio Express 2008 中

spring - ils。使用内部的Spring bean测试命令对象

go - 替代哈希来处理 Go 中的混合类型

go - 在 gorilla/mux 框架中使用 Go routines