golang test支持命令行输入

需求

现在需要在运行golang test例程中支持命令行参数输入,例如:

go test -v -run TestCase1 --param1 value1 --param2 value2

实现

依赖

需要使用github.com/spf13/pflag包,golang标准库原生flag包难以实现。

编码

xxxx_test.go

import (
	"flag"
	"github.com/spf13/pflag"
	"testing"
)

// 这种方式可以支持命令行输入
// go test -v -run TestXXXX args --bucket aaa
// 也可以 go test -c -o xxxx.test
// 输入 ./xxxx.test -test.v -test.run TestXXXX args --bucket bbb 运行即可

func TestXXXX(t *testing.T) {
	var (
		bucket string
	)

    // 先用plag包创建一个FlagSet。
	flagSet := pflag.NewFlagSet("test-xxxx", pflag.ContinueOnError)
	
    // 往FlagSet里注册我们需要解析的参数
    flagSet.StringVar(&bucket, "bucket", "default-bucket-name", "set bucket name")
	
    // 让该FlagSet解析flag.CommandLine.Args(),后面会说明为何需要解析该参数。
	flagSet.Parse(flag.CommandLine.Args())

	t.Log("bucket:", bucket)

	...
    // 后续测试代码
}

运行

两种方式,一种是直接运行

 go test -v -run TestXXXX args --bucket aaa

我们也可以将test例程编译成可执行二进制,这样就可以将其作为一个测试工具,可以部署在任意集群测试,也支持灵活的参数。

在xxxx_test.go目录下输入

go test -c -o xxxx.test


然后输入

./xxxx.test -test.v -test.run TestXXXX args --bucket bbb 运行即可

原理

go test运行每个例程前,会运行标准库的flag包中的flag.Parse()进行解析,

该函数解析过程中,会将第一个不以“-”开头的后续参数放入CommandLine.args,

因此我们使用flag.CommandLine.Args()即可获取我们的命令行参数,

再交给pflag包的FlagSet.Parse函数解析即可,不再使用标准库flag包的Parse是因为其无法正确解析后续参数。

你可能感兴趣的:(golang,后端,单元测试)