ぶうううん's Cafe

どうにかこうにか。備忘録に近い。

RSpecについて調べてみた。

RSpecとは

  • テストフレームワークの1つ。
  • rspec-railsRails用。
  • Gemでインストールできる。
  • specによって、テストの対象がそれぞれ違う。
  • 統合テスト用にsystem specとrequest specがある。

github.com


Unitテスト

model spec

  • モデルをテストする。RailsにおいてはActive Recordをテストする?。
  • 以下のようなものをテストする。
  • 最低限、以下のようなテストを含める。
    • 有効な属性で初期化された場合は、モデルの状態が有効(valid)になっていること。
    • バリデーションを失敗させるデータであれば、モデルの状態が有効になっていないこと。
    • クラスメソッドとインスタンスメソッドが期待通りに動作すること。
  • 以下のようなベストプラクティスがある。
    • 期待する結果をまとめて記述(describe)している。
    • example( it で始まる1行)一つにつき、結果を一つだけ期待している。こうすれば、exampleが失敗したときに問題が起きたバリデーションを特定できる。
    • どのexampleも明示的である。itのあとに続く説明用の文字列は必須ではないが、省略してしまうとspecが読みにくくなる。
    • 各exampleの説明は動詞で始まっている。

controller spec


request spec

  • request specは統合テストの軽量なラッパーである。
  • JSONを返却するだけのAPIなど、リッチなUIを必要としないものが対象のテストならばsystem specではなくこっち。
  • 以下のことができる。
    • 単一のリクエストを指定する。
    • 複数のコントローラー間で複数の要求を指定する。
    • 複数のセッションにわたって複数のリクエストを指定する。

system spec

  • system specはRails独自のシステムテストのラッパーである。
  • E2Eテストの1つ。
  • Viewを含めてテストしたいならばrequest specではなくこっち。
  • 実際のブラウザもしくはヘッドレスブラウザでテストを実行できる。
  • 内部でCapybaraを利用する。CapybaraはDSLとドライバを提供するテストサポート用ライブラリである。
    • DSL経由でのTest::UnitやRSpecの利用を可能にする。
    • ドライバを通してWebKitSeleniumの利用を可能にする。

TDDとBDDの関係

TDD

TDDは以下の順序で進む。
1. プロダクトコードを書く前にテストコードを書き、それが失敗することを確認する (レッド)。
2. テストに成功するようにプロダクトコードを書く (グリーン)。
3. プログラムの振る舞いを変えないように、プロダクトコードの重複などを整理する (リファクタリング)。
4. (最初に戻る)。

重要なのは、テストが失敗するまでプロダクトコードを書いてはいけないということ。レッドの段階で、プロダクトコードに関係なくテストコードが常に通らないということを確認する。これはつまり、テストコードが確実であることを担保することを意味する。

BDD

  • BDD (Behaviour Domain Development)
  • BDDはTDDの派生と言える。
  • BDDはUI駆動テストに広く使われている。
  • 実行可能なサンプル(example)・・・テストメソッド(テストケース)のこと。
  • 振舞(behaviour)・・・テストクラス(テストケースの集まり)のこと。
  • エクスペクテーション(expectation)・・・アサート(コードの検証)のこと。

Factorybot

  • Rspec標準で使える"fixture"に代わり、テストデータの準備をサポートするライブラリ。
  • "factory_bot_rails"はRails向けの拡張版Factorybot。

自動テストで目指すべき状態

  • 前提として、正常系と異常系それぞれの利用ケースが明確に定義されている必要がある。
  • 自動テストでまず目指すべき状態は、想定される正常系の利用ケースが通ることを網羅することである。
  • もちろん異常系の利用ケースもきちんと弾く必要はある。
  • 自動テストでは可能な限り有効なテストケースを網羅し、テストに必要な時間を削減する。
  • 手動テストは必要に応じて使用するべきである。

References