覆盖rake测试:单位跑步者

时间:2014-02-10 22:52:36

标签: ruby ruby-on-rails-3

我最近决定为Rails 3.0应用程序的测试套件编写一个简单的测试运行时分析器。这是一个非常简单的(读取:hacky)脚本,它将每个测试的时间添加到全局,然后在运行结束时输出结果:

require 'test/unit/ui/console/testrunner'

module ProfilingHelper

  def self.included mod
    $test_times ||= []

    mod.class_eval do
      setup :setup_profiling
      def setup_profiling
        @test_start_time = Time.now
      end

      teardown :teardown_profiling
      def teardown_profiling
        @test_took_time = Time.now - @test_start_time
        $test_times << [name, @test_took_time]
      end
    end

  end

end

class ProfilingRunner < Test::Unit::UI::Console::TestRunner
  def finished(elapsed_time)
    super
    tests = $test_times.sort{|x,y| y[1] <=> x[1]}.first(100)
    output("Top 100 slowest tests:")
    tests.each do |t|
      output("#{t[1].round(2)}s: \t #{t[0]}")
    end
  end
end

Test::Unit::AutoRunner::RUNNERS[:profiling] = proc do |r|
  ProfilingRunner
end

这允许我运行像rake test:xxx TESTOPTS="--runner=profiling"这样的套件,并获得附加到默认运行器输出结尾的前100个测试的列表。它适用于test:functionalstest:integration,甚至适用于test:units TEST='test/unit/an_example_test.rb'。但是,如果我没有为test:units指定测试,则TESTOPTS似乎被忽略。

1 个答案:

答案 0 :(得分:0)

在经典的 SO 风格中,我在清楚地向自己表达后找到了答案,所以这里是:

在没有TEST=/test/unit/blah_test.rb的情况下投放时,test:units TESTOPTS=在其内容之前需要--。所以整个解决方案就是:

rake test:units TESTOPTS='-- --runner=profiling'