Zenn
🦫

RSpecテスト③教わったことまとめ(ブラックボックス,ホワイトボックス,機能要件,V字モデル,マイグレーション,Gemfile)

2025/03/10に公開

RSpecテストのコードを自分で書く際に、教わったこと・起きたエラーをまとめます。


1. テストの範囲と種類

テストの範囲や詳細度は、ブラックボックステストかホワイトボックステストかによって決まる。

ブラックボックステスト

  • システムの内部構造を考慮せず、外部からの入力と出力のみをテストする手法。
  • 仕様や要件に基づいてテストケースを作成し、意図した動作を満たしているか確認する。
  • 例:ユーザーがフォームに入力して送信したとき、期待通りのエラーメッセージが表示されるか。

つまり、「仕様通りに動くか?」をテストする。
シナリオ単位のテスト単位が増える。カバレッジ(カバー率・コード網羅率)は低い。
ユーザー視点なので、大まかなチェックがメインとなる(詳細度は低い)

ホワイトボックステスト

  • コードの内部構造やロジックを考慮してテストする手法。
  • 条件分岐やループなど、コードのすべてのパスが期待通りに動作するかを確認する。
  • 例:if文の分岐がすべて期待通りに処理されるかを確認するテスト。

コードのロジックをテストする、すべての分岐・条件をテストする
⇒個々の関数・クラスレベルでテストする
⇒細かいバグも検出できるが、テストにかけるコストが高くなる
コード視点なので、細かいロジックまでチェックする(詳細度は高い)

💡 結論: RSpecのテストは主にブラックボックステストの領域で活用されるが、詳細なテストではホワイトボックステストの要素も取り入れる。


2. RSpecとは?

RSpecはRailsのテストフレームワークであり、Railsのspec/フォルダ内にテストファイルを作成することで実行可能 になります。

  • RSpecは「モジュール」であり、「クラス」ではない。
  • RSpec.describe でテストを記述する。

💡 テストの目的:
システムが 「設計書通りに動作しているか?」 を確認すること。


3. 機能要件と非機能要件

機能要件とは

  • システムが 「何をするか」 に関する要件
    • 例:ユーザー登録機能、ログイン・ログアウト機能、商品購入機能
  • RSpecでの対応可能
    • モデルのテスト(バリデーション(例:メールアドレスが必須であること))
    • コントローラーのテスト(ユーザー登録時のレスポンスが適切か)

非機能要件とは

  • システムの 「品質やパフォーマンス」 に関する要件
    • 例:処理速度、負荷耐性、セキュリティ要件など。
  • RSpecではなく、別のテスト方法が使われることが多い
    • 負荷テスト、セキュリティテストなど

4. V字モデルとテスト

V字モデルは、開発工程とテスト工程が対応するモデル。
各開発フェーズに対応するテストが用意されることで、品質を確保する。

  要件定義        →  受け入れテスト(ユーザー視点)  
  基本設計        →  システムテスト(全体の動作確認)  
  詳細設計        →  結合テスト(複数の機能を組み合わせる)  
  実装(コード)  →  単体テスト(RSpecのメイン領域)  



以下、引用元。
https://blog.autify.jp/article/v-model
https://webrage.jp/techblog/v_shaped_mode/

📌 RSpecは主に
単体テスト(モデル・バリデーション)
結合テスト(システムテスト)
に使用される。


5. RSpecの実行方法

📌 RSpecのテストを実行するコマンド

bundle exec rspec spec/ --format documentation

または

bundle exec rspec spec/system/task_spec.rb

📌 実行前に、テスト用データベースを最新の状態にする

bundle exec rails db:migrate RAILS_ENV=test

🔹 開発環境・本番環境とは別に「テスト環境のデータベース」も存在するため、マイグレーションを適用する必要がある!

今回出た下記エラーが ActiveRecord::RecordInvalid に関連しているので、
「タスクの作成時にバリデーションエラーが発生している」ことが原因

ActiveRecord::RecordInvalid:
  Translation missing: ja.activerecord.errors.messages.record_invalid

rails db:migrate:status で tasks テーブルのカラムを確認!

bundle exec rails db:migrate:status

6. マイグレーション・Gemfile

https://qiita.com/___Eliri/items/4a21f192eb1bf9e9c76b#3-schemaファイル

マイグレーションとは?

マイグレーション(Migration)とは、データベースのテーブル構造を変更する仕組み
例えば、カラムの追加・削除、テーブルの作成、インデックスの追加 などを行う。
Railsでは、マイグレーションファイルを作成し、それを適用することでデータベースを更新できる。

📌 マイグレーションを作成する

bundle exec rails generate migration AddKeywordsToTasks keyword1:string keyword2:string keyword3:string

📌 マイグレーションを適用する

bundle exec rails db:migrate

開発環境では適用されても、テスト環境には適用されないため、以下を実行!

bundle exec rails db:migrate RAILS_ENV=test

Gemfileとは?

Gemfile は、Railsアプリケーションで使用するGem(ライブラリ)を管理するファイル

  • どの Gem(ライブラリ)を使うか定義する
  • 必要なGemを 一括インストール できる
  • 本番環境・開発環境・テスト環境ごとに 異なるGemを指定 できる

Gemfile のGemをインストール

Gemfile に書かれたGemをすべてインストール
すでにインストール済みなら bundle install で更新される

bundle install

開発・テスト・本番環境ごとに異なるGemを管理可能!


7. 今回のエラー解決方法

エラーの大半は ActiveRecord::RecordInvalid(バリデーションエラー) に関係していた。

エラー解決手順

  1. rails db:migrate:status で tasks テーブルのカラムを確認

    bundle exec rails db:migrate:status
    
  2. テスト環境にマイグレーションを適用

    bundle exec rails db:migrate RAILS_ENV=test
    
  3. save_and_open_page を使って、Capybara のテスト時のHTMLを確認

    before do
      save_and_open_page
    end
    

    Capybaraがどのページを表示しているのか確認!

  4. ログインしていないとテストが失敗する!

    before do
      sign_in user
      visit task_path(task)
    end
    

    ログイン処理を追加!


9. Capybaraのエラー対策

📌 Capybara::Ambiguous (要素が2つ以上見つかった)

within("form[action='#{task_path(task)}']") do
  fill_in "task[title]", with: Faker::Lorem.characters(number: 10)
  fill_in "task[keyword1]", with: Faker::Lorem.characters(number: 10)
  fill_in "task[keyword2]", with: Faker::Lorem.characters(number: 10)
  fill_in "task[keyword3]", with: Faker::Lorem.characters(number: 10)
  click_button "保存"
end

🔹 within を使って、特定のフォーム内の要素を対象にする!

📌 ボタンが2つある場合(検索ボタンと投稿ボタン)

find_button("投稿", match: :first).click

🔹 match: :first で、最初のボタンをクリックする!


Discussion

ログインするとコメントできます