golang测试命令行参数

时间:2018-12-10 13:41:38

标签: go

我想测试传递给我的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()
        ...
        ... 
}

2 个答案:

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