需求
现在需要在运行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是因为其无法正确解析后续参数。