So soll es funktionieren!
Jeder Test sollte vollständig vom Rest isoliert sein, daher werden die Methoden setup
und tear_down
einmal für jeden Testfall ausgeführt. Es gibt jedoch Fälle, in denen Sie mehr Kontrolle über den Ausführungsablauf haben möchten. Dann können Sie die Testfälle in Suites gruppieren.
In Ihrem Fall könnten Sie so etwas wie die schreiben folgende:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
Test::Unit::UI::Console::TestRunner.run(MySuite.new(MyTestCase))
Die TestDecorator
definiert eine besondere Suite, die eine setup
und tear_down
Methode zur Verfügung, die nur einmal ausgeführt vor und nach dem Laufe des Satzes von test- Fälle, die es enthält.
Der Nachteil davon ist, dass Sie Test :: Einheit wie die Tests in der Einheit ausführen müssen. Für den Fall, enthält Ihr Gerät viele Testfälle und braucht einen Dekorateur für nur einen von ihnen Sie so etwas wie dies benötigen:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
class AnotherTestCase < Test::Unit::TestCase
def test_a
puts "test_a"
assert_equal("a", "a")
end
end
class Tests
def self.suite
suite = Test::Unit::TestSuite.new
suite << MySuite.new(MyTestCase)
suite << AnotherTestCase.suite
suite
end
end
Test::Unit::UI::Console::TestRunner.run(Tests.suite)
Die Dokumentation liefert eine gute Erklärung, wie Suiten arbeitet.
Zwei Testverfahren mit dem gleichen Namen führt zu der ersten Methode nicht gestartet wird. Sie könnten einen Flunk in den ersten Test setzen, und Tests würden noch bestehen. Ein Nebeneffekt der Cut-and-Paste-Programmierung. –
Ja, und es ist einfach. Dies wird abschließend in TestUnit implementiert. Siehe meine Post waaaay auf dieser Seite. – jpgeek