RSpecについて調べてみた。
RSpecとは
- テストフレームワークの1つ。
- rspec-railsがRails用。
- Gemでインストールできる。
- specによって、テストの対象がそれぞれ違う。
- 統合テスト用にsystem specとrequest specがある。
Unitテスト
model spec
- モデルをテストする。RailsにおいてはActive Recordをテストする?。
- 以下のようなものをテストする。
- バリデーション
- クラスメソッド
- インスタンスメソッド
- 最低限、以下のようなテストを含める。
- 有効な属性で初期化された場合は、モデルの状態が有効(valid)になっていること。
- バリデーションを失敗させるデータであれば、モデルの状態が有効になっていないこと。
- クラスメソッドとインスタンスメソッドが期待通りに動作すること。
- 以下のようなベストプラクティスがある。
- 期待する結果をまとめて記述(describe)している。
- example( it で始まる1行)一つにつき、結果を一つだけ期待している。こうすれば、exampleが失敗したときに問題が起きたバリデーションを特定できる。
- どのexampleも明示的である。itのあとに続く説明用の文字列は必須ではないが、省略してしまうとspecが読みにくくなる。
- 各exampleの説明は動詞で始まっている。
controller spec
- Rails機能テスト(ActionController::TestCase::Behavior)のRSpecラッパー。
- 単一のリクエストをシミュレートし、以下のような期待される結果を指定できる。
- 結果の指定方法には以下のようなものがある。
- https://relishapp.com/rspec/rspec-rails/v/5-0/docs/controller-specs
request spec
- request specは統合テストの軽量なラッパーである。
- JSONを返却するだけのAPIなど、リッチなUIを必要としないものが対象のテストならばsystem specではなくこっち。
- 以下のことができる。
system spec
- system specはRails独自のシステムテストのラッパーである。
- E2Eテストの1つ。
- Viewを含めてテストしたいならばrequest specではなくこっち。
- 実際のブラウザもしくはヘッドレスブラウザでテストを実行できる。
- 内部でCapybaraを利用する。CapybaraはDSLとドライバを提供するテストサポート用ライブラリである。
TDDとBDDの関係
TDD
TDDは以下の順序で進む。
1. プロダクトコードを書く前にテストコードを書き、それが失敗することを確認する (レッド)。
2. テストに成功するようにプロダクトコードを書く (グリーン)。
3. プログラムの振る舞いを変えないように、プロダクトコードの重複などを整理する (リファクタリング)。
4. (最初に戻る)。
重要なのは、テストが失敗するまでプロダクトコードを書いてはいけないということ。レッドの段階で、プロダクトコードに関係なくテストコードが常に通らないということを確認する。これはつまり、テストコードが確実であることを担保することを意味する。
BDD
- BDD (Behaviour Domain Development)
- BDDはTDDの派生と言える。
- BDDはUI駆動テストに広く使われている。
- 実行可能なサンプル(example)・・・テストメソッド(テストケース)のこと。
- 振舞(behaviour)・・・テストクラス(テストケースの集まり)のこと。
- エクスペクテーション(expectation)・・・アサート(コードの検証)のこと。
Factorybot
自動テストで目指すべき状態
- 前提として、正常系と異常系それぞれの利用ケースが明確に定義されている必要がある。
- 自動テストでまず目指すべき状態は、想定される正常系の利用ケースが通ることを網羅することである。
- もちろん異常系の利用ケースもきちんと弾く必要はある。
- 自動テストでは可能な限り有効なテストケースを網羅し、テストに必要な時間を削減する。
- 手動テストは必要に応じて使用するべきである。