エンジニア転職日記

エンジニア転職に向けての日記です

How to RSpec(導入)

概要

個人アプリケーション開発の過程で扱った技術をアウトプットしています。

Heroku、deviseに引き続き、今回はRSpecについて。

 

shangang7321.hatenablog.com

 

 

shangang7321.hatenablog.com

 

RSpecとは

テストとは

RSpecは、Ruby言語用のテストフレームワークです。テストとは、そのアプリケーションが意図した通りに動作しているかを自動で試験することです。動作確認自体はブラウザでもできますが、テストを自動化することには、以下のメリットがあります。

 

・テストのクオリティを担保できる。

手動でテストを行うと、以下のデメリットがあります。

 - 人為的なミスが生じる可能性がある。

  機能の確認忘れなどが発生する可能性があります。

 - 仕様変更の度にテストを行わなければならない。

  仕様変更の度に1から手作業で確認しなければならなくなります。

  テストコードがあれば、コマンド一つで確認できます。

 - どのように確かめたのか記録に残らない。

  テストコードを書くことで、それ自体が確認の記録になります。

 

・仕様を見極めることができる。

テストコードを書くことができるということは、そのコードを深く理解していることになります。また、途中から開発に加わった人も、テストコードを確認すれば、どのように動作すれば良いのかわかります。

 

このような理由から、動作確認テストは自動化する必要があります。

RSpecとは

RSpecは、Ruby言語用のテストフレームワークです。「R」はRuby、またはRails、「Spec」はテストを意味します。RSpec自体がRubyを基に作られており、テストコードの記述もRubyで行います。

使い方

RSpecのインストール

まず、RSpecのgemをインストールします。Gemfileの開発環境のテストのグループに記述します。

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
end

 

bundle installを行います。

% bundle install

 

RSpecを記述するためのディレクトリ、ファイルを生成します。

% rails g rspec:install

 

生成された.rspecというファイルに、以下のように記述します。これはテストコードの結果をターミナル上で可視化するためです。

--require spec_helper --format documentation

 

以上でテストコードを書くための事前準備は完了しました。

 

テストコードの生成

モデルのテストを行うコードを書くファイルを生成します。

今回は、Userモデルのテストを行います。

% rails g rspec:model user

 

Spec/modelsディレクトリに、user_spec.rbが生成され、このような記述になっています。

require 'rails_helper'

RSpec.describe User, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end

 

1行目でrails_helperというファイルを読み込んでいますが、これはRSpecを利用する際に、共通の設定を書いておくファイルです。

 

実際にテストコードを書くと、以下のようになります。

require 'rails_helper'
describe User, type: :model do
  describe 'ユーザー新規登録' do
    it "nicknameが空だと登録できない" do
      user = User.new(nickname: "", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000")
      user.valid?
      expect(user.errors.full_messages).to include("Nickname can't be blank")
    end
    it "emailが空では登録できない" do
      user = User.new(nickname: "abe", email: "", password: "00000000", password_confirmation: "00000000")
      user.valid?
      expect(user.errors.full_messages).to include("Email can't be blank")
    end
  end
end

 

上から解説していきます。

describe

describeは、「〜について記述する」という意味です。do 〜 endの間に、実際に行うテストのコードを記述し、そのテストが何を行っているのか説明しています。

it

itには、「どのような結果になるのか」を記述します。describeで大枠の検証内容を説明し、その個別具体的な検証結果を記述していきます。do 〜 endのテストを行ったらこうなるはず、というイメージです。

example

itに記述した内容の総称をexampleといいます。

expect(X).to eq Y

Xの結果はYになる、ということを実際に確認するコードです。

valid?

validは「正しい、妥当である」という意味です。ここでは、データが正しく保存されているかどうかを判定しています。作成したデータが正しく保存されていればtrueを、そうでなければfalseを返します。また、falseの場合は、その理由を書いたエラーメッセージを生成します。

errors.full_messages

valid?によって判定されたデータがfalseの場合のエラーメッセージを出力します。

include

includeは「含む」という意味です。expect(X).to include(Y)と記述すると、Xの中に Yが含まれているかどうかを判定します。

 

以上を踏まえて、実際にテストを行っているコードを見てみると、

user.valid?
expect(user.errors.full_messages).to include("Nickname can't be blank")

 

まず「userが正しく保存されているか」を確認します。ここでは、nicknameを空欄にしているので、falseです。valid?はfalseの場合エラーメッセージを生成します。その生成されたエラーメッセージをuser.errors.full_messageで取得しています。includeの中身がその内容です。

つまり、流れを整理すると、

 

ユーザーは正しく保存されましたか?

いいえ

それでは、エラーメッセージには、"Nickname can't be blank"が含まれていますか?

はい

 

という検証が行われています。このexampleでは、nicknameが空の場合登録できないことを確かめているので、これで検証完了ということになります。

 

実際にテストコードを実行してみます

% bundle exec rspec spec/models/user_spec.rb 

 

緑色の結果が表示されれば成功です。テストコードがエラーの場合や、テストの結果が違う場合は赤色の表示がされます。

 

参考

https://agency-star.co.jp/column/rspec

https://techacademy.jp/magazine/7733

https://qiita.com/tororopop/items/5e590f2e451b7ff0a371