Railsでのテスト

RailsでのテストはJavaの素のJUnitでのテストとは違う部分がちょっとあります。
大きな違いはフィクスチャです。素のJUnitではもちろんDBに接続することなんて考慮されてませんが、Railsのテストはdatabase.ymlに記述されているDBに接続します。ですので、DBへの接続をテスト時にどうするかとか、面倒なことを気にしなくてOKです。

フィクスチャはテストの各メソッドの実行前にテーブルを一旦削除してからINSERTされるデータを記述します。フィクスチャの形式としては、YAMLCSVが使用可能です。動的なデータなデータ(例えばその日の日付とか)は、ERbと同じ形式で <%= %>という風に記述することができます。


Railsで用意されているテストには、unit、functional、integrationの3種類あります。

unit

基本的にモデルをテストするものですが、モデル以外のクラスをテストに使っても構いません。一番簡単なテストなので、できるだけここでテストできるようにコードを書いておくと便利です。つまりコントローラやビューではなく、モデルで実装できる部分はできるだけモデルに書いておくと、テストを書くのが少し楽になります。

functional

コントローラのテストを行うものですが、画面遷移についてはテストできないので、僕はあまり書きません。integrationの方が便利だと思います。

integration

HTTPリクエストに相当するコードをgetやpostメソッドを使って画面遷移やレスポンスをDOMオブジェクトとしてテストできます。便利なのは、外部からのアクセスとしてテストするのが普通ですが、実はモデルのコードを直接実行できるため、結構融通の利くテストを書くことができます。


というわけでブラウザ依存の部分(JavaScriptとか)はテストできないのでAjaxバリバリなアプリはテストが難しくなるかもしれませんが、その場合はfunctionalのテストをAjaxリクエストごとに書くと良いと思います。

書き方

テストのメソッド名はxUnit系のと一緒で"test"で始まるようにしてください。
使うメソッドは、unitなら基本的にassert_equal を覚えておけばOKです。他のメソッドもそんなに難しくないので、舞波本とかを参考に使ってみるといいでしょう。functionalやintegrationなら assert_response, assert_redirect, assert_template, assert_tag を使います。それ以外にも便利なメソッドもありますが、まあボチボチ使えばいいでしょう。

便利なツール

ZenTestのautotestが激しく便利です。インストールや使い方も簡単なので、是非使ってみてください。
http://rails.office.drecom.jp/takiuchi/archive/96

関連するトピック

xUnit系のテストの書き方だとあまり仕様書っぽくなりませんが、RSpecなどのBDD(Behavior Driven Development)ツールを使うと、より(英語として)自然な文章でコードを書くことができます。開発がどんどん進んでいる最中みたいなので、チェックしてみると面白いかもしれません。
http://rspec.rubyforge.org/
http://kakutani.com/trans/rspec/TUTORIAL_ja.html