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

标签 go benchmarking

当我说 cmd 工具时,我指的是像这样的工具程序:

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
}

我不能只在我的 Benchmark() 中调用 main()。

有什么办法吗?

或者我必须重写一个带有参数的函数才能调用 Benchmark() 吗?

最佳答案

保持 main() 尽可能短并将所有实际工作委托(delegate)给函数/方法是一个很好的做法,如果您愿意,它可以进行测试和基准测试。它可能看起来像

// main.go
// go run main.go -h "Content-Type: application/json" -h "X-Request-ID: 12345" -d "Hello"
package main

import (
    "flag"
    "fmt"
    "io"
    "log"
    "strings"
)

type headers map[string]string

func (h headers) String() string {
    hdr := make([]string, 0)
    for k, v := range map[string]string(h) {
        hdr = append(hdr, fmt.Sprintf("%s: %s", k, v))
    }
    return strings.Join(hdr, ",")
}
func (h headers) Set(value string) error {
    i := strings.Index(value, ":")
    if i < 1 {
        return fmt.Errorf("invalid header '%s'", value)
    }
    h[value[0:i]] = strings.TrimSpace(value[i+1:])
    return nil
}

var (
    method string
    hdrs   = make(headers)
    body   string
)

func init() {
    flag.StringVar(&method, "m", "GET", "Method")
    flag.Var(hdrs, "h", "Headers")
    flag.StringVar(&body, "d", "", "Body")
    flag.Parse()
}

func main() {
    err := run(method, hdrs, strings.NewReader(body))
    if err != nil {
        log.Fatal(err)
    }
}

func run(method string, headers headers, body io.Reader) error {
    // implement your logic here
    return nil
}

和你的基准

// main_test.go
package main

import (
    "strings"
    "testing"
)

func BenchmarkRun1(b *testing.B) {
    hdrs := headers{"Content-Type": "application/json", "Accept": "appication/json"}
    body := "Hello World"
    for i := 0; i < b.N; i++ {
        run("GET", hdrs, strings.NewReader(body))
    }
}

关于go - 如何在 Golang 中为 cmd 工具编写基准测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55273364/

相关文章:

使用 Go 例程和变量时的 Go 插件核心转储

Golang (v1.8) - 错误 : type *mux. Route has no field or method Method

types - 为什么 Go 输入 nil?

go - 如何使用 go1.18 运行在一个源文件中编写的多个模糊测试用例?

go - 带有sync.waitGroup的Goroutine每次输出不同的值

PHP json_decode() 输出 : Object vs Array?

php - 如何对 PHP 脚本的效率进行基准测试

performance - OpenJDK JMH“得分错误”到底是什么意思?

c# - 优化传递表达式作为方法参数的建议

c++ - 如何客观评价一段C++代码片段的执行时间?