Rspec復習
目的
就活に向けてPFのテストコードを書こうと思ったが、Rspecに触れてから時間が立ち過ぎて記憶吹っ飛んでるので、メモしながら記憶を回収する🫠
現時点
rspecとfactory_bot_railsを入れた。
以下コマンドを実行し、rspecの初期ファイル作成。
rails g rspec:install
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のテストを行う場合などに特に便利らしい。
まずはざっと復習
model spec
アプリケーションのモデルの振る舞いをテストする。
詳細設計に対する単体テストの役割に近い
モデルのインスタンスを作成し、バリデーションエラーが発生する条件をテストする等。
グループ化
以下のブロック使用。
- describe~do(テスト対象)
- context~do(状況・条件)
- it~do(テストケース)
検証メソッド🍵
マッチャーを使ってテストコード内の期待してる値と実際の値を比較しテスト。
テストデータ作成
factory botでテストデータを作成。
gem ‘factory_bot_rails’
FactoryBot.define do
factory :user do
name { "テストコードマン" }
sequence(:email) { |n| "rspec_#{n}@example.com" }
# 他、パスワード等。
end
end
作成したテストデータを利用するには。
createメソッド(DBに保存)
buildメソッド(DBに保存しない)
rails_helper.rbにFactoryBot記述をメソッド使用時に省略する設定をする。
config.include FactoryBot::Syntax::Methods
実装順を整理
- テストケースの洗い出し
- テストケースを記載する
- テストコードを記載する(it ~ do)
- factory botで作成したデータをテストコードに反映する
system spec
ユーザーが実際にブラウザを通してアプリケーションを操作する流れをテスト。
基本設計に対するシステムテストに近い。
複数のコンポーネントや機能が連携して正しく動くかをテストするという意味から、結合テストとしての役割も含む?むしろ結合テスト寄り?
capybara
主にRSpecのsystemスペックで使われる。ユーザーがブラウザで行う操作をシミュレートして、アプリケーションのエンドツーエンドのテストを行うのに便利。実際にブラウザを操作するようなテストを書けるから、ユーザー体験に近い形でのテストが可能。
(クリック、入力、選択、ページ遷移・・・)
処理の共通化
-
変数宣言(let, let!)
テストケース内で使用する変数を定義。 -
事前処理(before ~ do ~ end)
テストケース実行前の共通セットアップコード。
各テストケースごとの繰り返し防止。 -
処理のmodule化
そのまんま。
spec/supportフォルダにその設定ファイルやモジュールを格納するのが一般的。
module化したファイルはrails_helper.rbファイルで読み込むのが良い。
RSpec.configure do |config|
--省略--
config.include "モジュール化したファイル名"
実装順を整理
- system specの準備
⇒ rails g rspec:system モデル名
⇒. create spec/system/users_spec.rb(ファイル作成) - テストケースの作成する(まずはテストの内容よりテストケースを作れ!)
- テストコードを記載する
テスト結果を見やすくしようぜ。
.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
を使用することで、テストスイートの全体像やテストケースの詳細を素早く把握しやすくなり、テスト結果の理解やデバッグが効率的に行えるようになります。このフォーマットは特に大規模なプロジェクトで有用であり、テストスイートの可読性を向上させます。
systemスペックでテストを実行するブラウザの設定
- Selenium
Webアプリケーションの自動テストを行うためのツールセット。Capybaraと組み合わせて使うことで、実際のブラウザ操作をシミュレートしてテストを実行できるようになる。Capybaraでは、テストを行う際のブラウザとしてSeleniumを使う設定をすることが多い。
Capybaraを使ってsystemスペックを実装する場合、SeleniumというWebDriverを設定することで、テストが実際のブラウザ上で実行できるようになる・・という理解。
テストケースでは、「正常系」「異常系」で考えて洗い出す。
Systemテスト実装時に使うGem整理
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が適切なドライバを自動でダウンロードしてくれるため、テスト環境のメンテナンスが楽になる。
モジュールファイルをspec/supportディレクトリから読み込めるよう設定。
これをしないと、spec/support配下に作成したモジュールファイルが読み込まれない。
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }