テスト全体の準備と後始末
最近は 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
これでイケるはず。
ここら辺は るりま にも、ちゃんと書いてなくて困る。