Friday, September 26, 2008

Showing your longest running tests

Slow builds got you down? Have no idea where that slow test is? Get the latest in monkey-patched hotness:
require 'test/unit/ui/console/testrunner'
Test::Unit::UI::Console::TestRunner.class_eval do
@@test_times = []

old_attach_to_mediator_method = instance_method(:attach_to_mediator)

define_method :attach_to_mediator do
old_attach_to_mediator_method.bind(self).call
@mediator.add_listener(Test::Unit::TestCase::STARTED, &method(:record_start_time))
@mediator.add_listener(Test::Unit::TestCase::FINISHED, &method(:record_elapsed_time))
@mediator.add_listener(Test::Unit::UI::TestRunnerMediator::FINISHED, &method(:print_times))
end

def record_start_time(name)
@start_time = Time.now
end

def record_elapsed_time(name)
@@test_times << {:name => name, :time => (Time.now - @start_time)}
end

def print_times(suite_elapsed_time)
unless @@test_times.empty?
puts ''
puts "Displaying 10 longest running tests:"
@@test_times.sort_by { |t| t[:time] }.reverse[0...10].each do |test_timing|
puts "#{test_timing[:time]} seconds for #{test_timing[:name]}"
end
end
end

end

And you get some output like this:

Displaying 10 longest running tests:
0.159756 seconds for test_awarding_0.04_points_per_passing_yard(Units::PlayerStatsTest)
0.000432 seconds for test_awarding_6_points_per_return_touchdown(Units::PlayerStatsTest)
0.000367 seconds for test_give_1_point_per_point_after_touchdown_made(Units::PlayerStatsTest)
0.000316 seconds for test_awarding_6_points_per_receiving_touchdown(Units::PlayerStatsTest)
0.000305 seconds for test_awarding_0.1_points_per_receiving_yard(Units::PlayerStatsTest)
0.000297 seconds for test_copping_out_and_giving_3_points_per_field_goal(Units::PlayerStatsTest)
0.00029 seconds for test_awarding_6_points_per_rushing_touchdowns(Units::PlayerStatsTest)
0.00029 seconds for test_penalizing_-2_points_for_fumbles_lost(Units::PlayerStatsTest)
0.000288 seconds for test_penalizing_-1_points_for_interceptions(Units::PlayerStatsTest)
0.000282 seconds for test_awarding_0.1_points_per_rushing_yard(Units::PlayerStatsTest)

1 comment:

jamie said...

Way to use the word "crux". Very smart!