Time-was we didn't just have setup and teardown in our Tests (which are run for every single test case)... we could also have a startup/shutdown pair that ran once per proper Test-case class (ie once at the beginning of all tests in a set).
This was a perfect place to put run-once-only things - especially useful if, say, you wanted to run ruby-prof over your tests. You could put the RubyProf.start in startup and have it print out a callgraph in the shutdown...
ActiveSupport::TestCase doesn't let us have our startup/shutdown anymore... so what to do?
Fake it with at_exit
# quick-and-dirty class var to tell us if we've already registered the
# at_exit RubyProf function.
@@register_done = false
# register the stop-ruby-prof stuff
# We want it to spit out a RubyProf callgraph after it's run this test
# case.
# You can either: call this function directly in a single test case or
# test-suite eg: "register_rubyprof"
# If you pass a value to "RUN_RUBY_PROF" on the command-line - it will
# also run this register function for you. eg:
# RUN_RUBY_PROF=true rake test:units TEST=test/unit/widget_test.rb
def register_rubyprof
require 'ruby-prof'
return if @@register_done
p "starting RubyProf"
RubyProf.start
path_base = "#{RAILS_ROOT}/tmp/performance/ruby-prof"
p "started! Now registering exit-function"
at_exit do
p "All done - stopping RubyProf"
result = RubyProf.stop
p "Stopped! now printing call graph"
timestamp = Time.now.strftime('%Y-%m-%d-%H-%M-%S')
# try and make the callgraph filename meaningful to the test-run
filename_base = "rubyprof_#{self.class.name}_#{timestamp}"
# Print a call tree profile to text for kcachegrind to use
printer = RubyProf::CallTreePrinter.new(result)
printer.print(File.open("#{path_base}/#{filename_base}_calltree.txt", 'w'), 0)
p "All Done. Good luck profiling!"
end
@@register_done = true
end
# will setup the reguster-rubyprof function if we have set the
# RUN_RUBYPROF constant to true
setup :register_rubyprof if RUN_RUBY_PROF
2 comments:
There's startup and shutdown in test-unit 2.x. If you require the test-unit gem first, won't its features automatically be available in ActiveSupport::TestCase?
For some reason I thought that ActiveSupport::TestCase inherited from Test::Unit somehow...
I guess I could re-include it if it's necessary - but it seems a bit like overkill just to add a startup/shutdown.
Post a Comment