Closed11

Rspec復習

ピン留めされたアイテム
akiraakira

目的

就活に向けてPFのテストコードを書こうと思ったが、Rspecに触れてから時間が立ち過ぎて記憶吹っ飛んでるので、メモしながら記憶を回収する🫠

akiraakira

現時点

rspecとfactory_bot_railsを入れた。
以下コマンドを実行し、rspecの初期ファイル作成。

rails g rspec:install
Gemfile
group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem 'debug', platforms: %i[mri mingw x64_mingw]
  gem 'letter_opener_web'
  gem 'pry-rails'
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
end

ファイル構成はこんな感じ。

spec/requestsフォルダってなんだっけ?

リクエストスペックを置くための場所。このリクエストスペックでは、実際のHTTPリクエストをシミュレートしてアプリケーションの動作をテストすることができる。具体的には、コントローラを越えて、ルーティング、モデル、ビューが期待通りに働くかを確認するために使われる場合が多い。
APIのテストを行う場合などに特に便利らしい。

akiraakira

まずはざっと復習

model spec

アプリケーションのモデルの振る舞いをテストする。
詳細設計に対する単体テストの役割に近い
モデルのインスタンスを作成し、バリデーションエラーが発生する条件をテストする等。

グループ化

以下のブロック使用。

  • describe~do(テスト対象)
  • context~do(状況・条件)
  • it~do(テストケース)

検証メソッド🍵

マッチャーを使ってテストコード内の期待してる値と実際の値を比較しテスト。

テストデータ作成

factory botでテストデータを作成。

gem ‘factory_bot_rails’ 
spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { "テストコードマン" }
    sequence(:email) { |n| "rspec_#{n}@example.com" }
    # 他、パスワード等。
  end
end

作成したテストデータを利用するには。

createメソッド(DBに保存)
buildメソッド(DBに保存しない)

rails_helper.rbにFactoryBot記述をメソッド使用時に省略する設定をする。

spec/rails_helper.rb
config.include FactoryBot::Syntax::Methods
akiraakira

実装順を整理

  1. テストケースの洗い出し
  2. テストケースを記載する
  3. テストコードを記載する(it ~ do)
  4. factory botで作成したデータをテストコードに反映する
akiraakira

system spec

ユーザーが実際にブラウザを通してアプリケーションを操作する流れをテスト。
基本設計に対するシステムテストに近い。
複数のコンポーネントや機能が連携して正しく動くかをテストするという意味から、結合テストとしての役割も含む?むしろ結合テスト寄り?

capybara

主にRSpecのsystemスペックで使われる。ユーザーがブラウザで行う操作をシミュレートして、アプリケーションのエンドツーエンドのテストを行うのに便利。実際にブラウザを操作するようなテストを書けるから、ユーザー体験に近い形でのテストが可能。
(クリック、入力、選択、ページ遷移・・・)

処理の共通化

  • 変数宣言(let, let!)
    テストケース内で使用する変数を定義。

  • 事前処理(before ~ do ~ end)
    テストケース実行前の共通セットアップコード。
    各テストケースごとの繰り返し防止。

  • 処理のmodule化
    そのまんま。
    spec/supportフォルダにその設定ファイルやモジュールを格納するのが一般的。
    module化したファイルはrails_helper.rbファイルで読み込むのが良い。

spec/rials_helper.rb
RSpec.configure do |config|

 --省略--

  config.include "モジュール化したファイル名"
akiraakira

実装順を整理

  1. system specの準備
    ⇒ rails g rspec:system モデル名
    ⇒. create spec/system/users_spec.rb(ファイル作成)
  2. テストケースの作成する(まずはテストの内容よりテストケースを作れ!)
  3. テストコードを記載する
akiraakira

テスト結果を見やすくしようぜ。

.rspecファイルに下記を追記。

.rspec
--format documentation
体的にはどう変わる? ⇒ テスト結果がめちゃ見やすくなる!

.rspec ファイルに --format documentation を記述することで、RSpecのテスト実行結果のフォーマットが「ドキュメンテーションフォーマット」に変更されます。このフォーマットは、テストの結果をテストスイートの進行状況やテストケースごとの詳細な説明とともに表示します。これにより、テスト結果がより読みやすく、理解しやすくなります。

以下は、--format documentation を使用した場合のテスト実行結果の例です:


Task
  タスクの作成
    ユーザーが新しいタスクを作成できること
    ユーザーがタイトルを指定せずにタスクを作成しようとするとエラーになること
    ユーザーが内容を指定せずにタスクを作成しようとするとエラーになること
    ...

User
  ユーザーの作成
    ユーザーが有効な属性値を持っている場合
      有効であること
    ユーザーの名前がない場合
      無効であること
    ユーザーのメールアドレスがない場合
      無効であること
    ...

Finished in 0.12345 seconds (files took 0.12345 seconds to load)
132 examples, 0 failures

このように、各テストケースが階層的に表示され、テストケースの説明や状態がわかりやすくなります。テストケースが成功した場合は緑で、失敗した場合は赤で表示されます。また、テストケースの数や実行時間も表示されます。

  • -format documentation を使用することで、テストスイートの全体像やテストケースの詳細を素早く把握しやすくなり、テスト結果の理解やデバッグが効率的に行えるようになります。このフォーマットは特に大規模なプロジェクトで有用であり、テストスイートの可読性を向上させます。
akiraakira

systemスペックでテストを実行するブラウザの設定

  • Selenium
    Webアプリケーションの自動テストを行うためのツールセット。Capybaraと組み合わせて使うことで、実際のブラウザ操作をシミュレートしてテストを実行できるようになる。Capybaraでは、テストを行う際のブラウザとしてSeleniumを使う設定をすることが多い。

Capybaraを使ってsystemスペックを実装する場合、SeleniumというWebDriverを設定することで、テストが実際のブラウザ上で実行できるようになる・・という理解。

akiraakira

テストケースでは、「正常系」「異常系」で考えて洗い出す。

akiraakira

Systemテスト実装時に使うGem整理

Gemfile
group :test do
  # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
  gem "capybara"
  gem "selenium-webdriver"
  gem "webdrivers"
end

Capybara

ウェブアプリケーションのシステムテスト(統合テスト)を行うためのライブラリ。ユーザーがブラウザで行う操作をシミュレートすることができる。たとえば、ページへのアクセス、フォームの入力、リンクのクリックなどの操作をコードで書いてテストできる。これによって、実際のウェブアプリケーションの使用シナリオをテストすることが可能。

Selenium WebDriver

ウェブブラウザを自動操作するためのツール。Capybaraと組み合わせて使うことで、Capybaraが定義したウェブアプリケーションのテストシナリオを、実際のブラウザ(ChromeやFirefoxなど)上で実行できるようになる。これにより、実際のブラウザでユーザーが行う操作を再現しながらテストを行うことができる。

Webdrivers

Selenium WebDriverがブラウザを自動操作するために必要なブラウザドライバ(ChromeDriverやGeckoDriverなど)を自動で管理してくれるライブラリ。ブラウザやドライバのバージョンが更新された場合でも、このgemが適切なドライバを自動でダウンロードしてくれるため、テスト環境のメンテナンスが楽になる。

akiraakira

モジュールファイルをspec/supportディレクトリから読み込めるよう設定。
これをしないと、spec/support配下に作成したモジュールファイルが読み込まれない。

spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
このスクラップは2024/02/13にクローズされました