unless %w{false none}.include?(ENV['BENCHMARK'])
require 'test/unit'
require 'test/unit/testresult'
require 'test/unit/testcase'
require 'test/unit/ui/console/testrunner'
class Test::Unit::UI::Console::TestRunner
include Loggable if const_defined?(:Loggable)
alias attach_to_mediator_old attach_to_mediator
# def attach_to_mediator_old
# @mediator.add_listener(TestResult::FAULT, &method(:add_fault))
# @mediator.add_listener(TestRunnerMediator::STARTED, &method(:started))
# @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:finished))
# @mediator.add_listener(TestCase::STARTED, &method(:test_started))
# @mediator.add_listener(TestCase::FINISHED, &method(:test_finished))
# end
def attach_to_mediator
attach_to_mediator_old
@mediator.add_listener(Test::Unit::TestSuite::STARTED, &method(:test_suite_started))
@mediator.add_listener(Test::Unit::TestSuite::FINISHED, &method(:test_suite_finished))
end
alias started_old started
def started(result)
started_old(result)
@benchmark_times = {}
end
alias finished_old finished
def finished(elapsed_time)
finished_old(elapsed_time)
benchmarks = @benchmark_times.sort{|a, b| b[1] <=> a[1]}
output_benchmarks(benchmarks, true)
benchmarks = benchmarks.slice(0,10) unless ENV['BENCHMARK'] == 'full'
output_benchmarks(benchmarks)
end
alias test_started_old test_started
def test_started(name)
test_started_old(name)
@benchmark_times[name] = Time.now
end
alias test_finished_old test_finished
def test_finished(name)
test_finished_old(name)
@benchmark_times[name] = Time.now - @benchmark_times[name]
end
def test_suite_started(name)
end
def test_suite_finished(name)
return unless ENV['BENCHMARK'] == 'full'
benchmarks = @benchmark_times.select{ |k,v| k.include?(name) }.sort{|a, b| b[1] <=> a[1]}
output_benchmarks(benchmarks, false, name) unless benchmarks.length == 0
end
def format_benchmark_row(tuple)
("%0.3f" % tuple[1]) + " #{tuple[0]}"
end
def output_benchmarks(benchmarks, use_logger=false, name=nil)
return if use_logger && !defined?(logger)
if name
header = "\nTest Benchmark Times: #{name}"
else
header = "\nOVERALL TEST BENCHMARK TIMES"
end
strings = benchmarks.map {|tuple| ("%0.3f" % tuple[1]) + " #{tuple[0]}"}
if use_logger
logger.debug header
logger.debug strings.join("\n")
else
puts header
puts strings
end
end
end
end