はじめに
- 本記事の目的(Docker環境でRSpecを使い、CI連携してテストが自動実行されるようにする)
- 想定読者(Rails開発初心者・RSpecやGitHub Actionsの導入をしたい方)
Docker構成(概要)
本環境では、Docker Compose を使って以下2つのコンテナを立ち上げています。
-
webコンテナ:Railsアプリケーションを起動(
dev.Dockerfile
を使用) -
dbコンテナ:MySQL 公式イメージ(
latest
)を使用
これらのサービスは docker-compose.yml
により定義・連携されており、開発環境の構築やRSpecの実行もこの構成上で行っています。
1. RSpecの導入
まずは rspec-rails を導入します。
Gemの追加
# Gemfile
group :development, :test do
gem 'rspec-rails'
end
その後、以下のコマンドでインストールします。
docker-compose exec web bundle install
※上記の web は、Docker Compose で定義されたサービス名(docker-compose.yml の services: 配下)です。
通常は web という名前になっていますが、人によって異なる場合があるため、以下のコマンドで現在稼働中のサービス名を確認しておくと安心です。
docker-compose ps
サービス名_web_1 のような名前が表示される場合、web の部分がサービス名になります。自分の環境に合わせて置き換えてください。
RSpecの初期化
RSpecの初期セットアップを行います。これにより spec ディレクトリなどが自動生成されます。
docker-compose exec web bundle exec rails generate rspec:install
これで以下のようなファイル群が生成されていればOKです:
• .rspec
• spec/spec_helper.rb
• spec/rails_helper.rb
.rspec に --require spec_helper
が書かれていればOKですが、以下のように--format documentation
を追記しておくと、テスト実行時の出力が読みやすくなります。
--require spec_helper
--format documentation
2. 最初のテストを書いてみる
試しに User モデルがバリデーションに通るか確認する簡単なテストを書いてみましょう。
まず、以下のように spec/models/user_spec.rb
を作成します。
# spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
it "is valid with a valid email and password" do
user = User.new(email: "test@example.com", password: "password")
expect(user).to be_valid
end
end
その後、テストを実行します。
docker-compose exec web bundle exec rspec
1 example, 0 failures
のように出れば成功です!
3. GitHub Actions に RSpec を組み込む(自動化設定)
RSpecを自動で実行させるために、GitHub Actionsの設定ファイル(ci.ymlなど)にRSpecのジョブを追加します。
以下は test: ジョブの例です(不要な部分は削除しています):
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql
env:
MYSQL_ROOT_PASSWORD: password
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping -h 127.0.0.1"
--health-interval=10s
--health-timeout=5s
--health-retries=3
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Run RSpec tests
run: bundle exec rspec
※ MYSQL_ROOT_PASSWORD などは .env に合わせて調整してください。
※最後の行run: bundle exec rspec
部分は非常に重要です!
初期状態の Rails アプリでは、以下のように rails test(Minitest)を使うようになっていることが多いため、必ず bundle exec rspec に書き換えてください。
- run: bin/rails db:test:prepare test test:system
+ run: bundle exec rspec
さらに、MySQL を使用している場合は、環境変数やユーザー設定などがローカルとGitHub Actionsで異なる可能性があります。
以下のように .env ファイルで定義した MYSQL_ROOT_PASSWORD などの値と、ci.yml 側の定義を 必ず一致させてください。
# ci.yml
services:
mysql:
env:
MYSQL_ROOT_PASSWORD: password # ← ここが .env の値と一致しているか確認
4. 実行結果を確認する
GitHubにプッシュしたあと、Actionsタブ を開くことで、CIが実行されていることを確認できます。
• ✅:テスト成功
• ❌:テスト失敗 → エラー内容がログに表示されます
ローカルで成功していてもCIで失敗する場合は、DB接続や環境変数などを疑いましょう。
5. 今後テストを追加するには?
モデルごとに spec/models/モデル名_spec.rb を追加していけばOKです。
例えば:
• Post モデル:spec/models/post_spec.rb
• Like モデル:spec/models/Like_spec.rb
また、コントローラーのテストは spec/requests または spec/controllers に記述するのが一般的です。
おわりに
RSpecを導入することで、コードの品質を担保しながら安心して開発を進められる環境が整いました。
今後は、コントローラーのテストやリクエストスペック、さらには FactoryBot や Faker を使った拡張も検討していきましょう!
普段の勉強記録や日々の学びはこちらのはてなブログで投稿しています。
技術の基礎から実践まで、わかりやすくまとめているのでぜひチェックしてみてください!
▶︎はてなブログ:育児パパエンジニアの勉強記録
https://taaa-0991.hatenablog.com/
ご質問・ご指摘があれば、コメントやXでお気軽にどうぞ!
👉[@taaa_099]( https://x.com/taaa_099 )