I’ve got some test tasks that I’ve got setup via a Rakefile. I’d like
to see the output in the ‘turn’ format. However, simply sticking
‘require “turn”’ at the top of the Rakefile doesn’t quite do the
trick:
rake test_foo
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake/
rake_test_loader
Started
…
Finished in 0.440434 seconds.
Started
So, it’s giving me the nicer summary, but not the line by line result
for each test.
How do I get Rake to behave the way I want?
When you run your unit tests from within rake, they are actually run
in a separate ruby interpreter. Requiring turn into the Rakefile does
not require turn into the ruby interpreter where the unit tests are
run.
You’ll have to modify your test task to include turn …
ruby -Ilib -rturn your/test.rb
Or use the turn command
turn -Ilib your/test.rb
The fancy turn summary is coming out of the ruby interpreter running
rake. When you require ‘turn’ the test::unit library is also
included. test::unit sets up an empty test suite by default and
registers a teardown hook. If no tests are run by the time the
interpreter exits, the teardown hook is invoked and the empty test
suite is run (hence the empty result set).
pass: 0, fail: 0, error: 0
not require turn into the ruby interpreter where the unit tests are
The fancy turn summary is coming out of the ruby interpreter running
rake. When you require ‘turn’ the test::unit library is also
included. test::unit sets up an empty test suite by default and
registers a teardown hook. If no tests are run by the time the
interpreter exits, the teardown hook is invoked and the empty test
suite is run (hence the empty result set).
Hope this explanation helps.
Thanks Tim, it does.
In theory, then, I ought to be able to push “-rturn” onto the
TestTask#ruby_opts accessor. Unfortunately, there appears to be a bug
in Rake where the @ruby_opts instance variable is getting reset to an
empty array inside the “define” method in testtask.rb.
‘require “turn”’ at the top of the Rakefile doesn’t quite do the
Loaded suite /usr/local/bin/rake
When you run your unit tests from within rake, they are actually run
turn -Ilib your/test.rb
Thanks Tim, it does.
Dan
Upon further review, using TestTask#ruby_opts does work. The bug was
mine.
Anyhoo, for the sake of future Googlers, this is how you do it:
desc “Runs the test suite for the Foo class”
Rake::TestTask.new(‘test_foo’) do |t|
t.test_files = FileList[‘test/foo/*.rb’] # Or whatever
t.ruby_opts << ‘-rturn’
t.warning = true
end
So you can running tests with or without turn installed.
Other ideas?
In one project I have way too many files for that to be feasible. A
simpler approach would be to do this at the top of the Rakefile:
$turn = true
begin
require ‘turn’
rescue LoadError
$turn = false
end
t.ruby_opts << ‘-rturn’ if $turn
The only problem with that is that, as Tim mentioned earlier, you’ll
get the bogus “zero” test results at the end (in addition to the real
results). To avoid that, we could check to see if the turn.rb file
merely exists instead of actually loading it:
require ‘rbconfig’
include Config
$turn = false
$turn = true if File.exists?(File.join(CONFIG[‘sitelibdir’],
‘turn.rb’))