使 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
}
鉴于我 运行 以下测试:
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
}