>>>>> "Armin" == Armin Roehrl <armin / approximity.com> writes:
Armin> I'm using Rubyunit on code where I would like to have setup
Armin> executed only once and not for every test. Why? The setup
Armin> requires about 30 minutes, but its required to have
Armin> executed once for the tests.
Armin> Is there an easy way of doing that?
Armin> (Apart from modifying run_bare of class TestCase (testcase.rb)
This is how I do it ...
First a little background on how I setup my unit tests. Every file
containing unit tests registers the tests to be run in a TestSuite
object assigned to a global variable named $last_suite. A typical
test file might look like this ...
-- Example Test File -------------------------------------------------
$last_suite = RUNIT::TestSuite.new
class TestSample < RUNIT::TestCase
# ...
end
$last_suite.add_test(TestSample.suite)
class TestSomethingElse < RUNIT::TestCase
# ...
end
$last_suite.add_test(TestSomethingElse.suite)
if __FILE__ == $0 then
RUNIT::CUI::TestRunner.run ($last_suite)
end
----------------------------------------------------------------------
It can be run standalone, or with a separate test loader that scans a
directory for test files, loads the file and uses the $last_suite
variable to get a list of tests from the file that was just loaded.
Recently I wrote some unit tests for the Ruby DBI project. I wanted
to setup the database once at the beginning of the test run, and then
tear down when all the tests were done. I wrote a wrapper class like
the following and put it at the end of the test file.
----------------------------------------------------------------------
class TestWrapper < RUNIT::TestCase
def initialize(suite)
@test_suite = suite
end
def setup
# Stuff to do before all tests.
end
def teardown
# Stuff to do when all tests are done
end
def run(test_result)
setup
@test_suite.run(test_result)
teardown
end
end
$last_suite = DbiWrapper.new($last_suite)
----------------------------------------------------------------------
The wrapper class remembers the list of classes in the current
$last_suite variable. It then replaces the suite with itself. The
TestWrapper class is run, it will do its own setup once, invoke all
the tests it remembered internally, and then do its onetime tear down.
--
-- Jim Weirich jweirich / one.net http://w3.one.net/~jweirich
---------------------------------------------------------------------
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)