Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 什么';让';开始试运行<;案例>';成功的as';进行测试';?_Unit Testing_Go - Fatal编程技术网

Unit testing 什么';让';开始试运行<;案例>';成功的as';进行测试';?

Unit testing 什么';让';开始试运行<;案例>';成功的as';进行测试';?,unit-testing,go,Unit Testing,Go,我发现‘go test’通过了,但如果我指定了子测试,它将失败,这里我给出了一个全局变量示例,‘go test’将通过,而‘go test-run f/sample2’将失败 我想知道我应该遵循什么一般规则来防止这样的问题 t、 去 t_test.go package main import ( "testing" ) func Test_f(t *testing.T) { tests := []struct { name st

我发现‘go test’通过了,但如果我指定了子测试,它将失败,这里我给出了一个全局变量示例,‘go test’将通过,而‘go test-run f/sample2’将失败

我想知道我应该遵循什么一般规则来防止这样的问题

t、 去

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,如何克服这些问题?

防止此类问题的方法是不进行相互依赖的测试。在您的例子中,全局变量确实是一个问题。如果按顺序运行测试,则它们具有预期的全局状态。由于测试之间的相互依赖性,如果您按顺序运行它们,则它们不会

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

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

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)
                        }
                })
        }
}