【Rails】RSpec、Capybara、FactoryBotの使い方


テスト用ライブラリ

・RSpec
 RubyにおけるBDD(振舞駆動開発)のためのテスティングフレームワーク。
 Rspecを利用する上で、「テスト」ではなく「spec」という用語を利用する。

・Capybara
 WebアプリケーションのE2E(End-to-End)のテスト用フレームワーク。Rail5.1からRailsに同梱済。
 MinitestやRSpecなどのテスティングライブラリと合わせて使う。

・FactoryBot
 テスト用データの作成をサポートするgem。
 テスト用のデータを簡単に用意し、テストから呼び出して利用することができる。
 一般にデータを作成することを簡単にする仕組みは「ファクトリ」と呼ばれている。

事前準備

Rspec

Gemfileにて以下の文を追加し、RSpecのRails用の機能が追加される。

gem 'rspec-rails','~>3.7'

$bundle install

gemのインストールが終われば、以下のgenerateを実行。

$ rails g rspec:install

最後にRailsアプリケーションを作成した時に自動で作られたtestディレクトリを削除。
理由としては、Minitestを使う場合にはtestディレクトリ下にテストファイルを格納していくが、Rspecではspecというディレクトリ下にファイルを格納していくため。

$rm -r ./test

Capybara

Capybaraはrails newの時にbundle installによりすでにインストールされているので、
RspecでCapybaraを利用するための準備を行う。
spec/spec_helperにて編集を行う。

#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
↑この文を追加
# rspec-expectations config goes here. You can use an alternate

FactoryBot

Gemfileにて以下の文を追加。

gem 'factory_bot_rails','~>4.11'

$ bundle install

specの書き方

・itに到達する前にdescribeやcontextを何個も重ねて使うことができる。(type指定のみ外側のdescribeのみ使用可能)
・内部のdescribe、context、itを並べて複数記述することもできる。

describe [テスト対象] , type: [Specの種類] do

 context [ある状況・状態] do
  before do
   [事前準備]
  end

  it [期待の概要] do
  [期待する動作]
  end
 end
end

用語の意味

◆テストケースを分類・整理する・・・・・・・describe、context
◆テストコードを実行する・・・・・・・・・・before、it

describe
describeには、何について仕様を記述しようとしているのか(テストの対象)を記述。

context
contextは、テストの内容を「状況・状態」のバリエーションごとに分類するために利用。
ユーザーの入力内容が正しいかどうか、ログインしているかどうか、管理者かどうかといった、各種の条件をcontextに記述し、続くブロックの中にそのような条件下で想定する動作を記述していく。

before
beforeはその領域全体の「前提条件」を実現するためのコードを記述する場所。
describeやcontext内にbeforeを記述すると、対応するdescribeやcontextの領域内のテストコードを実行する前に、beforeのブロック内に書かれたコードを実行。

it
末端のテストケース。itは期待する動作を文章と、ブロック内のコードで実行。
itの中に記述したものが期待通りに対象が動作すれば、Specが1件成功したことになる。

beforeに書くような処理は、内部のitの中に書くことも出来るが、前提条件なのであればbeforeに書くほうがテストとして読みやすくなる。
またbeforeの処理は、itが実行される度に新たに実行されるので、あるテストケースのせいで別のテストケースが影響されることは基本的には無い。

テストの実行コマンド

$ bundle exec rspec テストしたいファイル

参考著書

現場で使える Ruby on Rails 5速習実践ガイド