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

时间:2020-04-08 18:34:13

标签: unit-testing go initialization

鉴于我运行了以下测试:

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是否有更直接的解决方案,就像我尚未找到的标志一样?

1 个答案:

答案 0 :(得分:2)

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

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
}