我想测试传递给我的CLI程序的其他(正确/不正确)命令行参数,但是由于我遇到flag redefined
错误,因此我不确定如何使用go / testing包来实现这一点。看来是因为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()
...
...
}
答案 0 :(得分:4)
请勿使用FlagSet
包中的全局flags
对象。创建自己的FlagSet
作为Params
的字段:https://golang.org/pkg/flag/#FlagSet
flag.String
等所做的所有事情都是通过函数调用传递到FlagSet
包中的全局flag
对象(特别是flag.CommandLine
是变量)。这是易于使用的方法,但不是一般的好习惯。使用您自己的标志集可以避免由于使用全局变量而导致您描述的问题以及其他潜在的副作用。
答案 1 :(得分:0)
在每次测试之前使用以下方法清除全局 FlagSet:
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
见How to unset flags Visited on command line in GoLang for Tests