どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

ruby で RSpec を使ってみる

最近ずっと rails の勉強をしているので学んだことをまとめているのですが、沢山学んだことがあって記事を書くのが難しいので公開までもうちょっと時間かかりそうです💦
全然ブログ更新していないので、今日は RSpec について勉強しました!

1.RSpec

RSpec というのは、プログラムの振る舞い(behaviour)を記述するためのドメイン特化言語(DomainSpecific Language:DSL)を提供するフレームワークだそうです。
簡単に言うとプログラムのテストを作るための言語ですね!

私が RSpec の基本的なことを学んだ記事。めちゃくちゃ参考になりました!💪

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"

f:id:mistyrinth:20190720150523p:plain
キャプチャの8行目です💡

保存したら以下のコマンドを実行すればOKです😊😊

$ bundle install --path vendor/bundle

念のためインストールできたか確認します。
rspec -vコマンドで RSpec のバージョンが表示されればインストール成功です🎉
f:id:mistyrinth:20190720150928p:plain

ちなみにこれ以降も元サイトでコマンドがspecとされているところが、私の環境ではrspecで動きました。
多分バージョンの違いだと思うのですが、specで先に進めない方はrspecに置き換えて試してみてください👀

3-2. スペックファイルの用意

先程作ったディレクトリ内に、array_spec.rbというファイルを作成します。
RSpec では_spec.rbで終わるファイルがテスト用のファイルとして認識されるようです。
ここにテストコードを書いていきます!これをスペックファイルと呼びます。

スペックファイルの中身は以下のとおりにします。
(元サイトのとおりにやるとshouldが古いと言われるのでexpectに書き換えています)

gist.github.com

テストが通るか予想してみると、最初に空の配列を定義しているので、2つの example は通りそうですね🙂

3-3. RSpec の実行

ターミナルで以下のコマンドを実行することで、書いたテストを実行することができます!

rspec array_spec.rb

f:id:mistyrinth:20190720153959p:plain

2つの example がパスして、テストが成功しています✨✨

3-4. テストに失敗してみる

あえてテストに失敗して、どんな実行結果になるか見てみます。
array_spec.rbに以下のコードを追記します。
3つめの example ということになりますね💡

gist.github.com

配列の要素を3つ作成し、それぞれの要素に空のハッシュを入れます。
配列の最初の要素だけにcat: "Nuko"を代入したつもりでテストを書いたら、実際は全ての要素にcat: "Nuko"が代入されていたという失敗例です😎

f:id:mistyrinth:20190720155514p:plain

3つめの example が失敗しているので、赤でF(Failures)と示されています。
エラーの読み方はそんなに難しくないですね。そのままなので割愛します!

3-5. documentation 形式フォーマットでの実行

documantation 形式とは、RSpec の実行結果を仕様書風に出力するものです。
RSpec 実行時に–format documentation (-fd)というオプションをつけることでdocumantation 形式に出力できます。
先程のテストコードで試してみます!

f:id:mistyrinth:20190720160636p:plain

ちょっと親切になったような…?

3-6. テスト成功にする

先程のテストをパスさせるには、以下の1行を書き換えます。

- @array = Array.new(3, Hash.new)  # 間違い
+ @array = Array.new(3){ Hash.new }  # 正解

3-7. spec ファイルの文字列に日本語を使う

describe や it に渡す文字列は日本語を使うこともできます。

gist.github.com

f:id:mistyrinth:20190720161416p:plain

文法的に違和感があったりするので、あえて日本語を使う必要はないと思いますが…笑

続いて railsRSpec を使ってみるのですが、長くなってきたので次の記事にいきます!😊