Railsには自動テストという仕組みが用意されています。コードが変更されるたびに自動テストを動かしてエラーの有無をチェックすることで、コードに意図しない不具合や挙動変更が含まれることを防ぐことができます。今回からテストについて簡単に説明した後、前回までで作成したタスク管理アプリケーションにRspecとCapybaraを使ってシステムテストを実装していきます。
自動テストのメリット
開発において自動テストを設けるメリットは以下の通りです。
テスト工数の削減
自動テストを備えることで、リリース前や機能追加後のテストの大部分を自動テストに任せることができるため、テスト全体にかかるコストを抑えることができます。
リリースのしやすさ
自動テストの備えが十分あれば、新しい変更が既存の機能を損なうかを自動的にチェックできるため、頻繁にリリースがしやすくなります。
スムーズなバージョンアップやリファクタリング
Ruby on Railsや各種gemは頻繁にバージョンアップが行われます。
自動テストを備えることで変更のたびに既存おきのうやアプリケーションの挙動に問題がないかをチェックできるためバージョンアップやリファクタリング(コード修正)をスムーズに行えます。
仕様変更の影響の大きさがわかる
十分な量のテストが書かれていれば、コードを変更してテストを流すことでテストの落ち具合からシステム全体にどれほどの影響を及ぼすか検討できます。
仕様のドキュメントとして機能する
テストを記述することで、テストから期待している動作の詳細を読み取ることができるため、チーム内で仕様を共有できます。
仕様の完全性に繋がる
テストを書くことで、エラーを出すべき状況やエラー時の挙動、機能が使われる状況などを網羅的に考えることになり、仕様バグや詰めるべき要件を発見しやすくなります。
コードの粒度が適切になる
テストを描きやすいプロダクトコードを意識することで管理しやすい粒度でコードが構成されるようになります。
開発効率の向上
テストを描きながら開発することで追加したコードが動くことを確かめながら開発が進むため開発時間を節約することができます。
テストで利用するライブラリ
今回テストで利用するライブラリについて紹介します。
Rspec
RspecはRubyにおけるテスティングフレームワークです。要求仕様をドキュメントに記述する感覚でテストケースを記述できます。
「Spec」はRspecによって記述するテストを指す時に利用します。
Capybara
CapybaraはWebアプリケーションのE2Eテスト用のフレームワークです。RspecやMinitestなどのテスティングライブラリを組み合わせて利用します。
Webアプリケーションのブラウザ操作のシミュレーションができます。また実際のブラウザやHeadlessブラウザと組み合わせることで、JavaScriptの動作まで含めたテストを行えます。
FactoryBot
FactoryBotはテスト用のデータの作成をサポートするgemです。
FactoryBotを利用することでテスト用のデータを簡単に用意し、テストから呼び出して利用できます。
FactoryBotではDSLを使ってにたデータを効率よく定義することができ、ActiveRecordモデルに実装したコールバックなどの資産を直接的に活用してデータの状態や関係性を制御しやすくなっています。
テストの種類
Railsアプリケーションのテストには豊富な種類があります。RspecとMinitestのどちらのテスティングフレームワークを使っても以下のような種類のテストを記述できます。

よく利用されるテストを簡単に紹介します。
システムテスト
システムテストはE2E(End to End)テストに相当し、システム全体を通して行うテストです。
Webサービスの場合は、ユーザと同じようにブラウザを操作し、挙動が期待通りになっているかを確認します。
モデルテスト
モデルのテスtでは検証やデータの制御、複雑なロジックの挙動などを個別のテストケースとして記述します。小さい粒度のテストを書けるため、システムテストなどでは行いづらい、様々の条件下のわずかな挙動の違いを確認できます。
結合テスト
結合テストはモデルのテストとシステムテストの間を埋めます。モデルや単体テストでは確認しにくいものをテストします。特にAPIのテストに利用されることが多いようです。
これらはいずれも必要に応じて利用すべきテストですが、今回はテストの粒度として一番外側に位置するシステムテストを実装していきます。
System Specを書く準備
System Specを書くためにRspec、Capybara、FactoryBotをインストールします。
Rspecのインストールと初期準備
Gemfileにrspec-railsというgemを追加してbundleコマンドを実行することでRspecとRspecのRails用の機能をインストールできます。
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'rspec-rails', '~> 3.7'
end
$ bundle
gemのインストールが終わり次第、以下のgenerateコマンドを実行します。
これによりRspecに必要なディレクトリや設定ファイルが作成されます。
$ bin/rails g rspec:install
Running via Spring preloader in process 47303
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
spec/spec_helper.rbはRspecの全体的な設定を書くためのファイル、spec/rails_helper.rbはRails特有の設定を書くためのファイルです。
次にRailsアプリケーションを作成したときに自動で作成されたtestディレクトリを削除します。Rspecではspecというディレクトリ下にspecファイルを格納するためtestディレクトリは不要だからです。
$ rm -r ./test
Capybaraの初期準備
capybara本体はrails new時のbundle installで既にインストールされているため、Rspecでcapybaraを利用する準備を行います。spec/spec_helper.rbを以下のように編集します。
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
require 'capybara/rspec' -①
RSpec.configure do |config|
config.before(:each, type: :system) do -②
driven_by :selenium_chrome_headless
end
・・・
end
①はRspecでCapybaraを扱うために必要な機能を読み込むために追加します。
②はSystem Specを実行するドライバの設定をします。ドライバはCapybaraを使ったテスト/Specにおいて、ブラウザ相当の機能を利用するために必要なプログラムです。
今回System Specでは常にブラウザにHeadless Chromeを使います。
FactoryBotのインストール
テストデータ作成を支援してくれるFactoryBotを導入します。
Gemfileを以下のように編集し、bundleを実行します。
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'rspec-rails', '~> 3.7'
gem 'factory_bot_rails', '~> 4.11'
end
$ budle
以上でSystem Specを書く準備が整いました。今回はここまでです。
終わりに
今回はタスク管理アプリケーションにテストを実装する第1回として自動テストのメリットやテストで利用するライブラリの説明、System Specを書く準備をしました。
次回からはSpecの書き方について学んだ後、実際にSpecコードを書いていきます。
コメント