2

我正在尝试将性能测试合并到非 Rails应用程序的测试套件中,但遇到了一些问题。

  1. 我不需要每次都运行性能测试,我该如何排除它们?评论和取消评论config.filter_run_excluding :perf => true似乎是个坏主意。
  2. 如何报告基准测试结果?我认为 RSpec 有一些机制。
4

2 回答 2

2

第一个问题部分解决,第二个问题用这段代码完全解决spec/spec_helper.rb

class MessageHelper
  class << self
    def messages
      @messages ||= []
    end

    def add(msg)
      messages << msg
    end
  end
end

def message(msg)
  MessageHelper.add msg
end

RSpec.configure do |c|
  c.filter_run_excluding :perf => !ENV["PERF"]

  c.after(:suite) do
    puts "\nMessages:"
    MessageHelper.messages.each {|m| puts m}
  end
end
于 2012-06-24T21:58:43.770 回答
2

我创建了rspec-benchmark Ruby gem 用于在 RSpec 中编写性能测试。它对测试速度、资源使用和可扩展性有很多期望。

例如,要测试您的代码有多快:

expect { ... }.to perform_under(60).ms

或者与另一个实现进行比较:

expect { ... }.to perform_faster_than { ... }.at_least(5).times

或测试计算复杂度:

expect { ... }.to perform_logarithmic.in_range(8, 100_000)

或者查看分配了多少对象:

expect {
  _a = [Object.new]
  _b = {Object.new => 'foo'}
}.to perform_allocation({Array => 1, Object => 2}).objects

要过滤您的测试,您可以将规范分离到一个performance目录中并添加一个 rake 任务

require 'rspec/core/rake_task'

desc 'Run performance specs'
RSpec::Core::RakeTask.new(:perf) do |task|
  task.pattern = 'spec/performance{,/*/**}/*_spec.rb'
end

然后在需要时运行它们:

rake perf
于 2019-04-21T19:01:48.737 回答