什么是让我们去测试的一般规则-run <case>&#39;成功的&#39;去测试&#39;?

时间:2017-10-13 09:08:36

标签: unit-testing go

我找到了&#39;去测试&#39;通过,但如果我具体进行子测试,它将失败,这里我给出一个全局变量样本,&#39; go test&#39;将通过,并且&#39;去测试 - 运行f / sample2&#39;将失败。

我想知道我应遵循哪些一般规则来防止此类问题?

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 个答案:

答案 0 :(得分:1)

防止此类问题的方法是不要让测试相互依赖。在您的情况下,全局变量确实是一个问题。如果按顺序运行测试,则它们具有预期的全局状态。如果你按顺序运行它们,它们就不会,因为测试之间存在相互依赖性。

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

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