2017-10-13 20 views
0

我发现了'去测试'通过,但如果我特定的子测试,它会失败,在这里我给一个全局变量样本,'去测试'将通过,'去测试运行f/sample2'将失败。什么是让'去测试运行<case>'作为'去测试'成功的一般规则?

我很好奇我应该遵循什么规则来防止这些问题?

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.Exit和fmt.Print上测试,如何克服这些?

回答

1

防止这些问题的方法是不要有相互依赖的测试。在你的情况下,全局变量确实是一个问题。如果您按顺序运行测试,则它们具有预期的全局状态。如果你不按顺序运行它们,由于测试之间的相互依赖关系,它们不会。

解决方案是让每个测试独立工作,方法是设置自己的预期状态。在这种情况下,这意味着将全局g变量设置为每个测试的预期值。

更好的解决方案是重构,所以你根本没有全局变量。

相关问题