test-unitについて

test-unitの基礎知識。

test-unitとは?

単体テスト

  • 単一のプログラム部品(モジュール)を対象としたテスト
    • クラス、メソッド、関数などの最小単位が対象
  • 問題の早期発見が目的
  • モジュール単位の動作の保証する

単体テストツール

  • ドライバ

    • driver
    • 最小単位の処理(関数等)を呼び出すツール
  • スタブ

    • stub
    • 最小単位の処理(関数等)のプログラムのダミー

test-unitの使い方

  1. Test::Unit::TestCase を継承したテスト用クラスを用意する
  2. test_xxx という名前でテスト用メソッドを用意する
  3. ファイルを実行する

例) モデルUser のメソッドgreetingHello! を返すことを確認するテスト

下記の内容でファイルを作成する。

# 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

参照

Rails テスティングガイド - Railsガイド