golang正在测试命令行参数



我想测试传递给CLI程序的不同(正确/不正确(命令行参数,但我不确定如何使用go/testing包来实现这一点,因为我收到了flag redefined错误。发生这种情况的原因似乎是flag.Parse()只能调用一次。测试传递到go程序中的不同命令行参数的正确方法是什么?有没有什么方法可以定义类似setup()/teardown()的东西,或者孤立地运行每个案例(但在同一个文件中(?

这是我的代码:

要测试的功能:

func (p *Params) Parse() (*Params, error) {
param1Ptr := flag.String("param1", "default", "param1 desc")
param2Ptr := flag.String("param2", "default", "param1 desc")
...
... 
flag.Parse()
...
}

测试文件:

包装主

import (
"os"
"testing"
)

func TestParam1(t *testing.T) {
os.Args = []string{"cmd", "-param1", "incorrect", "-param2", "correct"}
params := Params{}
_, err := params.Parse()
...
... 
}
func TestParam2(t *testing.T) {
os.Args = []string{"cmd", "-param1", "correct", "-param2", "incorrect"}
params := Params{}
_, err := params.Parse()
...
... 
}

不要在flags包中使用全局FlagSet对象。创建您自己的FlagSet作为Params的字段:https://golang.org/pkg/flag/#FlagSet

flag.String等人所做的只是通过函数调用传递到flag包中的全局FlagSet对象(特别是flag.CommandLine是变量(。这很容易使用,但不是一个普遍的好做法。使用自己的标志集可以避免您所描述的问题以及使用全局变量带来的其他潜在副作用。

每次测试前使用清除全局FlagSet

flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)

请参阅如何取消设置GoLang中命令行上访问的标志以进行测试

最新更新