#自動テストのメリット
はじめに自動テストを行うメリットを列挙すると以下のものがあげられる。
・テスト全体にかかるコストの削減
・変更をフットワーク軽く行えるようになる
・環境のバージョンアップやリファクタリングのため
・適切な粒度のコードになりやすい
・確実性を高めることで開発効率をあげる
#自動テストを行うのに必要なツール
##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を使ってテストデータを作る。
FactroryBot.driven do
factory :user do
name { 'テストユーザー' }
email { 'test1@example.com' }
password { 'password' }
end
end
FactoryBot.driven do
factory :task do
name { 'テストを書く' }
description { 'テストの準備' }
user #users.rbで定義したuserという名前のFactoryと関連を生成する。という意味。
end
end
これでデータの準備完了。
そしてSpecのコードを書いていく
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
#補足
この例では簡単なテストなので簡潔に書けるが、さらに複雑なテストを書いていく場合にはbefore
、let
、shared_example
を使って共通化すると、簡潔でまとまったテストを記述することができる。
参照:https://qiita.com/hirotakasasaki/items/fa3b131e27f5d0694c2c
参照:https://qiita.com/yu-croco/items/d0088a75b033d46f8c39