在go测试中处理命令行参数

时间:2014-01-25 13:08:56

标签: testing go command-line-arguments go-flag

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

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

有人可能会认为这样做是错误的,并且它违背了单位测试的纯度:

  1. 并非所有测试都是单元测试
  2. 它非常实用,不依赖于“ENV”变量,实际上将这些东西作为参数传递给命令行,

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

4 个答案:

答案 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.
}