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