如何在Golang中为cmd工具编写基准测试?

如何在Golang中为cmd工具编写基准测试?,go,benchmarking,Go,Benchmarking,当我说cmd tool时,我指的是一个工具程序,如: var ( m = flag.String("m", "GET", "") headers = flag.String("h", "", "") body = flag.String("d", "", "") contentType = flag.String("T", "text/html", "") ...... ) func main() { /

当我说cmd tool时,我指的是一个工具程序,如:

var (
    m           = flag.String("m", "GET", "")
    headers     = flag.String("h", "", "")
    body        = flag.String("d", "", "")
    contentType = flag.String("T", "text/html", "")
    ......
)

func main() {
    // Using args above, create complex logics
}
我不能在我的基准()中调用main()

有没有办法做到这一点


或者我必须用args for Benchmark()重写一个要调用的函数吗?

最好将
main()
尽可能短,并将所有实际工作委托给一个函数/方法,这样可以根据需要对其进行测试和基准测试。它看起来可能与

//main.go
//go run main.go-h“内容类型:application/json”-h“X-Request-ID:12345”-d“Hello”
包干管
进口(
“旗帜”
“fmt”
“io”
“日志”
“字符串”
)
类型头映射[string]字符串
func(h头)字符串()字符串{
hdr:=make([]字符串,0)
对于k,v:=范围映射[string]字符串(h){
hdr=append(hdr,fmt.Sprintf(“%s:%s”,k,v))
}
返回字符串。Join(hdr,“,”)
}
func(h标头)集合(值字符串)错误{
i:=strings.Index(值“:”)
如果i<1{
返回fmt.Errorf(“无效头“%s”,值)
}
h[value[0:i]]=strings.TrimSpace(value[i+1:])
归零
}
变量(
方法字符串
hdrs=制造(标题)
身体线
)
func init(){
flag.StringVar(&method,“m”,“GET”,“method”)
flag.Var(hdrs,“h”,“Headers”)
flag.StringVar(&body,“d”,“body”)
flag.Parse()
}
func main(){
err:=run(方法、hdrs、strings.NewReader(正文))
如果错误!=零{
log.Fatal(错误)
}
}
func运行(方法字符串、标题、正文io.Reader)错误{
//在这里实现你的逻辑
归零
}
你的基准呢

//main\u test.go
包干管
进口(
“字符串”
“测试”
)
func BenchmarkRun1(b*testing.b){
hdrs:=标题{“内容类型”:“应用程序/json”,“接受”:“应用程序/json”}
正文:=“你好,世界”
对于i:=0;i
不,没有。这是个坏主意。如果你有一个实际的函数,你可以执行1000次,你可以测量它的运行时间。对于可执行文件,您将包括程序启动的所有开销。也许只是将实际工作委托给main2并对其进行基准测试。@Volker我见过许多只在main()中编写参数的工具。似乎我只能重建它。你已经看到了很多,因为这是一种聪明的方法,特别是因为它允许你测试/基准测试/重用功能,与
main
中的应用程序启动分开。我测试的是一个开源工具,它的run()将有10个以上的参数。所以我不想照你说的做。@pingze所以用一个
struct
和10+个字段,或者不要对它进行基准测试。“我不想”不是不使用正确设计的特别好的理由。