我想测试传递给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中命令行上访问的标志以进行测试