test-unitの基礎知識。
test-unitとは?
単体テスト
- 単一のプログラム部品(モジュール)を対象としたテスト
- クラス、メソッド、関数などの最小単位が対象
- 問題の早期発見が目的
- モジュール単位の動作の保証する
単体テストツール
ドライバ
- driver
- 最小単位の処理(関数等)を呼び出すツール
スタブ
- stub
- 最小単位の処理(関数等)のプログラムのダミー
test-unitの使い方
Test::Unit::TestCase
を継承したテスト用クラスを用意するtest_xxx
という名前でテスト用メソッドを用意する- ファイルを実行する
例) モデルUser
のメソッドgreeting
がHello!
を返すことを確認するテスト
下記の内容でファイルを作成する。
# user.rb require 'test/unit' class User def self.greeting 'Hello!' end end class TestUser < Test::Unit::TestCase def test_greeting assert_equal 'Hello!', User.greeting end end
メソッドの動作をテストする。
# テストが成功 $ ruby user.rb Loaded suite test Started . Finished in 0.000289 seconds. ------------------------------------------------------------------------------------- 1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 100% passed ------------------------------------------------------------------------------------- 3460.21 tests/s, 3460.21 assertions/s
# テストが失敗 # 大文字Hが小文字hになっている $ ruby test.rb Loaded suite test Started F ===================================================================================== Failure: test_greeting(TestUser) test.rb:11:in `test_greeting' 8: 9: class TestUser < Test::Unit::TestCase 10: def test_greeting => 11: assert_equal 'Hello!', User.greeting 12: end 13: end <"Hello!"> expected but was <"hello!"> diff: ? Hello! ? h ? ? ===================================================================================== Finished in 0.004249 seconds. ------------------------------------------------------------------------------------- 1 tests, 1 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 0% passed ------------------------------------------------------------------------------------- 235.35 tests/s, 235.35 assertions/s
test-unitの便利メソッド
starup
- テスト郡実行前に処理を実行する
shutdown
- テスト郡実行後に処理を実行する
setup
- 各テストの実行前に処理を実行する
cleanup
- テストが
passed
の場合にテスト実行後に処理を実行する
- テストが
teardown
- 各テストの実行後に処理を実行する
モックオブジェクトとは?
- テスト対象の処理を実行せず、引数の検証とテストを動かす最低限の出力を行う
- Rubyでモックオブジェクトを作るライブラリは複数存在する
- FlexMock
- MiniTest::Mock
- RR
- WebMock