1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Docker開発環境でRSpecを使ってGitHub Actionsで自動テストを設定するまで」

Posted at

はじめに

  • 本記事の目的(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 )

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?