doutuzhuohao6449 2019-03-21 03:29
浏览 67

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

When I say cmd tool, I mean a tool program like:

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
}

I cannot just call main() in my Benchmark().

Is there any way to do this?

Or must I rewrite a function with args for Benchmark() to call?

  • 写回答

1条回答 默认 最新

  • douzong5835 2019-03-21 05:22
    关注

    It's a good practice to keep your main() as short as possible and delegate all the actual work to a function/method, which makes it testable and benchmark'able if you wish. It may look something along the lines of

    // 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
    }
    
    

    and your benchmark

    // 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))
        }
    }
    
    
    评论

报告相同问题?

悬赏问题

  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条