我怎么知道我在“去测试”中运行

时间:2013-01-10 01:05:17

标签: unit-testing go

当我运行“go test”时,我想使用不同的配置文件。如果我在测试环境或正常环境中运行,我如何知道我的代码?是否需要检查某种环境变量?

10 个答案:

答案 0 :(得分:31)

测试包在加载时修改全局环境:它注册了许多命令行标志。因此,我们可以检查这些标志是否已注册:

func init() {
    if flag.Lookup("test.v") == nil {
        fmt.Println("normal run")
    } else {
        fmt.Println("run under go test")
    }
}

答案 1 :(得分:8)

代码示例会有所帮助。但是从您的问题来看,当您可能想要传入配置文件时,您似乎已经硬编码了配置文件的路径。

更改您正在测试的功能以获取定义配置文件的参数,然后在测试代码中传递与您在非测试代码中使用的路径不同的路径。在测试与生产时,您的代码有不同的路径,这是不好的做法。

答案 2 :(得分:8)

由于flag.Lookup("test.v")方法对我不起作用,我想分享自己的解决方案:

strings.HasSuffix(os.Args[0], ".test")

strings.Contains(os.Args[0], "/_test/")

两者似乎都有效。

答案 3 :(得分:5)

一种可能性是使用build constraints。如果您将go test作为:

运行
go test -tags testing pkgname

然后,您可以使用该标记选择哪些文件将包含在包的标准版本中,哪些文件将用于测试。

如果您将标准配置放在自己的文件中,那么在下面添加一行代码将确保它不用于测试:

// +build !testing

然后,您可以在其中一个*_test.go文件或其他需要设置testing标记的文件中包含测试配置。

答案 4 :(得分:3)

flag.Lookup("test.v")解决方案对我也不起作用(转到1.13),并且我需要维护许多服务,并且在每种服务中都使用func TestMain(m *testing.M)解决方案是不可行的。由于所有服务共享一个公共库,因此我提出了以下解决方案:

func isInTests() bool {
    for _, arg := range os.Args {
        if strings.HasPrefix(arg, "-test.v=") {
            return true
        }
    }
    return false
}

这类似于flag.Lookup("test.v")解决方案,因为我们检查是否存在-test.v

编辑:根据@ mh-cbon注释更新了代码

答案 5 :(得分:1)

flag.Lookup("test.v") == nil方法似乎可以工作,但是我建议使用TestMain,该方法专门用于允许特定的设置和拆卸测试。如果在要测试的程序包中包含此方法,则将在单独的测试之前调用此方法,因此可以在调用m.Run()之前设置全局标志或执行想要执行的测试特定配置,如下所示< / p>

func TestMain(m *testing.M) {
    // test context initialization here
    os.Exit(m.Run())
}

PS:这实际上是@ calvin-sugianto所建议的,除了Gin与之无关

答案 6 :(得分:0)

Garrett的解决方案更加强大:

 func init() {
    if v := flag.Lookup("test.v"); v == nil || v.Value.String() != "true" {
        fmt.Println("normal run")
    } else {
        fmt.Println("run under go test")
    }
 }

答案 7 :(得分:0)

如果您使用的是Gin-Gonic框架,这是最简单的检查方式:

在TestMain函数中使用此代码:

func TestMain(m *testing.M) {
    gin.SetMode(gin.TestMode)
    os.Exit(m.Run())
}

然后,您可以使用以下代码检查是否通过go test运行:

if gin.Mode() == "test" {
    fmt.Println("run under go test")
} else {
    fmt.Println("normal run")
}

答案 8 :(得分:0)

我是golang的新手,flag.Lookup("test.v")对我不起作用,因此我找到了一种方法,可以通过在init()中设置ENV变量来确定上下文是测试环境还是正常环境。

如果您有测试文件(例如abc.text.go),请在init()中将环境变量“ GO_ENV”设置为测试。

func init() {
    os.Setenv("GO_ENV", "testing")
}

在任何想知道上下文的地方,请使用os.Getenv(“ GO_ENV”)
abc.go

if os.Getenv("GO_ENV") == "testing" {

} else {

}

答案 9 :(得分:0)

如果您尝试检测文件是否通过“运行”相对于可执行文件运行,则此功能将检查目录是否包含“ / Temp / go-build”(还要检查\以获取Windows支持)

if strings.Index(os.Args[0], "/Temp/go-build") != -1 || strings.Index(os.Args[0], "\\Temp\\go-build") != -1 {
    // ran with go run
} else {
    // ran as executable file
}