トップ «前の日記(2009-01-06) 最新 次の日記(2009-01-08)» 編集

Route 477



2009-01-07

[misc] プログラマの仕事場

耳鼻科で思いついたネタ。

「病院の診察室できょろきょろしてはいけないよ」
「どうして?」
「尖った道具を見つけたら、何をされるのだろうと無駄に不安になるからさ。」

「レストランで厨房を覗き込んではいけないよ」
「どうして?」
「手の洗い方が雑なのを見つけたら、それで大丈夫なのかと不安になるからさ。」

「ねえパパ、パパはプログラマだよね」
「そうだよ」
「パパの職場も見てはいけないの?」

[ruby] Webアプリのテストに役立つらしい「Webrat」って何だ?

WebratはRubyのライブラリで、

    def test_sign_up
      visit "/"
      click_link "Sign up"
      fill_in "Email", :with => "good@example.com"
      select "Free account"
      click_button "Register"
      ...
    end

みたいに、Webアプリのテストに役立つメソッド群を提供してくれるらしい。

Webratは内部でHTMLパーザのNokogiriを呼んでいて、

 click_link "Sign up"

とするとHTML内の「<a href="...">Sign up</a>」みたいなタグを探してリンク先のURLにアクセスしてくれる。

URLにアクセスする部分は、Railsとか、Merbとか、Sinatraとか、テストするWebアプリのフレームワークによって異なる (それぞれWebrat::RailsSessionとか、Webrat::MerbSessionみたいなクラスが用意されている)。

WebアプリがWebratをサポートしていない場合でも、MechanizeSessionを使えばWWW::Mechanizeを利用して、Webサーバ経由で 外側からテストすることが可能。*1

んで、テストのためのライブラリと言いつつ、結果を検証したりする部分はRSpecのような外部のテストツールに任されている。 だからRSpec + Webratとか、Cucumber + Webratとか、Test::Unit + Webratとかいろんな使い方ができる。

Webアプリの受け入れテストのためのツールといえばSeleniumとかWatirが有名だけど、 Webratはこれらと違って実際にブラウザを動かすわけではないので、より高速にテストを済ませることができるとのこと。

逆に、JavaScriptを使ったページのテストはWebrat単体ではできない。 でも、Webアプリの機能追加で途中からAjax使うことになりましたとか、よくあるよね!*2 そんな時のために、Webrat経由でSeleniumを操作するSeleniumSessionが用意されている。だから、それまでに書いたテストは変更せずに、 Ajaxのテストを追加することができる。

とりあえずは、cucumberと組み合わせて使う使い方から徐々に普及していくんじゃないかなぁ。

*1 WWW::Mechanizeもpage.links.first.clickみたいに書けたりするんで、機能的には若干カブる。目的はWebrat→テスト、Mechanize→自動化と異なるけれど。

*2 あるのか?