Ruby on Rails

テストと公開

変更による壊れ方を早く見つけ、公開前に確認すべき点を整理します。

01

テストの役割

テストはコードが動くことを一度確認するだけでなく、これからの変更で大切な振る舞いが壊れていないかを自動で確かめる仕組みです。Rails 8の新規アプリでは標準のテスト環境を使い、まずモデルのルールからテストします。

test/models/article_test.rbRUBY
require "test_helper"

class ArticleTest < ActiveSupport::TestCase
  test "タイトルが必須" do
    article = Article.new(title: "", body: "本文")
    assert_not article.valid?
    assert_includes article.errors[:title], "can't be blank"
  end
end
実行COMMAND
bin/rails test test/models/article_test.rb
成功時の例OUTPUT
1 runs, 2 assertions, 0 failures, 0 errors
02

リクエストをテストする

画面のURLへアクセスし、ステータスや表示内容を確認します。モデルのテストと組み合わせると、ルールと画面の両方を守れます。

test/controllers/articles_controller_test.rbRUBY
require "test_helper"

class ArticlesControllerTest < ActionDispatch::IntegrationTest
  test "一覧を表示できる" do
    get articles_url
    assert_response :success
    assert_select "h1", "記事一覧"
  end
end

テストの名前は、何を保証するのかが読んで分かる文章にします。失敗したときは、テスト自体が間違っていないか、アプリの変更で本当に仕様が変わったのかを分けて考えます。

03

ログとエラー調査

ログを出すRUBY
Rails.logger.info("記事一覧を表示します")
Rails.logger.warn("記事が見つかりません")

エラーが起きたら、例外クラス、メッセージ、発生したファイルと行、直前の入力を確認します。利用者へ内部情報をそのまま見せず、開発者が調査できるログへ必要な情報を残します。

04

公開前の確認

チェックリスト
  • 本番用データベースの設定とマイグレーションを確認する
  • 秘密鍵、APIキー、パスワードを環境変数などで管理する
  • 開発用のエラー詳細を本番画面へ表示しない
  • モデル、主要画面、フォームのテストを実行する
  • ログに個人情報や認証情報を記録しない
  • 静的ファイル、メール、バックグラウンド処理の設定を確認する

Rails公式ガイドには、Railsアプリを公開するための設定やKamalを使ったデプロイの説明があります。サービスへ公開するときは、利用するホスティングサービスのRails 8対応状況も確認してください。

05

本番環境の設定を確認する

Railsの環境はdevelopment、test、productionに分かれます。本番用コマンドにはRAILS_ENV=productionを付け、開発用データベースを誤って操作しないようにします。

本番の情報を確認COMMAND
RAILS_ENV=production bin/rails about
RAILS_ENV=production bin/rails db:version
RAILS_ENV=production bin/rails routes
表示例OUTPUT
Environment: production
Rails version: 8.0.2
Ruby version: 3.3.6

本番用データベースのマイグレーションは、バックアップや作業手順を確認してから実行します。production指定を省略したコマンドがどの環境へ接続するかも、設定ファイルで確認してください。

06

アセットをプリコンパイルする

CSSやJavaScriptなどのアセットは、公開前に本番用へまとめます。Rails 8の標準構成でも、デプロイ先やビルド方法に応じてこの工程を確認します。

プリコンパイルCOMMAND
RAILS_ENV=production bin/rails assets:precompile
RAILS_ENV=production bin/rails assets:clean
秘密情報なしでビルドする例COMMAND
RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 bin/rails assets:precompile
生成結果の確認COMMAND
find public/assets -maxdepth 1 -type f | head

開発環境でプリコンパイルすると、古いmanifestが残って変更が反映されないことがあります。開発中に表示が更新されない場合は、状況を確認してからassets:clobberを使います。

07

Credentialsで秘密情報を管理する

暗号化されたRails Credentialsへ、環境ごとのAPIキーなどを保存できます。エディターが起動したらYAML形式で入力します。

編集COMMAND
bin/rails credentials:edit
credentials.yml.encの内容YAML
weather:
  api_key: replace-with-real-key
stripe:
  secret_key: replace-with-real-secret
アプリから読むRUBY
api_key = Rails.application.credentials.dig(:weather, :api_key)
raise "WEATHER_API_KEYが未設定です" if api_key.blank?
設定確認COMMAND
bin/rails runner 'p Rails.application.credentials.dig(:weather, :api_key).present?'
# => true

実際の秘密情報を学習ページへ入力しないでください。暗号化ファイルを共有する場合も、復号鍵は別経路で本番環境へ渡します。単純なローカル設定ならENV.fetchを使い、用途を区別します。

08

Kamalでデプロイする

Rails 8の新規アプリにはDockerfileとKamalの設定が用意され、Dockerを使うサーバーへデプロイできます。実際のサーバー契約やDNS設定が必要なので、まず設定ファイルを読むところから始めます。

config/deploy.ymlYAML
service: rails_notes
image: your-docker-account/rails_notes

servers:
  web:
    - 203.0.113.10

proxy:
  ssl: true
  host: notes.example.com

registry:
  username: your-docker-account
初回デプロイCOMMAND
export KAMAL_REGISTRY_PASSWORD="your-access-token"
bin/kamal setup
更新デプロイCOMMAND
bin/kamal deploy
bin/kamal console
bin/kamal logs
成功時の確認OUTPUT
Deployed rails_notes
https://notes.example.com
HTTP 200

IPアドレス、Dockerレジストリ、ドメイン、SSL、データベースの永続化は環境によって異なります。この例のIPやトークンをそのまま使わず、公式ガイドと利用するホスティングサービスの手順を確認してください。

PRACTICE

練習問題

問題:公開記事の画面をテストする

記事一覧へアクセスし、成功レスポンスと記事タイトルの表示を確認するテストを書いてください。

解答例RUBY
test "記事タイトルを表示する" do
  Article.create!(title: "テスト記事", body: "本文", published: true)
  get articles_url
  assert_response :success
  assert_select "body", /テスト記事/
end