テストの役割
テストはコードが動くことを一度確認するだけでなく、これからの変更で大切な振る舞いが壊れていないかを自動で確かめる仕組みです。Rails 8の新規アプリでは標準のテスト環境を使い、まずモデルのルールからテストします。
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
endbin/rails test test/models/article_test.rb1 runs, 2 assertions, 0 failures, 0 errorsリクエストをテストする
画面のURLへアクセスし、ステータスや表示内容を確認します。モデルのテストと組み合わせると、ルールと画面の両方を守れます。
require "test_helper"
class ArticlesControllerTest < ActionDispatch::IntegrationTest
test "一覧を表示できる" do
get articles_url
assert_response :success
assert_select "h1", "記事一覧"
end
endテストの名前は、何を保証するのかが読んで分かる文章にします。失敗したときは、テスト自体が間違っていないか、アプリの変更で本当に仕様が変わったのかを分けて考えます。
ログとエラー調査
Rails.logger.info("記事一覧を表示します")
Rails.logger.warn("記事が見つかりません")エラーが起きたら、例外クラス、メッセージ、発生したファイルと行、直前の入力を確認します。利用者へ内部情報をそのまま見せず、開発者が調査できるログへ必要な情報を残します。
公開前の確認
- 本番用データベースの設定とマイグレーションを確認する
- 秘密鍵、APIキー、パスワードを環境変数などで管理する
- 開発用のエラー詳細を本番画面へ表示しない
- モデル、主要画面、フォームのテストを実行する
- ログに個人情報や認証情報を記録しない
- 静的ファイル、メール、バックグラウンド処理の設定を確認する
Rails公式ガイドには、Railsアプリを公開するための設定やKamalを使ったデプロイの説明があります。サービスへ公開するときは、利用するホスティングサービスのRails 8対応状況も確認してください。
本番環境の設定を確認する
Railsの環境はdevelopment、test、productionに分かれます。本番用コマンドにはRAILS_ENV=productionを付け、開発用データベースを誤って操作しないようにします。
RAILS_ENV=production bin/rails about
RAILS_ENV=production bin/rails db:version
RAILS_ENV=production bin/rails routesEnvironment: production
Rails version: 8.0.2
Ruby version: 3.3.6本番用データベースのマイグレーションは、バックアップや作業手順を確認してから実行します。production指定を省略したコマンドがどの環境へ接続するかも、設定ファイルで確認してください。
アセットをプリコンパイルする
CSSやJavaScriptなどのアセットは、公開前に本番用へまとめます。Rails 8の標準構成でも、デプロイ先やビルド方法に応じてこの工程を確認します。
RAILS_ENV=production bin/rails assets:precompile
RAILS_ENV=production bin/rails assets:cleanRAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 bin/rails assets:precompilefind public/assets -maxdepth 1 -type f | head開発環境でプリコンパイルすると、古いmanifestが残って変更が反映されないことがあります。開発中に表示が更新されない場合は、状況を確認してからassets:clobberを使います。
Credentialsで秘密情報を管理する
暗号化されたRails Credentialsへ、環境ごとのAPIキーなどを保存できます。エディターが起動したらYAML形式で入力します。
bin/rails credentials:editweather:
api_key: replace-with-real-key
stripe:
secret_key: replace-with-real-secretapi_key = Rails.application.credentials.dig(:weather, :api_key)
raise "WEATHER_API_KEYが未設定です" if api_key.blank?bin/rails runner 'p Rails.application.credentials.dig(:weather, :api_key).present?'
# => true実際の秘密情報を学習ページへ入力しないでください。暗号化ファイルを共有する場合も、復号鍵は別経路で本番環境へ渡します。単純なローカル設定ならENV.fetchを使い、用途を区別します。
Kamalでデプロイする
Rails 8の新規アプリにはDockerfileとKamalの設定が用意され、Dockerを使うサーバーへデプロイできます。実際のサーバー契約やDNS設定が必要なので、まず設定ファイルを読むところから始めます。
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-accountexport KAMAL_REGISTRY_PASSWORD="your-access-token"
bin/kamal setupbin/kamal deploy
bin/kamal console
bin/kamal logsDeployed rails_notes
https://notes.example.com
HTTP 200IPアドレス、Dockerレジストリ、ドメイン、SSL、データベースの永続化は環境によって異なります。この例のIPやトークンをそのまま使わず、公式ガイドと利用するホスティングサービスの手順を確認してください。
練習問題
問題:公開記事の画面をテストする
記事一覧へアクセスし、成功レスポンスと記事タイトルの表示を確認するテストを書いてください。
test "記事タイトルを表示する" do
Article.create!(title: "テスト記事", body: "本文", published: true)
get articles_url
assert_response :success
assert_select "body", /テスト記事/
end