基准测试
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参数可用于将结构化数据传递给自定义报告者。请参阅上面的测量时间以获取更多详。