我最近决定为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:functionals
和test:integration
,甚至适用于test:units TEST='test/unit/an_example_test.rb'
。但是,如果我没有为test:units
指定测试,则TESTOPTS似乎被忽略。
答案 0 :(得分:0)
在经典的 SO 风格中,我在清楚地向自己表达后找到了答案,所以这里是:
在没有TEST=/test/unit/blah_test.rb
的情况下投放时,test:units TESTOPTS=
在其内容之前需要--
。所以整个解决方案就是:
rake test:units TESTOPTS='-- --runner=profiling'