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