Railsにおける「Modelテスト」「Controllerテスト」「Systemテスト」は、それぞれ異なるレイヤーの動作や品質を検証するための手段です。以下にそれぞれのテストの役割と特徴を詳しく説明します。
1. Modelテスト(単体テスト / Unit Test)
概要
Modelテストは、ActiveRecordモデルの単体機能を検証するテストです。データのバリデーション、インスタンスメソッド、スコープ、リレーションなどの正しさを確認します。
目的
-
モデルのバリデーションが正しく機能しているか
-
メソッドの出力が期待通りか
-
アソシエーションが正しく設定されているか
使用ツール
-
RSpec:
spec/models/ -
Rails標準:
test/models/
例(RSpec)
2. Controllerテスト(機能テスト / Functional Test)
概要
Controllerテストは、コントローラーのアクション単位で、HTTPリクエストに対するレスポンスやリダイレクト、テンプレートのレンダリングを検証します。
目的
-
正しいレスポンス(200, 302など)を返すか
-
適切なビューが描画されるか
-
必要なインスタンス変数がセットされているか
注意
Rails 5以降は、Controller単体のテストよりもRequestスペック(統合的なAPIテスト)の利用が推奨されることが多いです。
使用ツール
-
RSpec:
spec/controllers/またはspec/requests/ -
Rails標準:
test/controllers/
例(RSpec)
3. Systemテスト(統合テスト / End-to-End Test)
概要
Systemテストは、ユーザーの操作をシミュレートしながら、アプリケーション全体が期待通りに動作するかを検証します。ブラウザ操作を伴い、複数のコンポーネント(モデル、ビュー、コントローラーなど)を統合的にテストします。
目的
-
実際のユーザー行動に基づく動作確認
-
ボタンのクリック、フォーム送信、画面遷移の確認
-
JavaScriptの動作確認(Capybara + Selenium等)
使用ツール
-
RSpec + Capybara:
spec/system/ -
Rails標準:
test/system/
例(RSpec)
まとめ:テストの違い
| テスト種類 | 対象レイヤー | 主な目的 | 実行速度 | 実行範囲 |
|---|---|---|---|---|
| Modelテスト | ビジネスロジック | バリデーション・メソッドの確認 | 高速 | モデル単体 |
| Controllerテスト | アクション | レスポンス・リダイレクトの確認 | 中速 | コントローラー周辺 |
| Systemテスト | アプリケーション全体 | ユーザー操作の統合テスト | 低速 | 全レイヤー横断 |
これらのテストをバランスよく組み合わせることで、Railsアプリケーションの品質を高め、変更に強い堅牢なシステムを実現できます。必要に応じてテストダブル(モック、スタブ)やFactoryBotを導入することで、テストの効率と可読性も向上します。
ChatGPT4o 生成日:2025/06/21