使 Go 测试彼此独立(全局变量的突变)

Make Go tests independent from each other (mutation of global vars)

鉴于我 运行 以下测试:

const unchanged = "unchanged"

var myField = unchanged

func TestChangeField1(t *testing.T) {
    if myField != unchanged {
        t.FailNow()
    }
    myField = "changed"
}

func TestChangeField2(t *testing.T) {
    if myField != unchanged {
        t.FailNow()
    }
    myField = "changed"
}

第二个测试将失败,因为该变量已在另一个测试中更改。

我知道有一些解决方法,比如使用一个测试套件,它提供了钩子来将这个值重置为测试之间的初始状态。但首先这意味着一些开销,其次我觉得整个行为令人惊讶,所以我真的不能确定我项目中的每个人都记得并遵守。

go test是否有更直接的解决方案,比如我还没有找到的标志?

@JimB 在评论中提到了这一点,但是如果您需要 运行 在测试用例之后进行清理,您可以在每次测试后使用 t.Cleanup.[= 注册 运行 的函数。 12=]

package main_test

import (
    "testing"
)

const Default = "default"
const SomethingElse = "something else"

var someVar = Default

func TestOne(t *testing.T) {
    t.Cleanup(resetState)
    if someVar != Default {
        t.FailNow()
    }
    someVar = SomethingElse
}

func TestTwo(t *testing.T) {
    t.Cleanup(resetState)
    if someVar != Default {
        t.FailNow()
    }
    someVar = SomethingElse
}

func resetState() {
    someVar = Default
}