【Rails】テスト
開発を進めるたびに、
開発した機能を確認するためにテストを同時に書いていく必要があります。
テストを書かないと、最初の方は問題なく動いていても機能を追加したときに新機能だけでなく既存の機能もきちんと動くかどうかその都度確認作業をしなければいけません。
テストは割愛せずコツコツ書いていきましょうー!
テストを書く際に
環境のバージョンアップやリファクタリングは必須条件です。
1.バージョンアップを行う
2.自動テストの落ち具合を確認
3.問題のある箇所を手当する
このような手順で進めていきましょう!
テストを書くことのメリット
1.テスト全体にかかるコストの削減
→自動テストを備えていれば動作確認の大部分を自動テストに任せることが出来ます。
2.変更をフットワーク軽く行える
→十分な自動テストがあれば、新しい変更に対して自動的にチェックできるので頻繁にリリース可能となります。
3.使用変更の影響の大きさの把握が容易である
→その変更がシステムにどう影響を与えるかの把握がとても容易になります。
4.仕様を記述したドキュメントとしても機能
→動作の詳細をチーム内で共有することが容易になります。
→テストを読むことで、そのメソッドにどんな振る舞いを期待しているのかを厳密に読み取ることが出来ます。
5.仕様やインターフェースを深く考えるきっかけとなる
・どんな状況をエラーにすべきか・エラー時にどのように動くべきか・どんな状況の組み合わせでその機能を使うことがありえるか
について網羅的に考えることができます。
6.適切な粒度のコードになりやすい
→盛りだくさんのメソッドやアクションを書くと、テストが書きにくくなります。そのため、テストが書きやすいコードを意識するだけで、おのずと管理しやすいコードになっていきやすいです。
7.確実性を高め開発効率を上げれる
→テストを書きながら開発を進めることで、常に動くことを確認しながら開発ができるので安心して開発を進めることが出来ます。
テスト用ライブラリ(現地点で登場したもの)
■RSpec
RubyにおけるBDD(Behaviour-Driven Development:振舞駆動開発)のためのテスティングフレームです。
BDDはTDD(テスト駆動開発)から派生したもので、動く仕様書でありテストでもあるBehaviour(振舞)をまず先に作り、その後でプロダクトコードを書いていくという開発手法のことを指します。
他にも有力なテストフレームワークとして、
Minitestがあります。
■Capybara
WebアプリケーションのE2E(End- to- End)テスト用のフレームワークです。
RSpecやMinitestなどのテスティングライブラリと組み合わせて使います。
■FactoryBot
テスト用データの作成をサポートするgemです。
以前はFactoryGirlという名前が付いていました。
テスト用のデータを簡単に用意し、テストから呼び出して利用することが出来ます。
テストの種類
システムテスト:ブラウザを通してアプリケーションの挙動を外部的に確認できる
統合テスト:いろいろな機能の連続が想定どおりに動くか確認できる
機能テスト:コントローラー単位のテスト
ユーザーから、「突然エラー画面になったのですが・・」と問い合わせしてくるといった出来事をシステムテストを書くことで未然に防ぐことができます。
▶モデルのテストの特徴
・検証やデータの制御、複雑なロジックの挙動などを個別のテストケースとして記述
・小さい粒度のテストを書くことができる
・システムテストでは行いづらい僅かな挙動の違いを確認するのに適している
▶統合テストの特徴
・モデルのテストとシステムテストの間を埋めるテスト
・UIから確認するほどのものでもなく、モデルや単体テストでは確認しにくいものをテストする
・APIのテストに利用されることが多い
▶ルーティング、メーラー、ジョブのテストの特徴
・モデルほど頻度は高くない
・複雑なルーティングや他のテストでは置き換えづらいメーラーやジョブのときに使用
Specの書き方
describe 'テスト対象', type: :Specの種類 do
context 'ある状況・状態' do
before do
#(context内を確認するのに必要な)事前十尾
end
it '仕様の内容(期待の概要)' do
#期待する動作
end
end
end
Rspecの用語
●テストケースを整理・分類→describe、context●テストコードを実行→before、it
用語解説
▶describe
describeには、
「何についての仕様を記述しようとしているのか」を記述します。
System Specでは、達成したい機能や処理の名前Model Specでは、モデルのクラス名やメソッド名
を記述していきます。
一番外側にあるdescribeには、
そのSpecファイル全体の主題を記述することが多いです。
階層の細かいdescribeには、より細かいテーマを記述します。
▶context
contextには、
テストの内容を「状況・状態」をバリデーションごとに分類するために使用します。
▶before
describeやcontext内にbeforeを記述すると、
対応するdescribeやcontextの領域内のテストコードを実行する前に、beforeのブロック内に書かれたコードが実行されます。
▶it
itには、期待する動作を文章とブロック内のコードで記述します。
ブロック内のコードは、期待する動作を仕様として読みやすいような特徴的な書き方をします。