ここしばらく、Rails 3.x ベースで簡単な開発をしています。

どうせやるなら、新しいことやらないと、ということで、今回は Behavior Driven 開発をしようとしてました。Cucumberでの、振る舞いベースの要求仕様策定から、RSpecを用いた Test Driven な開発へと落とし込んで行く方法です。The RSpec Bookやら、Continuous Testing: with Ruby, Rails, and JavaScriptを読みつつ、色々と実験してました。

そんなわけで、いくつかTipsなどまとめたいと思っているのですが、とりあえず、役に立ちそうなことを先に書いみようということで、前置きが長くなりましたが、capybara-webkitについて。

RSpecは、 「プログラムの振舞 (behaviour)」を記述するためのドメイン特化言語 (DomainSpecific Language:DSL) を提供するフレームワーク」です。まぁ、リンク先にあるように、Test::Unitを違う書き方で出来るということなんですが、DSLの出来が違うと、これだけ思考方法がかわるのか、というぐらいのものです。まぁ、メソッドやオブジェクトあるいはオブジェクト群に対する振る舞いのテストをする仕掛けなわけです。

テストは、最後の段では、全体を統合した Integration testをしたいわけです。Webアプリだと、ページを開いて、フォームを埋めて、ボタンを押して..などといった操作をして、結果を検証するわけです。

RSpecのIntegration testを支援する仕掛けとして、Capybaraがあります。Capybaraは、Rackベースのアプリケーションを対象にして テストができる仕掛けとDSLを提供しています。DSLは、同種のソフトのWebratがベースになっています。デフォルトのドライバは、Rackベースのアプリを対象としたブラウザエミュレーションですが、ドライバ部分を適当に導入すると、異なる形でエミュレーションできます。最初は、Webratを使ってたのですが、更新が止まっていたり、最近のRailsと相性わるいなど、色々不都合があり、直してつかってたのですが、その後、Capybara見付けたので、こちらを主に使うようになりました。

デフォルトのRackベースドライバは軽くて良いのですが、ブラウザのエミュレーションにJavaScriptエンジンが無いので、Ajaxベースのアプリのテストが出来ません。そのため、JavaScript使えるドライバがあるのですが、どれも、帯に短し襷に長しと言う状態でした。

ここで、ようやく、capybara-webkitの話になるのですが、こいつは、Qt用にポートされた、SafariやChromeで使われているWebkitフレームワークを使って、ブラウザエミュレーションします。これにより、フルにJavaScriptが使えるHTML5ブラウザでテストできることになります。この方法を思いついた奴は頭イイと思う。。

少し試してみたのですが、うまいことAjaxなコードのテストが出来ます。ブラウザが立ち上がらないので、ホントにヘッドレスでできます。MacOS Xで試す範囲だと、ビルドも簡単だし、非常に簡単に使えて良いです。試したなかでは、一番マトモにつかえそうです。

ただし、エンコーディングの関係で少し問題があったので、直して、pull requestだしました。そのうち、反映されるでしょう。(socketから帰ってきた文字列に強制的に set_encodingするだけ)

オススメします。

追記 (2011/6/18)

pull request 通って反映されています。


blog comments powered by Disqus