【初心者向け】RailsにRspecを導入してみた話


Rspecとは

Wikipediaから引用すると、Rspecとは

RSpec is a 'Domain Specific Language' (DSL) testing tool written in Ruby to test Ruby code.

自分なりに和訳してみると、

RSpecとはRubyによって書かれた、Rubyによるコードをテストするための'ドメイン固有言語'なテストツールである。

といった感じでしょうか。

つまりは、Ruby用のテストツールでして、Rubyベースのフレームワークのテストに使われています。

ちなみに @jnchito さんのこちらのスライドによると2015年時点では、利用者および情報量の観点ではRSpecが多数派のようです。

Gemfile

今回はこちらの公式ドキュメントを参考にRailsに導入していきます。

手順は簡単で、まずはGemfileを編集し、下記のコードを追加します。

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

その後、プロジェクトのディレクトリで

$ bundle install

$ rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

と入力すれば完了です。

bundle install でRSpecのダウンロードとインストールを行い、
rails generate rspec:installでRSpecに必須な設定ファイルが作成されます。

これで準備が完了です。

あとはテストコードを作成し、コンソールにて

$ bundle exec rspec

と叩けば、テストが実行されます。

Springによる高速化

ここまでの内容でRSpecを用いてテストを実施することができますが、Springを用いることで、テストの所要時間を短縮することができます。

公式ドキュメントには

Spring is a Rails application preloader. It speeds up development by keeping your application running in the background so you don't need to boot it every time you run a test, rake task or migration.

とありまして、こちらも和訳してみると、

SpringはRailsアプリケーションにおけるプリローダーです。アプリケーション実行時にバックグラウンドで起動し続けることにより、テストやレイクタスク、マイグレーション毎にアプリケーションを起動させる必要がなくなるので、開発の速度があげることができます。

といった感じでしょうか。

ちなみにSpringはRailsのバージョン4.2からrails newを実行時に自動でインストールされるようになっています。

というわけで、今回はRSpecを導入するにあたって、こちらを参考にSpringも利用することにしました。

こちらも利用は簡単です。

まずは、Gemfileに下記のように追加します。

Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 3.8'
  gem 'spring-commands-rspec'
end

先ほど示したGemfileにgem 'spring-commands-rspec'を追加しただけです。

追加したら、

$ bundle exec spring binstub rspec

とコンソールで入力し、スタブファイル(bin/rspec)を作成します。

これで準備は完了です。

あとは

$ bundle exec bin/rspec

と叩けばSpringとRSpecを用いたテストが実施されます。

実行時間の調査

準備ができたので、実際にテストコードの所要時間を比較してみます。

まず、テストコードを作成したいので、scaffoldを実行します。(scaffoldについても記事にしているので、参考にしてみてください。)

今回は下記のコマンドを実行しました。

$ rails generate scaffold Task title:string priority:integer

これによりRSpecのテストコードも自動で作成されますので、今回はこのテストコードを用います。

というわけでSpringを使った結果と使わなかった結果がこちらです。

Spring未使用
$ bundle exec rspec
(省略)
Finished in 3.66 seconds (files took 21.22 seconds to load)
27 examples, 0 failures, 13 pending
Spring使用
$ bundle exec bin/rspec
(省略)
Finished in 3.59 seconds (files took 2.29 seconds to load)
27 examples, 0 failures, 13 pending

比べてみますとSpring使用時の方が読み込みにかかった時間が圧倒的に短いですし、テスト自体の実行時間もわずかに速いです。

今回の例ですと、テストケースが40ケースですが、テストの数がより増えてくるとより威力が発揮されるのではないかと思います。

まとめ

RSpecを導入する場合は
1. Gemのインストール
2. コマンドの実行
とかなり少ないステップで用いることができます。

また、Springを用いることで、テストを高速化することができます。

ちなみにRSpecを導入するタイミングによっては、Minitestによって作られている「test」ディレクトリが残ったままになってしまいますので、削除するのをお忘れなく。

最後までお読みいただきありがとうございました。

参考文献

RSpec基礎情報(Wikipedia)
https://en.wikipedia.org/wiki/RSpec

RSpecとMinitest、使うならどっち?
https://speakerdeck.com/jnchito/number-kanrk06

RSpec公式リポジトリ
https://github.com/rspec/rspec-rails

Spring公式リポジトリ
https://github.com/rails/spring

spring-commands-rspec公式リポジトリ
https://github.com/jonleighton/spring-commands-rspec