0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RSpecを使ったRailsのテストについて

Last updated at Posted at 2020-05-11

#自動テストのメリット
はじめに自動テストを行うメリットを列挙すると以下のものがあげられる。

・テスト全体にかかるコストの削減
・変更をフットワーク軽く行えるようになる
・環境のバージョンアップやリファクタリングのため
・適切な粒度のコードになりやすい
・確実性を高めることで開発効率をあげる

#自動テストを行うのに必要なツール

##RSpec
Rubyのテスティングフレームワークの一つ。
他にはMinitestなどもあるが、開発現場で広く使われているのはRSpecらしい(現役エンジニアの方から聞いた話。)

仕様書を書くようにテストコードを書くので、どのように書けばいいのかイメージしやすい。

参照:https://qiita.com/ShuntaShirai/items/465ddfc2c0f29ed93523

##Capybara
WebアプリケーションのE2E(End-to-End)テスト用フレームワークの一つ。
RSpecなどのテスティングライブラリと組み合わせて使う。
Webアプリケーションのブラウザ操作をシュミレーションできる。

参照:https://qiita.com/morrr/items/0e24251c049180218db4

##FactoryBot
テスト用データの作成をサポートするgem。
テスト用データを簡単に用意できて、テストから呼び出して利用することができる。

参照:https://qiita.com/morrr/items/f1d3ac46b029ccddd017

#テストの種類
「テスト」には様々な種類がある。

###全体的なテスト
・システムテスト(RSpecではSystem Spec, Feature Specと呼ばれている)
・結合テスト
・機能テスト

###個々の部品のテスト
・モデル
・ルーティング
・ビュー
・ヘルパー
・メーラー
・ジョブ

いずれも重要なテストだが、特に重要なのはテストの粒度として一番大きく外側に位置しているシステムテスト。

#System Specの書き方
代表的なSystem Specの例を示すためにタスク一覧表示機能のテストを書いていく。

タスク一覧表示機能のテストには
・ユーザーのデータ
・タスクのデータ
が必要なのでFactoryBotを使ってテストデータを作る。

spec/factories/users.rb
FactroryBot.driven do
  factory :user do
    name { 'テストユーザー' }
    email { 'test1@example.com' }
    password { 'password' }
  end
end
spec/factories/tasks.rb
FactoryBot.driven do
  factory :task do
    name { 'テストを書く' }
    description { 'テストの準備' }
    user #users.rbで定義したuserという名前のFactoryと関連を生成する。という意味。
  end
end

これでデータの準備完了。

そしてSpecのコードを書いていく

spec/system/tasks_spec.rb
require 'rails_helper'

describe 'タスク管理機能', type: :system do
  describe '一覧表示機能' do
    #before doでFactoryBotで作ったデータを読み込み、適宜オーバーライドしていく
    before do
      user_a = FactoryBot.create(:user, name: 'ユーザーA', email: 'a@example.com')
      FactoryBot.create(:task, name: '最初のタスク', user: user_a)
    end

    context 'ユーザーAがログインしているとき' do
      before do
        #visit [URL]でURLを指定
        visit login_path
        fill_in 'メールアドレス', with: 'a@example.com'
        fill_in 'パスワード', with: 'password'
        click_button 'ログインする'
      end

      it 'ユーザーAが作成したタスクが表示される' do
        #expect(表示場所).to have_content'内容' で「どこ」に「どんな内容」が期待されるのか書く
        expect(page).to have_content '最初のタスク'
      end
    end
  end
end

#補足
この例では簡単なテストなので簡潔に書けるが、さらに複雑なテストを書いていく場合にはbeforeletshared_exampleを使って共通化すると、簡潔でまとまったテストを記述することができる。

参照:https://qiita.com/hirotakasasaki/items/fa3b131e27f5d0694c2c
参照:https://qiita.com/yu-croco/items/d0088a75b033d46f8c39

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?