我找到了"go test"PASS,但是如果我特定的子测试,它将失败,在这里我给出一个全局变量样本,"go test"将通过,而"go test -run f/sample2"将失败。
我想知道我应该遵循哪些一般规则来防止此类问题?
T.Go
package main
import "fmt"
var g string
func f(s string) string {
g = g + s
return s + g
}
func main() {
fmt.Println(f("a"))
}
t_test.go
package main
import (
"testing"
)
func Test_f(t *testing.T) {
tests := []struct {
name string
g string
s string
r string
}{
{"simple", "g1", "s1", "s1s1"},
{"simple2", "g2", "s2", "s2s1s2"},
{"simple3", "g3", "s3", "s3s1s2s3"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
//g = tt.g
r := f(tt.s)
if r != tt.r {
t.Error("r=", r, "expect r=", tt.r)
}
})
}
}
如果全局变量是问题所在,我经常写一些类似osExit fmtPrint的东西来替换os。退出和FMT。打印测试,如何克服这些?
防止此类问题的方法是不要进行相互依赖的测试。 在您的情况下,全局变量确实是一个问题。如果按顺序运行测试,则它们具有预期的全局状态。如果按顺序运行它们,则由于测试之间的相互依赖性,它们不会。
解决方案是通过设置自己的预期状态,让每个测试独立工作。 在这种情况下,这意味着将全局g
变量设置为每个测试的预期值。
更好的解决方案是重构,这样你就不会有全局变量。