登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-16 20:27:34 225浏览 收藏

从现在开始,努力学习吧!本文《Test_xxx func 访问 golang 中的共享数据安全吗?》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

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

我有 2 个 Test_xxx 函数,例如 Test_1Test_2

Test_1中,我将更改全局变量,Test_2可以看到更改吗?

此外,如果我使用 monkey patch 而不是更改全局 var,其他 Test_xxx 函数会感知到修补吗?

即,当 Test_xxx 返回时,我是否有必要使用 defer 取消 func 替换?


正确答案


test_xxx函数在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。或者,请记住,一旦激活并行测试执行,就必须注意同步对全局状态的访问。

是的。

var global = 0

func test_1(t *testing.t) {
    for i := 0; i < 1000; i++ {
        global++
    }
    fmt.println(global)
}

func test_2(t *testing.t) {
    for i := 0; i < 1000; i++ {
        global++
    }
    fmt.println(global)
}

输出

=== run   test_1
1000
--- pass: test_1 (0.00s)
=== run   test_22
2000
--- pass: test_22 (0.00s)
pass

您可以使用Cleanup函数来删除全局变量的更改

func Test_1(t *testing.T) {
    t.Cleanup(func() {
        global = 0
    })
    for i := 0; i < 1000; i++ {
        global++
    }
    fmt.Println(global)
}

PLAYGROUND

今天关于《Test_xxx func 访问 golang 中的共享数据安全吗?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>