(備忘録)Everyday Rails 第2章「RSpecのセットアップ」


「Everyday Rails - RSpecによるRailsテスト入門」

Railsを使用したアプリケーションを作成したものの、テストの記述が全然分からない、という状態になったので、RSpecの勉強をできる教材を探していたところ、なんとプロを目指す人のためのRuby入門 (チェリー本)の著者が翻訳を手がけた本を発見しました。
こちらのサイトから購入できます!
販売方法はなんと、購入金額を自由に設定できるという、画期的なシステムでした(最低購入価格は$19からですが)。
先日、なんとか1周は終わらせたのですが、全然理解できていない部分が多いので、復習がてらアウトプットしていきたいと思います!

第1章 「イントロダクション」

第1章はイントロダクションということで、この本のアウトラインや著者の想いなどが書かれています。

著者の思い

その中で、著者の考える基本的な信条というものがあり、

・テストは信頼できるものであること
・テストは簡単に書けること
・テストは簡単に理解できること(今日も将来も)

と書かれており、また

・とはいえ結局、一番大事なことはテストが存在することです。信頼性が高く、理解しやすいテストが書いてあることが大事な出発点になります。

とありました。
テストはどちらかと言うと、とっつきにくいイメージがあったので、学習することから逃げていた節もあったのですが、心を入れ替えてしっかりと取り入れていきたいと思います!

サンプルコードについて

GitHubからサンプルコードを入手できます。

第2章 「RSpecのセットアップ」

早速、本に従って進めていきたいところですが、いきなり、「テストスイート」という聞いたこともない単語に出くわしました。
スルーしてもいいのですが、最初が肝心なので、調べてみました。
テストスイートとは、

ソフトウェアテストの目的や対象ごとに複数のテストケースをまとめたもの。自動化テストにおいては、テストの実行単位となる。
 ソフトウェアテスト(動的テスト)の最小単位はテストケースといえるが、実際にテスト作業ではいくつものテストケースを組み合わせることによって不具合をあぶり出したり、確率的に十分なテストを行ったという結論を出したりする。このようなテスト目的やテスト対象に応じて、多数のテストケースを束ねたものをテストスイートという。

らしいです。
僕は知りませんでしたので、勉強になりました。

Gemfileのインストール

まずはRSpecをインストールする必要があります。

Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 3.6.0'
end

開発環境とテスト環境の両方で、rspec-railsを読み込みますが、本番環境では読み込みません。

テストデータベースの作成

config/database.yml
test:
  <<: *default
  database: db/test.sqlite3

接続可能なデータベースの作成を行います。
$ bin/rails db:create:all

RSpecの設定

続いて、RSpecのインストールを行います。
$ bin/rails generate rspec:install

インストール時に作成された.rspecファイルを以下のように変更すると、RSpecの出力がドキュメント形式になるので、非常に読みやすくなります。

.rspec
--require spec_helper
--format documentation

rspec binstubで起動時間の短縮を図る

Gemfile
group :development do
  gem 'spring-commands-rspec'
end

bundle install後、新しいbinstubを作成します。
$ bundle exec spring binstub rspec

RSpecを実行してみる

まだテストファイルは一個も作成していませんが、RSpecのインストールを確認する上でも、以下のコードで一度RSpecを起動してみるのがいいと思います。
$ bin/rspec

ジェネレータの設定

今後、アプリを作成していく中で、$ rails gコマンドを使用してコードを追加する際に、RSpec用のテストファイルも同時作成できるように設定を変更します。

config/application.rb
require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module Projects
  class Application < Rails::Application
    config.load_defaults 5.1

    config.generators do |g|
      g.test_framework :rspec,
        fixtures: false,
        view_specs: false,
        helper_specs: false,
        routing_specs: false
    end
  end
end

fixtures: false テストデータベースにレコードを作成するファイルの作成をスキップ
view_specs: false ビュースペックを作成しないことを指定
helper_specs: false ヘルパーファイル用のスペックを作成しないことを指定
routing_specs: false config/routes.rb用のスペックファイルの作成を省略

まとめ

これでRSpecのテスト実行するためのセットアップが整ったことになります。
色々と設定があって、大変ですね。
本によると、既存のtestディレクトリがあった場合は、rails testコマンドでテストの有無を確認し、必要ならRSpecへの移行を検討するべき、とのことでした。
あくまで準備段階が終わっただけですが、一苦労でした。