RSpecでエンドツーエンドテスト

Web API のEnd-to-Endのテストを自動化したいなぁと思ってました。
ついでにそれがドキュメントとして読めたらいいなぁと思ってました。
あと、RubyRSpecの勉強もしたいなぁと思ってました。

Cucumberとかはシナリオとステップが別ファイルになってしまうし、求めていることに対して大掛かりだと感じたので、RSpecで書いてみることに。
いろいろ必要なユーティティを作ってみました。以下で公開中です。
https://github.com/bati11/itesttool

_givenブロックで前提条件の確認や下準備、_whenブロックで実行、_thenブロックで検証を行います。
下の例だと、_givenでリクエストヘッダを設定し、_whenでGETリクエストを送信し、_thenでレスポンスとして取得したJSONを検証しています。
JSON schemaを用いてJSON全体を検証したり、JSONPathを用いてJSONの要素を検証したりできます。

describe 'send GET request' do
  _given {
    headers 'referer' => 'http://local.example.com',
            'user_agent' => 'itesttool'
  }
  _when { get 'http://localhost:4567/index.json' }
  _then {
    # json schema
    res.body.should eq_schema_of 'json_schema/hello.json'

    # using jsonpath
    res['$.team'].should eq ['ABC']
    res['$.members..name'].should eq ['Ichiro', 'Jiro', 'Saburo']
    res['$.members..age'].should include 32
    res['$.members[::]'].should have(3).items
    res['$.members[::]'].should have_at_most(3).items
    res['$.members..name'].should all_be_type_of :string
    res['$.members..age'].should all_be_gt 11
    res['$.members..age'].should be_sorted :desc
  }
end

あとは、XMLXPathで検証したり、HTMLをCSSセレクタで検証したりできます。
もちろんPOSTリクエストも送れます。

Rubyは、拡張しやすくていいですねー。
もっと使えるものにしていきたいなぁ。

The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)