Ruby - Test::Unit, Minitest::Unit でユニットテスト!
Updated:
Ruby 標準のユニットテスト(単体テスト)フレームワーク Test::Unit, Minitest::Unit についてです。 Ruby でのユニットテストには、最近流行り(?)の振舞駆動開発に特化した RSpec や、他にも色々あります。
ユニットテストとは、プログラム単体のテストのことです。 システム開発経験者ならわかると思いますが、 要件定義→概要設計→詳細(PG)設計→製造→単体テスト→結合テスト→総合テスト→運用テスト→保守(案件・開発環境等によって異なりますが) の1工程です。
Test::Unit は Ruby 1.8 系では標準でしたが、1.9 系では Minitest::Unit で再実装されています。 ですから、今回の当方の環境 Ruby 1.9.3 では Minitest::Unit を実装しています。
以下、テスト方法についての記録です。
作業記録
1. テスト対象スクリプト作成
当然ですが、テストを実行する対象になるスクリプトを作成します。 例にならって以下のように作成してしました。 【 ファイル名:foo.rb 】
class Foo
def foo
"foo"
end
def bar
"foo"
end
end
bar はテストでエラーになるように意図的に誤った定義をしています。
2. ユニットテスト用スクリプト作成
ユニットテスト用のスクリプトを作成します。 これも例にならって以下のように作成しました。 【 ファイル名:test_foo.rb 】
require 'minitest/unit'
require 'foo'
MiniTest::Unit.autorun
class TestFoo < MiniTest::Unit::TestCase
def setup
@foo = Foo.new
end
def teardown
@foo = nil
end
def test_foo
assert_equal "foo", @foo.foo
end
def test_bar
assert_equal "bar", @foo.bar
end
end
- テストを実行するメソッドの名前は “test” で始まる必要があるようです。
- MiniTest::Unit.autorun の代わりに require ‘minitest/autorun’ を記述しても良いようです。
- setup は、各テストケースの実行前に実行するメソッドです。
- teardown は、各テストケースの実行後に実行するメソッドです。(あまり使わないようです)
- assert_equal(expected, actual, message = nil) は、与えられた期待値と実際の値が等しいか否かをテストします。
※他にどんな Assertion があるのかは module MiniTest::Assertions を参照。
3. ユニットテストの実行
作成したユニットテストスクリプトを実行します。
$ ruby test_foo.rb
Run options: --seed 7211
# Running tests:
.F
Finished tests in 3.578125s, 0.5590 tests/s, 0.5590 assertions/s.
1) Failure:
test_bar(TestFoo) [test_foo.rb:20]:
Expected: "bar"
Actual: "foo"
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
test_foo.rb の20行目で “bar” を期待していたのに “foo” が返ってきた、と言っています。 テストができているようです。
参考サイト
- Rubyアソシエーション: テスト
- library test/unit
- library minitest/unit
- module MiniTest::Assertions
- test-unit - Ruby用単体テストフレームワーク
以上。
Comments