我想测试传递给我的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()
...
}
Run Code Online (Sandbox Code Playgroud)
测试文件:
包主
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()
...
...
}
Run Code Online (Sandbox Code Playgroud)
不要FlagSet在flags包中使用全局对象。创建自己FlagSet的字段Params:https : //golang.org/pkg/flag/#FlagSet
flag.String所做的所有事情就是通过函数调用传递给包中的全局FlagSet对象flag(特别flag.CommandLine是变量)。这是易于使用的方法,但不是一般的好习惯。使用您自己的标志集可以避免您描述的问题以及使用全局变量带来的其他潜在副作用。