Go 在模拟流的基准函数中解决数据竞争

Go 在模拟流的基准函数中解决数据竞争,go,Go,我正在尝试编写一个函数,基本上将CSV流传输到HTTP端点 为此,我想生成数据并发布这些数据 然而,gos数据竞赛检测器表示存在数据竞赛,基准测试完成的速度比我认为合理的速度要快,因此我猜HTTP请求没有得到正确处理 我应该如何构造测试代码以避免这种情况 是否有一种方法可以等待HTTP客户端调用被处理 func BenchmarkStream(b *testing.B) { header := "header\n" buf := bytes.NewBufferString(hea

我正在尝试编写一个函数,基本上将CSV流传输到HTTP端点

为此,我想生成数据并发布这些数据

然而,
go
s数据竞赛检测器表示存在数据竞赛,基准测试完成的速度比我认为合理的速度要快,因此我猜HTTP请求没有得到正确处理

我应该如何构造测试代码以避免这种情况

是否有一种方法可以等待HTTP客户端调用被处理

func BenchmarkStream(b *testing.B) {
    header := "header\n"
    buf := bytes.NewBufferString(header)

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        for i := 0; i < b.N; i++ {
            buf.WriteString(fmt.Sprintf("%d\n", i+1))
        }
        wg.Done()
    }()                 <-- this line is mentioned in the data race detector

    w := httptest.NewRecorder()
    r, _ := http.NewRequest("POST", "/", buf)
    h := &MyHandler{}
    h.ServeHTTP(w, r)  

    wg.Wait()

    if w.Code != 200 {
        b.Errorf("test failed")
    }
}

您正在两个goroutine之间共享
buf

如果只调用一次处理程序,将无法获得有用的基准测试结果。构建一次请求主体,然后反复调用处理程序

buf := &bytes.Buffer{}
buf.WriteString("header\n")
buf.WriteString(strings.Repeat("1\n", 1000)
body := buf.Bytes()

b.ResetTimer()

for i := 0; i < b.N; i++ {
    w := httptest.NewRecorder()
    r, err := http.NewRequest("POST", "/", bytes.NewReader(body))
    if err != nil {
        b.Fatal(err)
    }

    h := &MyHandler{}
    h.ServeHTTP(w, r)  

    if w.Code != 200 {
        b.Errorf("test failed")
    }
}
buf:=&bytes.Buffer{}
buf.WriteString(“标题\n”)
buf.WriteString(strings.Repeat(“1\n”,1000))
正文:=buf.Bytes()
b、 重置计时器()
对于i:=0;i
您正在对bytes.Buffer.WriteString进行基准测试,而不是您的处理程序。
buf := &bytes.Buffer{}
buf.WriteString("header\n")
buf.WriteString(strings.Repeat("1\n", 1000)
body := buf.Bytes()

b.ResetTimer()

for i := 0; i < b.N; i++ {
    w := httptest.NewRecorder()
    r, err := http.NewRequest("POST", "/", bytes.NewReader(body))
    if err != nil {
        b.Fatal(err)
    }

    h := &MyHandler{}
    h.ServeHTTP(w, r)  

    if w.Code != 200 {
        b.Errorf("test failed")
    }
}