ruby で RSpec を使ってみる
最近ずっと rails の勉強をしているので学んだことをまとめているのですが、沢山学んだことがあって記事を書くのが難しいので公開までもうちょっと時間かかりそうです💦
全然ブログ更新していないので、今日は RSpec について勉強しました!
1.RSpec
RSpec というのは、プログラムの振る舞い(behaviour)を記述するためのドメイン特化言語(DomainSpecific Language:DSL)を提供するフレームワークだそうです。
簡単に言うとプログラムのテストを作るための言語ですね!
私が RSpec の基本的なことを学んだ記事。めちゃくちゃ参考になりました!💪
- 使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」
- 使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」
- 使えるRSpec入門・その3「ゼロからわかるモック(mock)を使ったテストの書き方」
- 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
2.テストの書き方
一番簡単なテストは以下の構文で書けます。
describe '計算' do it '1 + 1 は 2 になること' do expect(1 + 1).to eq 2 end end
いきなり複雑な書き方の解説は大変なので、テストで使う構文や機能を紹介します!
describe
:テストのグループ化を宣言。it
:テストを example という単位にまとめる。it do ... end
:この中の expectation がすべてパスすれば、その example はパスしたことになる。expect(X).to eq Y
:「XがYに等しくなる」という expectation 。context
:テストのグループ化を宣言。条件を分けるときに使うことが多い。before do ... end
:example の実行前に毎回呼ばれる。let(:foo) { ... }
: { ... } の中の値が foo として参照できる。subject { X }
: expectationをis_expected.to eq 'Y'
という形で書ける。shared_examples 'foo' do ... end
:再利用したいexampleを定義する。it_behaves_like 'foo'
:定義したexampleを呼び出す。shared_context 'foo' do ... end
:再利用したい context を定義する。include_context 'foo'
:定義した context を呼び出す。pending
:テストに保留マークをつける。ただし中断するのではなく、そのまま実行を続ける。 テストが失敗すればpending
としてマークされる。 ただし、テストがパスした場合は pending にならないことによりテストが失敗する。skip
:はそこから先は実行せずにテストを pending としてマークする。xit
:it を xit に変更するとその example は実行されず、pending 扱いになる。
また、RSpecのマッチャには以下のようなものがあります。
マッチャ | 意味 |
---|---|
to | 「~であること」を期待する |
not_to / to_not | 「~ではないこと」を期待する |
eq | 期待値と実際の値が「等しい」かどうかを検証する |
be | 等号・不等号と組み合わせて、値の大小を検証する |
be_truthy / be_falsey | その仕様にあわせて戻り値の真偽を検証する |
be true / be false | true もしくは false であることを厳密に検証する |
include | 「配列に~が含まれていること」を検証する |
raise_error | 「エラーが起きること」を検証する |
be_within(Y).of(X) | 「数値 X がプラスマイナス Y の範囲内に収まっていること」を検証する |
3.実際に書いてみる
スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)というサイトに、実際に手を動かして書ける解説があるので、やってみます!
ここから先の内容は上記のサイトに沿って進めた体験記なので、学習される方はそちらのサイトで学習してみてください〜!
所々違うやり方をしているので、つまずいた方にとって私のブログが何かの参考になればと思います笑
3-1. インストール
まず練習用に適当なディレクトリを作ってみます。私はrspec-practice
という名前のディレクトリにします!
rspec
という gem を使うので、rails を使っていれば Gemfile に gem の名前を書いてインストールすれば良いのですが、適当に作ったディレクトリにはそのままでは gem をインストールすることができません。
ディレクトリ内で以下のコマンドを実行します!
$ bundle init
これによりディレクトリ内にGemfile
というファイルが作成されます✨
この Gemfile に以下の1文を追記して保存します。
gem "rspec"
キャプチャの8行目です💡
保存したら以下のコマンドを実行すればOKです😊😊
$ bundle install --path vendor/bundle
念のためインストールできたか確認します。
rspec -v
コマンドで RSpec のバージョンが表示されればインストール成功です🎉
ちなみにこれ以降も元サイトでコマンドがspec
とされているところが、私の環境ではrspec
で動きました。
多分バージョンの違いだと思うのですが、spec
で先に進めない方はrspec
に置き換えて試してみてください👀
3-2. スペックファイルの用意
先程作ったディレクトリ内に、array_spec.rb
というファイルを作成します。
RSpec では_spec.rb
で終わるファイルがテスト用のファイルとして認識されるようです。
ここにテストコードを書いていきます!これをスペックファイルと呼びます。
スペックファイルの中身は以下のとおりにします。
(元サイトのとおりにやるとshould
が古いと言われるのでexpect
に書き換えています)
テストが通るか予想してみると、最初に空の配列を定義しているので、2つの example は通りそうですね🙂
3-3. RSpec の実行
ターミナルで以下のコマンドを実行することで、書いたテストを実行することができます!
rspec array_spec.rb
2つの example がパスして、テストが成功しています✨✨
3-4. テストに失敗してみる
あえてテストに失敗して、どんな実行結果になるか見てみます。
array_spec.rb
に以下のコードを追記します。
3つめの example ということになりますね💡
配列の要素を3つ作成し、それぞれの要素に空のハッシュを入れます。
配列の最初の要素だけにcat: "Nuko"
を代入したつもりでテストを書いたら、実際は全ての要素にcat: "Nuko"
が代入されていたという失敗例です😎
3つめの example が失敗しているので、赤でF
(Failures)と示されています。
エラーの読み方はそんなに難しくないですね。そのままなので割愛します!
3-5. documentation 形式フォーマットでの実行
documantation 形式とは、RSpec の実行結果を仕様書風に出力するものです。
RSpec 実行時に–format documentation (-fd)
というオプションをつけることでdocumantation 形式に出力できます。
先程のテストコードで試してみます!
ちょっと親切になったような…?
3-6. テスト成功にする
先程のテストをパスさせるには、以下の1行を書き換えます。
- @array = Array.new(3, Hash.new) # 間違い + @array = Array.new(3){ Hash.new } # 正解
3-7. spec ファイルの文字列に日本語を使う
describe や it に渡す文字列は日本語を使うこともできます。
文法的に違和感があったりするので、あえて日本語を使う必要はないと思いますが…笑