Model, Controller, Systemテストの違い

Railsにおける「Modelテスト」「Controllerテスト」「Systemテスト」は、それぞれ異なるレイヤーの動作や品質を検証するための手段です。以下にそれぞれのテストの役割と特徴を詳しく説明します。


1. Modelテスト(単体テスト / Unit Test)

概要

Modelテストは、ActiveRecordモデルの単体機能を検証するテストです。データのバリデーション、インスタンスメソッド、スコープ、リレーションなどの正しさを確認します。

目的

  • モデルのバリデーションが正しく機能しているか

  • メソッドの出力が期待通りか

  • アソシエーションが正しく設定されているか

使用ツール

  • RSpec: spec/models/

  • Rails標準: test/models/

例(RSpec)

ruby
RSpec.describe Article, type: :model do it "タイトルがなければ無効であること" do article = Article.new(title: nil) expect(article).not_to be_valid end end

2. Controllerテスト(機能テスト / Functional Test)

概要

Controllerテストは、コントローラーのアクション単位で、HTTPリクエストに対するレスポンスやリダイレクト、テンプレートのレンダリングを検証します。

目的

  • 正しいレスポンス(200, 302など)を返すか

  • 適切なビューが描画されるか

  • 必要なインスタンス変数がセットされているか

注意

Rails 5以降は、Controller単体のテストよりもRequestスペック(統合的なAPIテスト)の利用が推奨されることが多いです。

使用ツール

  • RSpec: spec/controllers/ または spec/requests/

  • Rails標準: test/controllers/

例(RSpec)

ruby
RSpec.describe ArticlesController, type: :controller do describe "GET index" do it "正常にレスポンスを返すこと" do get :index expect(response).to have_http_status(:ok) end end end

3. Systemテスト(統合テスト / End-to-End Test)

概要

Systemテストは、ユーザーの操作をシミュレートしながら、アプリケーション全体が期待通りに動作するかを検証します。ブラウザ操作を伴い、複数のコンポーネント(モデル、ビュー、コントローラーなど)を統合的にテストします。

目的

  • 実際のユーザー行動に基づく動作確認

  • ボタンのクリック、フォーム送信、画面遷移の確認

  • JavaScriptの動作確認(Capybara + Selenium等)

使用ツール

  • RSpec + Capybara: spec/system/

  • Rails標準: test/system/

例(RSpec)

ruby
RSpec.describe "記事の作成", type: :system do it "記事を新規作成できること" do visit new_article_path fill_in "Title", with: "テスト記事" fill_in "Body", with: "テスト本文" click_button "Create Article" expect(page).to have_content "記事が作成されました" end end

まとめ:テストの違い

テスト種類 対象レイヤー 主な目的 実行速度 実行範囲
Modelテスト ビジネスロジック バリデーション・メソッドの確認 高速 モデル単体
Controllerテスト アクション レスポンス・リダイレクトの確認 中速 コントローラー周辺
Systemテスト アプリケーション全体 ユーザー操作の統合テスト 低速 全レイヤー横断

これらのテストをバランスよく組み合わせることで、Railsアプリケーションの品質を高め、変更に強い堅牢なシステムを実現できます。必要に応じてテストダブル(モック、スタブ)やFactoryBotを導入することで、テストの効率と可読性も向上します。

ChatGPT4o 生成日:2025/06/21