Rspecの便利なオプション

rspecを動かす際には様々なオプションを付けて動かすことができます。例えば、モデルのspecだけ動かしたい場合は、rspec spec/models/*などとすればmodelsの配下にある*_spec.rbのテストが走ります。

オプションを参照したい場合は、

```ruby
rspec --help
```
で参照できます。

この記事では、便利だと感じたRSpecを動かすためのオプションをピックアップして書き連ねて行こうと思います。

# この記事を書こうと思った理由
最近、この本を読んで非常にまとまっていて読みやすいなと思いました。しかし、この本はまだ翻訳がなくて、認知度もあまりないのかと思いました。

なので、この本に載っていることを少しでも紹介して、本の紹介とともに、自分に対しての備忘録としてもいいんじゃないかと思い、書こうと思いました。
[Effective Testing with RSpec 3](https://www.amazon.co.jp/Effective-Testing-RSpec-Build-Confidence/dp/1680501984)
![rspec3.jpg](https://qiita-image-store.s3.amazonaws.com/0/290687/8026ec69-a96f-4b3f-cad0-05f6ae7dea8b.jpeg)

# フィルタリングオプション
フィルタリングオプションは特定のテストだけ動かすようにするオプションを指します。

テストは基本的に必要なものだけ実行することになるかと思います。例えば、実装中のコントローラーのスペックだけ動かしたいなど。

そんな時に便利なオプションを紹介します。

## 特定のスペックだけ実行
```ruby
rspec spec/path
```
spec/pathで指定したパスの*_spec.rbファイルが実行されます。
userモデルのspecだけ動かしたい場合は

```ruby
rspec spec/models/user_spec.rb
```

## 特定の行のみ実行
特定のスペックの15行目のテストのみ実行したい場合。
15行目がcontextやdescribeの場合、そのcontext、describe内の全てのテストが実行されます。

```ruby
rspec spec/path:15
```

## 失敗するスペックだけ実行
```ruby
rspec --only-failures
```
このオプションを実行するには事前に

```ruby:spec/spec_helper.rb
RSpec.configure do |config|
  config.example_status_persistence_file_path = 'spec/examples.txt'
```
を設定する必要があります。

これはrspecを一度実行して、このfile_pathで指定したファイルにテスト結果を一時的に保管します。そして、保管した結果から失敗したものだけをピックアップするわけですね。なので、その保管するファイルを指定してやらないといけません。

適宜、指定するパスは変えてください。
パスを指定し、rspec --only-failuresを動かすと自動的にファイルができます。

## 次に失敗するスペックのみ実行
```ruby
rspec --next-failure
```
こちらもonly-failuresと同様に  config.example_status_persistence_file_path = 'spec/examples.txt'を指定する必要があります。

## 特定のexampleやdescribeのみ実行
```ruby
rspec --example '実行したいexampleやdescribeの名前の一部'
```
これが便利なのは、名前の一部だけで良いと言うところです。
例えば

```ruby:spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  describe 'test' do
    it 'outputs "test"' do
      p 'This is test example'
    end
  end
  example 'test2' do
    p 'This is test example2'
  end
end
```
このようなスペックがあったとするとして、以下を実行すると

```ruby
rspec --example 'st'
```
結果は以下のようになります。

```ruby
Run options: include {:full_description=>/st/}
"This is test example"
."This is test example2"
.

Finished in 0.011 seconds (files took 40.22 seconds to load)
2 examples, 0 failures
```
SQLでのLIKE '%st%'みたいなものですね。
'st'が入ったスペックを実行してくれます。

# アウトプットオプション
rspecの結果の出力を変えるようなオプションです。

## スタックトレースまで表示
```ruby
rspec --backtrace
```
--backtraceを指定すると失敗したスペックのスタックトレースも表示してくれます。
--backtraceは-bに省略もできます。

情報量が多いので、rspec --next-failure -bなどと実行するのが良いかもしれません。

## テストの一覧を出力
```ruby
rspec --dry-run
```
このコマンドはテストの一覧をテストを実行することなく、出力してくれます。
名前を確認する時などに良いかもしれませんね。

## テストの警告を出力
```ruby
rspec --warnings
```
このコマンドはspecファイル中の警告を表示してくれます。
スペルミスなどがあればそれも警告の内に入れ、出力してくれます。

テストを書き終えた後や、デプロイする段階などで確認するのが良いかもしれません。

## 時間のかかるテストを表示
```ruby
rspec --profile
```
—-profileは-pと省略することもできます。
これを実行すると、テストを全部実行した後、実行に最も時間がかかったものを数個、ランキングで出力してくれます。

rspecの実行に時間がかかる場合などに、どこがボトルネックになっているのかすぐに分かります。便利で結構よく使ってます。

## フォーマット

```bash
rspec --format documentation
```

テスト内容を詳しく表示してくれます。デフォルトは. F *などが表示されます。
デフォルトは以下の通り。

```bash
rspec --format progress
```

# まとめ
Effective testing with rspecを読んで、rspecは非常に奥深いものと感じましたしrspecを書いていて楽しさを感じるようになりました。
テストもやはり綺麗にかけたらうれしいですね。

洋書なので、もちろん全て英語ですが、それほど難しい英語でもないので、是非この機会に読んでみてはいかがでしょうか。