それが機能するはずです!
各テストは残りの部分から完全に分離する必要があるため、メソッドsetup
とtear_down
メソッドはテスト ケースごとに 1 回実行されます。ただし、実行フローをさらに制御したい場合もあります。次に、テストケースをsuitesにグループ化できます。
あなたの場合、次のようなものを書くことができます:
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))
は、含まれる一連のテスト ケースの実行の前後に 1 回だけ実行されるandメソッドTestDecorator
を提供する特別なスイートを定義します。setup
tear_down
これの欠点は、ユニットでテストを実行する方法をTest::Unitに伝える必要があることです。ユニットに多くのテストケースが含まれていて、そのうちの 1 つのみのデコレーターが必要な場合は、次のようなものが必要になります。
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)
Test::Unitのドキュメントドキュメントは、スイートがどのように機能するかについての適切な説明を提供します。