Mixing Rake and Turn

D

Daniel Berger

Hi all,

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.

249 tests, 738 assertions, 0 failures, 0 errors
Loaded suite /usr/local/bin/rake
==============================================================================
pass: 0, fail: 0, error: 0
total: 0 tests with 0 assertions in 0.001122 seconds
==============================================================================

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?

Thanks,

Dan
 
T

Tim Pease

Hi all,

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:

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.

249 tests, 738 assertions, 0 failures, 0 errors
Loaded suite /usr/local/bin/rake
==============================================================================
pass: 0, fail: 0, error: 0
total: 0 tests with 0 assertions in 0.001122 seconds
==============================================================================

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).

Hope this explanation helps.

Blessings,
TwP
 
D

Daniel Berger

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).

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.

I'll bring that up on the Rake mailing list.

Regards,

Dan
 
D

Daniel Berger

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.

I'll bring that up on the Rake mailing list.

Regards,

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

Regards,

Dan
 
J

Jan Friedrich

Daniel said:
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
But you have now a dependency to turn. If you share your program with
others they have to install turn if they want to use the test task. :(

I prefer at the moment the following snipped on top of every test file:


require 'test/unit'
begin
require 'turn'
rescue LoadError; end


So you can running tests with or without turn installed.

Other ideas?


Regards,
Jan
 
D

Daniel Berger

Daniel said:
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

But you have now a dependency to turn. If you share your program with
others they have to install turn if they want to use the test task. :(

I prefer at the moment the following snipped on top of every test file:

require 'test/unit'
begin
require 'turn'
rescue LoadError; 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'))

t.ruby_opts << '-rturn' if $turn

This is what I plan on doing.

Regards,

Dan
 
J

Jan Friedrich

Daniel said:
t.ruby_opts << '-rturn'
This doesn't work if you have installed turn via rubygems:

/usr/bin/ruby1.8: no such file to load -- turn (LoadError)
rake aborted!

You cannot load gems with the -r option of the ruby interpreter.

Regards,
Jan
 
T

Tim Pease

This doesn't work if you have installed turn via rubygems:

/usr/bin/ruby1.8: no such file to load -- turn (LoadError)
rake aborted!

You cannot load gems with the -r option of the ruby interpreter.


t.ruby_opts << '-rubygems'
t.ruby_opts << '-rturn'

That should work, correct?

TwP
 
J

James Edward Gray II

t.ruby_opts << '-rubygems'
t.ruby_opts << '-rturn'

That should work, correct?

No, I don't think so.

Ruby's -r switch is not implemented by calling Ruby's require()
method, so RubyGems cannot override it.

James Edward Gray II
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,233
Members
46,820
Latest member
GilbertoA5

Latest Threads

Top