基准测试

Ginkgo 允许你使用Measure块来测量你的代码的性能。Measure块可以运行在任何It块可以运行的地方--每一个Meature生成一个规格。传递给Measure的闭包函数必须使用Benchmarker参数。Benchmarker用于测量运行时间并记录任意数值。你也必须在该闭包函数之后传递一个整型参数给Measure,它表示Measure将执行的你的代码的样本数。例如:

Measure("it should do something hard efficiently", func(b Benchmarker) {
    runtime := b.Time("runtime", func() {
        output := SomethingHard()
        Expect(output).To(Equal(17))
    })

    Ω(runtime.Seconds()).Should(BeNumerically("<", 0.2), "SomethingHard() shouldn't take too long.")

    b.RecordValue("disk usage (in MB)", HowMuchDiskSpaceDidYouUse())
}, 10)

它将联合“runtime” 和 “disk usage”的数据把这个闭包函数运行10次。然后, Ginkgo的reporter将会打印出每一个包含简单统计的指标的总结:

• [MEASUREMENT]
Suite
    it should do something hard efficiently

    Ran 10 samples:
    runtime:
      Fastest Time: 0.01s
      Slowest Time: 0.08s
      Average Time: 0.05s ± 0.02s

    disk usage (in MB):
      Smallest: 3.0
       Largest: 5.2
       Average: 3.9 ± 0.4

通过使用Measure, 你可以编写富有表现力,探索性的规格来测量你的代码各个部分的性能(或者外部组件,如果你在使用Ginkgo来编写集成测试)。在收集数据时,你可以保留Measure规格以监控性能,如果组件开始变得缓慢和臃肿,则套件会失败。

Measures和Its 可以在同一个测试套件中使用。如果你只想运行Its,你可以传递--skipMeasurements标签给Ginkgo.

您还可以使用PMeasure和XMeasure将Measures标记为待处理,或者将它们与FMeasure一起使用。

测量时间

传递到你的闭包函数的Benchmarker提供了

Time(name string, body func(), info ...Interface{}) time.Duration

方法。Times运行传入的body函数,并且记录和返回它的运行时。对每个样本的测量值进行汇总和计算一些简单的统计数据。在传入的name下的规格输出中会显示这些统计数据。注意,在Measure节点的作用域内name必须是唯一的。

你还可以通过可选的info参数传递任意信息。它将会和Time测量的聚合运行时一起传递给reporter。默认reporter使用info的字符串表示形式,但是你也可以编写一个定制的reporter来执行更架构化的东西。例如,您可能会运行相同代码的多个测量,但会在运行时更改某些参数。您可以在info中对该参数的值进行编码,然后让自定义报告者使用该info和Ginkgo提供的统计信息来生成CSV文件 - 甚至可能是图表。

如果你想断言body在某个阈值时间内运行,你可以对Time的返回值进行断言。

记录任意值

Benchmarker还提供了

RecordValue(name string, value float64, info ...Interface{})

方法。RecordValue允许你记录任意数字化的数值。聚合这些结果并计算一些简单的统计数据。这些统计信息显示在您传入name下的规格输出中。注意,在Measure节点的作用域内name必须是唯一的。

可选的info参数可用于将结构化数据传递给自定义报告者。请参阅上面的测量时间以获取更多详。

results matching ""

    No results matching ""