unit-testing - 让 'go test -run <case>' 成功为 'go test' 的一般规则是什么?

标签 unit-testing go

我发现'go test' PASS,但是如果我指定sub test,它会失败,这里我给一个全局变量sample,'go test'会PASS,'go test -run f/sample2'会失败.

我想知道我应该遵循什么一般规则来防止此类问题?

走吧

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

最佳答案

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

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

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

关于unit-testing - 让 'go test -run <case>' 成功为 'go test' 的一般规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46726321/

相关文章:

戈朗 : how to explain the type assertion efficiency?

parsing - 允许多次读取 http.Request.Body 的正确方法是什么

PHPUnit教程?或者更通用的 - 值得推荐的单元测试教程?

每月第一个星期一的 Golang Revel Job 规范

go - 如何从其他函数解析 slice

datetime - 如何在不解析表行的情况下更改结构上的日期格式(如 "yyyy-mm-dd")?

unit-testing - 学习使用When和Should和TDD进行单元测试

c# - 以高效且省时的方式构建、启动 ASP.NET Web 应用程序并运行 Microsoft CodedUI 测试

java - 使用 Maven 跳过 Jhipster 中的 Java 测试进行构建

unit-testing - 这是干净的BDD/MSpec测试吗?