読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Railsのモデルを,簡単に単体テストしよう (フィクスチャを使わない,気軽なテストバッチ)

ruby Ruby on Rails テスト

Ruby on RailsでのWebアプリ開発では,何もかも「レール」が敷かれていて便利。

しかし「そのレールはいらない」という時もある。

レールが,かえって足かせになるのだ。


その一例が,単体テストのテストデータ(フィクスチャ)の面倒くささ。

Ruby on Railsのfixturesを,Excelから生成しよう (テストデータを管理しやすくするためのマクロ)
http://language-and-engineering.hatenablog.jp/entry/20091215/p1


Ruby on Railsのテストの書き方 (モデルの単体テストと,コントローラの機能テスト)
http://language-and-engineering.hatenablog.jp/entry/20091023/p1


フィクスチャを捨てよう。


以下では,

  • フィクスチャ不要
  • テストケースは好きな場所においてよい
  • テスト対象は,1バッチにつき1モデルのみ(複数でもよい)

のテスト方法。 Test::Unit の原点に戻っただけ,だが。


(1)テスト起動バッチ

まず,テストを開始して繰り返すためのバッチ。


あるモデルのテスト.bat

@rem 環境を定義

set RAILS_ROOT=D:\dev\rails\
set TESTCASE_FILE=D:\dev\scripts\test_my_model.rb

:start
cls


@rem テストを実行

cd %RAILS_ROOT%
ruby script/runner "eval(IO.readlines('%TESTCASE_FILE%').join)"
@echo.
@echo.


@rem 再実行するか判定

@set userkey=
@set /p userkey=もう一度実行(rを押下)/ 終了(それ以外のキー)?
@if not '%userkey%'=='' set userkey=%userkey:~0,1%
@if '%userkey%'=='r' goto start


バッチからRubyのコードを実行するための参考:

RailsアプリでActiveRecordを使ったバッチ処理 その2
http://brass.to/blog/rails_batch_2.html

  • railsのバッチ処理の内容を別ファイルから読み込みたい場合

(2)テストケース

次に,テストケースを書くRubyクラス。
バッチから呼び出される。


test_my_model.rb

require 'test/unit'

class MyModelTest < Test::Unit::TestCase

  # funcxという関数のテスト
  def test_funcx
    [
      [ 1, 1, 2 ],
      [ 1, 2, 3 ],
      [ 2, 2, 4 ]
        # ここにテストデータを書き足してゆく
    ].each{|data_arr|
      arg1            = data_arr[0]
      arg2            = data_arr[1]
      expected_result = data_arr[2]
      
      # railsのモデルを呼んでテストできる
      real_result = MyModel.funcx( arg1, arg2 )
      
      assert_equal(
        expected_result,
        real_result,
        "funcx( #{ arg1 }, #{ arg2 } ) should be #{ expected_result }"
      )
    }
  
  end
  
  
  # funcyという関数のテスト
  def test_funcy
    # ...
  end

end

参考:

Test::Unit
http://www.ruby-lang.org/ja/man/html/...

(3)テスト対象のクラス

テスト対象のモデルクラスは,ふつうにRailsのmodelsディレクトリに置いてあればよい。

(1)で ruby script/runner というコマンドがあったが,そのおかげでRailsのクラスは自動で読み込まれてくれるので。



これで,気軽に単体テストを実行可能。

テストデータが欲しければ,好きな方法で投入すればよい。

関数形式のメソッドなら,そもそもテストデータがなくてもよい。