有没有办法在go“tests”中获取命令行参数,
当您go test
显然没有运行main
时,有没有办法处理命令行参数,
一种方法是使用flags
包并检查每个被测试的测试或函数中的命令行参数,但这对于你需要在很多很多地方执行此操作并不理想,与运行应用程序时main
中的方式不同。
有人可能会认为这样做是错误的,并且它违背了单位测试的纯度:
对于记录,我最终在我的init()
个文件中放置了一个_test
函数,并设置了通过这种方式调用main时通过flags设置的变量。
答案 0 :(得分:9)
根据我的经验,环境变量最好保存在环境变量中。您可以依赖全局变量:
var envSetting = os.Getenv("TEST_ENV")
或者,如果需要使用flags,则可以将初始化代码放在名为init()的函数中。
func init() {
flags.Parse()
myEnv = *envFlag
// ...
}
答案 1 :(得分:5)
另一种方法是使main()
成为一个存根,仅在flag.Parse()
处理参数后调用另一个函数,例如:
var flagvar int
func init() {
flag.IntVar(&flagvar, "flagname", 1234, "help for flagname")
}
func main() {
flag.Parse()
submain(flag.Args)
}
func submain(args []string) {
...
}
然后在测试中,可以在调用submain(...)
模拟命令行建立标志和参数之前设置标志变量并建立参数。此方法可用于最大化测试覆盖率,而无需实际使用命令行。例如,在main_test.go中,您可以写:
func TestSomething(t *testing.T) {
flagvar = 23
args := []string{"a", "b", "c"}
submain(args)
...
}
答案 2 :(得分:4)
os.Args[1] = "-conf=my.conf"
flag.Parse()
请注意,配置文件名是硬编码的。
答案 3 :(得分:0)
您可以直接测试主函数并传递参数。
显示标志和一对位置参数的简单示例
注意:从Go 1.8开始,请勿将其称为对测试框架具有特殊含义的“ TestMain”。
package main
import (
"os"
"testing"
)
func TestMainFunc(t *testing.T) {
os.Args = append(os.Args, "--addr=http://b.com:566/something.avsc")
os.Args = append(os.Args, "Get")
os.Args = append(os.Args, `./some/resource/fred`)
main()
// Test results here, and decide pass/fail.
}