Go 使用测试。基准测试不会产生任何输出

Go 使用测试。基准测试不会产生任何输出,go,Go,我正在使用testing.Benchmark手动运行两个基准测试,但结果对象总是空的 我是不是遗漏了什么 下面是一个例子: package main import "testing" func main() { result := testing.Benchmark(func(parentB *testing.B) { parentB.Run("example", func(b *testing.B) { for n := 0; n <

我正在使用
testing.Benchmark
手动运行两个基准测试,但结果对象总是空的

我是不是遗漏了什么

下面是一个例子:

package main

import "testing"

func main() {

    result := testing.Benchmark(func(parentB *testing.B) {
        parentB.Run("example", func(b *testing.B) {
            for n := 0; n < b.N; n++ {
                println("ok")
            }
        })
    })

    println(result.String())

}
主程序包
导入“测试”
func main(){
结果:=testing.Benchmark(func(parentB*testing.B){
parentB.Run(“示例”,func(b*testing.b){
对于n:=0;n

这将打印几次
ok
,然后
0 ns/op
,但是基准测试显然运行了一些东西。

我认为您做的一切都是正确的。国防部说:

基准测试单个函数。用于创建不使用“go test”命令的自定义基准测试

如果f调用Run,则结果将是运行其所有子基准测试的估计值,这些子基准测试没有在单个基准测试中按顺序调用Run

调查实施情况(Go 1.7.4):

这一行:

    if !b.run1() {
        return BenchmarkResult{}
    }
b.run1()
应该运行您传递的函数一次,并检测它是否有子基准。你的有。它返回一个
bool
是否需要更多的运行。内部
run1()

它正确地告诉我们它有子基准,而
benchmark()
——非常简单——只返回一个空的
BenchmarkResult

    if !b.run1() {
        return BenchmarkResult{}
    }

我确实认为这是一个bug(或者更确切地说是“不完整”的特性),或者doc是不正确的。我建议在这里提出一个问题:

编辑答案以澄清:

我猜您正在使用go run来运行测试。这不会产生任何结果。为了在编写代码时准确地运行代码,您需要使用
进行测试-测试台=。我认为它应该起作用。 该文件必须命名为test_xxx.go,其中xxx是您想要的任何文件

如果您重新构造代码,则可以将其作为单个函数基准运行:

package main

import "testing"

func main() {
    myTest()
}

func myTest() {
    fn := func(b *testing.B) {
        for n := 0; n < b.N; n++ {
            println("ok")
        }
    }
    result := testing.Benchmark(fn)

    println(result.String())
}
主程序包
导入“测试”
func main(){
我的测试()
}
func myTest(){
fn:=func(b*testing.b){
对于n:=0;n
您是否尝试过一些“纯”计算,而不仅仅是打印?我不知道该怎么做。好吧,没关系。我自己也试过了,但它确实不起作用,与文档相反。
Benchmark
对单个函数进行基准测试。用于创建不使用“go test”命令的自定义基准测试。要完全按照编写的方式运行代码,他需要使用run-bench=。我将编辑我的原始答案,并说明如何重新构造它,使其能够测试单个函数。@PeterFendrich是的,不使用子基准测试是可行的。但是根据文档,提问者尝试的方法也应该有效(很可能他有更多的次级基准,为了简洁起见,没有包括在问题中),这就是这个问题的内容。是的,不使用次级基准是有效的,但这不是我要找的。
    if !b.run1() {
        return BenchmarkResult{}
    }
package main

import "testing"

func main() {
    myTest()
}

func myTest() {
    fn := func(b *testing.B) {
        for n := 0; n < b.N; n++ {
            println("ok")
        }
    }
    result := testing.Benchmark(fn)

    println(result.String())
}