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

## Rspecとは
[Wikipedia](https://en.wikipedia.org/wiki/RSpec)から引用すると、Rspecとは
> RSpec is a 'Domain Specific Language' (DSL) testing tool written in Ruby to test Ruby code.

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

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

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

ちなみに @jnchito さんの[こちら](https://speakerdeck.com/jnchito/number-kanrk06?slide=31)のスライドによると2015年時点では、利用者および情報量の観点ではRSpecが多数派のようです。

## Gemfile
今回は[こちら](https://github.com/rspec/rspec-rails)の公式ドキュメントを参考にRailsに導入していきます。

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

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

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

```console
$ 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に必須な設定ファイルが作成されます。

これで準備が完了です。

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

```console
$ bundle exec rspec
```

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

## Springによる高速化

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

[公式ドキュメント](https://github.com/rails/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を導入するにあたって、[こちら](https://github.com/jonleighton/spring-commands-rspec)を参考にSpringも利用することにしました。

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

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

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

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

追加したら、

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

これで準備は完了です。

あとは

```console
$ bundle exec bin/rspec
```

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

## 実行時間の調査

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

まず、テストコードを作成したいので、scaffoldを実行します。(scaffoldについても[記事](https://qiita.com/rebi/items/60c5c70c3eb3c339e4e7)にしているので、参考にしてみてください。)

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

```console
$ rails generate scaffold Task title:string priority:integer
```

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

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

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

```console: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