Railsアプリのブラックボックステスト

昨日のRails勉強会の帰りに松田さんと話してたネタです(お互い、早く懇親会に行ける身分に戻りたいですね)。

id:t-wadaさんとか角谷さんのプレゼンをみて、Cucumberを使いたいし、カバレッジとりたいなと思ったのですが、Railsの場合いい感じに外側からテストを書く方法がちょっと思い浮かびませんでした。
で、Mechanizeぽくいろいろアクセスできるテストライブラリを教えてもらったんですが(名前忘れた>< 助けて松田マン)、その前段として、同一プロセスでRailsアプリを走らせたいなぁ、と。

で、Rack(thinにアダプタはいってる。thin++)を使って試したらうまい感じに動きました。あとはこれを肉付けしていけばいいんじゃないでしょうか。セッションも引き継いだりしなきゃ行けないでしょうし。

簡単に説明すると、19行目でRailsアプリ本体を内包するRackのアプリを作り、あとはRackが用意しているテスト用のモックを使ってリクエスト送信、レスポンス取得をしています。
で、Rack::MockResponseがとれるので、それに対してテストを書く、と。assert_selectはそのままでは使えないのでHpricotでパースして検証していますが、このあたりはもう少し便利にやる方法はあるはず(hpricot-matcherとか、assert_selectに乗っけてしまう、とか)。

とりえあずコンセプトはこんな感じで行けるんじゃないですかね。

おまけ

これで受け入れテストを書いた場合、本番環境でもRackを使った方がいいと思う(というかそれで検証しているわけだし)ので、逆に言うとRackに乗せるのが流行る!! WEBrickMongrelも当然ThinやPassengerやFCGIも、上にRackを乗せられるはずなので、これからはRackを意識して使うのがいいんでしょうね。