2014-02-10 200 views
0

我最近決定爲我們的Rails 3.0應用的測試套件編寫一個簡單的測試運行時分析器。這是一個非常簡單(讀:哈克)腳本,每次測試的時間增加了一個全球性的,然後將結果在運行結束時輸出:覆蓋rake測試:單元跑步者

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似乎被忽略。

回答

0

在經典SO風格,我找到了答案清楚闡明對自己以後,所以這裏是:

當沒有TEST=/test/unit/blah_test.rb運行,test:units TESTOPTS=需要其內容之前--。因此,在整體解決方案很簡單:

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

+0

這是爲什麼在這種情況下需要的是超越我,所以,如果有人可以幫我找到這個問題的答案,將不勝感激。 – RubberDucky