在 go test 中处理命令行参数

有没有办法在 go“tests”中获取命令行参数,
当你调用go test显然你main没有运行时,有没有办法处理命令行参数,

一种方法是使用flags包并检查每个测试或正在测试的函数中的命令行参数,但这并不理想,因为您需要在很多地方执行此操作,这与您刚刚使用的方式不同main当您运行应用程序时。

有人可能会认为这是错误的做法,并且有悖于单元测试的纯度:

  1. 并非所有测试都是单元测试

  2. 不依赖“ENV”变量并实际将这些东西作为参数在命令行中传递是非常实用的,


为了记录,我最终init()在我的一个_test文件中放置了一个函数,并设置了在以这种方式调用 main 时通过标志设置的变量。


偶然的你
浏览 325回答 3
3回答

潇湘沐

根据我的经验,环境配置最好保存在环境变量中。您可以像这样依赖全局变量:var envSetting = os.Getenv("TEST_ENV")或者,如果需要使用标志,您可以将初始化代码放在名为 init() 的函数中。func init() {    flags.Parse()    myEnv = *envFlag    // ...}

至尊宝的传说

另一种方法是使main()成为一个存根,它仅在由 处理参数后调用另一个函数flag.Parse(),例如:var flagvar intfunc 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)    ...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go