library test/unit
要約
ユニットテストを行うためのライブラリです。
test/unit は minitest/unit を使って再実装されましたが、完全な互 換性がある訳ではありません。1.9 系で test/unit を使いたい場合は、以下の test-unit を RubyGems でインストールしてください。(本ドキュメントでは、 1.9 系については minitest/unit で再実装された test/unit につい て記述しています)
- Test::Unit - Ruby用単体テストフレームワーク: http://test-unit.rubyforge.org/index.html.ja
使い方
Test::Unit は以下のように使います。
まずテスト対象のソース(foo.rb)が必要です。
class Foo
def foo
"foo"
end
def bar
"foo"
end
end
次にユニットテスト(test_foo.rb)を書きます。テストを実行するメソッド(テストメソッド)の名前は 全て test_ で始まる必要があります。テストメソッドが実行される前には setup メソッドが必ず 呼ばれます。実行されたあとには、teardown メソッドが必ず呼ばれます。
require 'test/unit'
require 'foo'
class TC_Foo < Test::Unit::TestCase
def setup
@obj = Foo.new
end
# def teardown
# end
def test_foo
assert_equal("foo", @obj.foo)
end
def test_bar
assert_equal("bar", @obj.bar)
end
end
テストを実行するには上で用意した test_foo.rb を実行します。 デフォルトではすべてのテストが実行されます。
$ ruby test_foo.rb Loaded suite test_foo Started F. Finished in 0.022223 seconds. 1) Failure: test_bar(TC_Foo) [test_foo.rb:16]: <"bar"> expected but was <"foo">. 2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
test_bar だけテストしたい場合は以下のようなオプションを与えます。
$ ruby test_foo.rb --name test_bar Loaded suite test_foo Started F Finished in 0.019573 seconds. 1) Failure: test_bar(TC_Foo) [test_foo.rb:16]: <"bar"> expected but was <"foo">. 1 tests, 1 assertions, 1 failures, 0 errors, 0 skips
--name=test_barのような指定は行えません。
以下のようにすると help も表示されます。
$ ruby test_foo.rb --help
Usage: test_foo [options]
minitest options:
-h, --help Display this help.
-s, --seed SEED Sets random seed
-v, --verbose Verbose. Show progress processing files.
-n, --name PATTERN Filter test names on pattern.
--jobs-status [TYPE] Show status of jobs every file; Disabled when --jobs isn't specified.
-j, --jobs N Allow run tests with N jobs at once
--no-retry Don't retry running testcase when --jobs specified
--ruby VAL Path to ruby; It'll have used at -j option
-q, --hide-skip Hide skipped tests
-b, --basedir=DIR Base directory of test suites.
-x, --exclude PATTERN Exclude test files on pattern.
-Idirectory Add library load path
--[no-]gc-stress Set GC.stress as true
複数のテストを一度に行う場合、以下のように書いただけのファイルを実行します。
require 'test/unit' require 'test_foo.rb' require 'test_bar.rb'
いつテストは実行されるか
上の例では、テストクラスを「定義しただけ」で、テストが実行されています。 これは、require 'test/unit'した時にMiniTest::Unit.autorunを実行し ているためです。その結果、終了時の後処理として実行されるようになってい ます。
Error と Failure の違い
- Error
-
テストメソッド実行中に例外が発生した。
- Failure
-
アサーションに失敗した。
並列実行
1.9.3 単体テストの高速化のために、並列実行がサポートされました。
並列化の仕組みについては以下の記事をご覧ください。
- Rubyist Magazine 0033 号 詳解! test-all 並列化: http://jp.rubyist.net/magazine/?0033-ParallelizeTestAll
クラス
| class Test::Unit::TestCase | テストの基本単位(あるいは「テスト本体」)を表すクラスです。 テストを行うメソッド(テストメソッド)は TestCase のサブクラスのインスタンスメソッド として定義されます。テストメソッドの名前は「test」で始まっていなければなりません。 逆に、「test」で始まっているメソッドは全てテストメソッドと見なされます。 |
モジュール
| module Test::Unit | ユニットテストを行うためのモジュールです。 |
module Test::Unit::Assertions | 各種の assert メソッドを提供するモジュールです。 |
同時にrequireされるライブラリ
| test/unit/assertions | 各種の assert メソッドを提供します。 |
| test/unit/testcase | テストケースを記述するときに使います。 |