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



假设我运行以下测试:

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注册每次测试后运行的函数。

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
}

最新更新