go 测试:Logf 不会在内部基准运行之外报告 ```markdown 测试: Logf 不会在内部基准运行之外报告 ```

7nbnzgx9  于 4个月前  发布在  Go
关注(0)|答案(1)|浏览(47)

应用以下补丁可以说明问题:

diff --git a/src/go/format/benchmark_test.go b/src/go/format/benchmark_test.go
index 7bd45c0e95..62131e0977 100644
--- a/src/go/format/benchmark_test.go
+++ b/src/go/format/benchmark_test.go
@@ -58,6 +58,7 @@ var tests = []struct {
 }
 
 func BenchmarkFormat(b *testing.B) {
+       b.Logf("foo") // <<< not reported
        var src bytes.Buffer
        for _, t := range tests {
                src.Reset()
@@ -74,6 +75,7 @@ func BenchmarkFormat(b *testing.B) {
                }
 
                b.Run(fmt.Sprintf("%s-%d", t.name, t.n), func(b *testing.B) {
+                       b.Logf("foo") // <<< reported
                        b.SetBytes(int64(len(data)))
                        b.ReportAllocs()
                        b.ResetTimer()

当运行此基准测试时,外部的 b.Logf 调用不会在输出中报告。
我本以为会看到两者都有。

ntjbwcob

ntjbwcob1#

感谢 @griesemer 提交这份报告,很抱歉我们没有在 Go1.13 周期内处理这个问题!
实际上,这个 bug 是由于我们没有遵循 b.Logf(

) 的承诺导致的,而子基准测试遵循输出总是会被记录的承诺。
如果你设置了 -v,它将被打印出来。
这种行为似乎是在 CL https://go-review.googlesource.com/c/go/+/21504/ 中引入的,尤其是我认为这一行可能是原因所在:go/src/testing/benchmark.go 文件中的第 244 行
| | ifb.chatty&& (len(b.output) >0||b.finished) { |
将其更新为

diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go
index 0e348be358..2c88f3f2ee 100644
--- a/src/testing/benchmark.go
+++ b/src/testing/benchmark.go
@@ -241,7 +241,7 @@ func (b *B) run1() bool {
 		if b.skipped {
 			tag = "SKIP"
 		}
-		if b.chatty && (len(b.output) > 0 || b.finished) {
+		if len(b.output) > 0 || b.finished {
 			b.trimOutput()
 			fmt.Fprintf(b.w, "--- %s: %s\n%s", tag, b.name, b.output)
 		}

会产生正确的效果,不会使现有的测试失败。你怎么看 @mpvl?我们应该把这个问题推迟到 Go1.14 并标记为 Early-In-Cycle,还是可以在 Go1.13 中添加它?

相关问题