テスト全体の準備と後始末

最近は RSpec が流行みたいだけど、私は未だに Unit Test ですよ。

昔の RUnit (?) だと自分でテストを実行する必要があったけど、Test::Unit は勝手にテストを実行してくれる。

上の例では、テストクラスを「定義しただけ」で、テストが実行されています。これは、Kernel#at_exit と ObjectSpace.#each_object を使って実装されています。つまり、上の例ではテストは終了時の後処理として実行されます。
(るりまより)

便利なようだが、テストの準備と後始末ができない。

setup と teardown を使えば出来るけど、fixture 毎にやりたくない。

準備だけなら singleton を使えば出来るけど、後始末ができない。

大抵の場合は、これで問題ありません。が、そうでない場合は、 testrb コマンドや Test::Unit::AutoRunner 、各種 TestRunner クラスを使うことにより、明示的にテストを実行することができます。
(るりまより)

で、いろいろやってみた結果、こんな感じになった。

require 'test/unit/ui/console/testrunner'
require 'msort'       # テスト対象

class MSortTest <Test::Unit::TestCase

  def test_123_merge_45
    assert_equal [1, 2, 3, 4, 5], [1, 2, 3].merge([4, 5])
  end

  # ...
end

# ここで全体の準備

suite = Test::Unit::TestSuite.new 'merge test'
suite << MSortTest.suite
Test::Unit::UI::Console::TestRunner.run suite

# ここで全体の後始末

特定の fixture だけ実行したければ、

suite = Test::Unit::TestSuite.new 'merge test'
suite << MSortTest.new 'test_123_merge_45' # 実行したい fixture だけ登録
Test::Unit::UI::Console::TestRunner.run suite

これでイケるはず。

ここら辺は るりま にも、ちゃんと書いてなくて困る。