go - 如何在 Golang 中为 cmd 工具编写基准测试?
问题描述
当我说 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()。
有没有办法做到这一点?
或者我必须用 args 重写一个函数以便 Benchmark() 调用?
解决方案
保持main()
尽可能短并将所有实际工作委托给函数/方法是一个很好的做法,如果您愿意,这可以使其可测试和基准测试。它可能看起来类似于
// 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))
}
}
推荐阅读
- assembly - 如何在汇编语言中使用 LES?
- javascript - 使用 if 语句在箭头函数的末尾返回一个值
- firefox-addon - 如何将 reCaptcha 添加到 Firefox 插件?
- c++ - 如何找到 10x12 矩阵的最小值和最大值
- python - 熊猫,如何计算每个月过去n年的平均值
- spring-boot - 为什么我不能以级联方式删除数据?
- java - MailJob 中附加的图像 - Android 工作室
- html - 页眉中的文字定位,页脚定位,
- node.js - 如何使用 typescript 在 node/mysql2 中包装 pool.query 函数以进行错误处理
- python - 关于寻找“毕达哥拉斯三胞胎”的脚本的两个问题