为了账号安全,请及时绑定邮箱和手机立即绑定

在 go test 中处理命令行参数

在 go test 中处理命令行参数

Go
偶然的你 2021-07-15 18:01:14
有没有办法在 go“tests”中获取命令行参数,当你调用go test显然你main没有运行时,有没有办法处理命令行参数,一种方法是使用flags包并检查每个测试或正在测试的函数中的命令行参数,但这并不理想,因为您需要在很多地方执行此操作,这与您刚刚使用的方式不同main当您运行应用程序时。有人可能会认为这是错误的做法,并且有悖于单元测试的纯度:并非所有测试都是单元测试不依赖“ENV”变量并实际将这些东西作为参数在命令行中传递是非常实用的,为了记录,我最终init()在我的一个_test文件中放置了一个函数,并设置了在以这种方式调用 main 时通过标志设置的变量。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

根据我的经验,环境配置最好保存在环境变量中。您可以像这样依赖全局变量:


var envSetting = os.Getenv("TEST_ENV")

或者,如果需要使用标志,您可以将初始化代码放在名为 init() 的函数中。


func init() {

    flags.Parse()

    myEnv = *envFlag

    // ...

}


查看完整回答
反对 回复 2021-07-19
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

另一种方法是使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)

    ...

}


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信