Rails勉強会@東京第38回 行ってきました
2009年2月15日、Rails勉強会@東京に行ってきました。
今回の会場は浜松町近くのTISさん。トイレからの見晴らしも良く、全室机付き。素晴らしい会場を提供していただき、ありがとうございます!
今回行われたセッションは下記の5つ。
前半 13:40-15:10
- SKIPの話
- RSpecとCucumber
- Ruby 1.9.1でRailsとかMerbとか動かす(前編)
後半 15: 40-17:10
- Rails 2.3.0の話
- Ruby 1.9.1でRailsとかMerbとか動かす(後編)
さて、僕が参加したセッションの感想など書いておきます。
前半: RSpecとCucumber (もろはしさん)
このセッションは、僕がもろはしさん指名でセッションのタネに「RSpecの話を聞きたい」と書く事で、まんまと(?)計画通り行われたセッション。もろはしさん本当にありがとうございます。

この資料(http://dl.getdropbox.com/u/108726/rails-testing-env-early-2009.pdf)を使ってのセッション。
RSpecとCucumberについて(w/Webrat)
RSpecとCucumberを使う事で変わるもの
- プログラマにとってのテスト戦略 → これはすでにもろはしさんが実感済み
- 開発サイクルの変化
プログラマにとってのテスト戦略
RSpecでモデル中心に単体テストを行い、Cucumberで受け入れテストを行う方法が楽。
Railsテスト方法の歴史
フレームワーク側がテストまでケアする、というのはRailsが使った良い文化。Rails以降の各言語に出てきたフレームワークは、テストを含むものがデフォルトになっている。
Rails自身はというと、2006年くらいまでは、UnitTestとFunctionalTestを使うのが主流だった。だが、2007年くらいからは、RSpecを使ってテストする手法が盛り上がってきた。
RSpecを使うことで、MVCを全て分けて単体テストができるようになった。また、RailsのIntegrationTestを使って、複数のアクションをまたぐテストができるようになった。
2009年からは、CucumberにIntegrationTestを任せる事で、もっと簡単にテストできるようになりそう。
プログラマにとってのテスト戦略
fixturesとか使えば、UnitTestは楽だった。FunctionalTestも、get, post, assert_testとかあって便利だった。IntegrationTestも、アクションをまたいでブラックボックステストができた。
でも、書くのが難しい。assertionが詳細すぎる。その結果、あまり流行らなかった。そこで、
- MVC側はRSpecでやればいいじゃん(UnitTestと、FunctionalTestはこれで十分)
- RSpecはBDDフレームワーク(たくさんのmatchaがあって便利)
- るびまとかなんとか見るといい
というわけ。RSpecの登場。でも、「結局IntegrationTestはどうするの?」という問題が出てきたため、Cucumberを使う、という選択肢を取った。
- Cucumberは、プレーンテキスト対応のテストアプリ
- 実行したい仕様をプレーンテキストで記述
- featureに対応するstepsを実行する(「シナリオ、前提、もし、かつ、ならば」のキーワードを使う)
- 正規表現で自然言語とRubyコードブロックを対応させる
- コードブロックはまんまRuby
- ARでデータ用意、Nokogiriで解析する
ちなみに、Cucumber自体も使いやすいが、実際にCucumberが便利なのは、内包しているWebrat( WEBアプリを操作するDSLセット)に因る所が大きい。
- リンクたどる、ボタン押す、フォーム入力するなど、最初から用意されてる
- ラベルを使ってフォームを入力できる(label に forが付いてないとダメだけどね)
- リンクも、アンカーテキストで書ける(aタグの中のテキスト書けばOK)
- リンクの検証なんかもできちゃう!(404とか500のレスポンスはエラー)
- もちろん、フォームの検証なんかもできちゃう!(labelに対応するinputがなければエラー)
つまり、RSpecとCucumberを合わせると、こんなことが出来ちゃうわけだ。
- Railsをブラックボックステスト可能
- RCocとあわせてもっと便利に
- アクションをとりあえず叩いてエラー出ないのだけ確認
- 実行したい仕様を母国語で書ける(そして以外と馴染む)
- Cucumberに14個用意されている独自stepで、C0カバレッジ80%超は余裕
- RSpec併用でC0カバレッジ90%超も可能
- ただしC0カバレッジ100%は「念のためrescue」みたいな時にキッツイのでやり過ぎ注意
ただし、実際にリクエストを飛ばしているわけじゃないので、そのあたりはまた別の方法でテストする必要はある。方法はいくつかあるが、現段階では「これぞ!」というテスト方法はない。
- SeleniumやWatirなど使って、テストの自動化
- ただ、実際にはSeleniumのメンテナンスコストの方が高くつく感じ
- JohnsonっていうRubyで書ける自動化もあるけど、まだまだ開発途上
また、上記の方法ではいずれも、JSやCSSはテストできない。
結局、Ajaxのテストや、CSSやHTMLなど見た目に関わる部分については、的を絞ってブラウザでテストした方が良さそう、というのが現時点での回答。
RSpecとCucumberでBDD開発をする上でのまとめ
- モデルに主要な処理を寄せて、コントローラーのコード量を少なくする
- モデルのテストはRSpecでやればOK
- コントローラーにあるモデルメソッドはなるべく増やさない方向で
- Cucunberには、マスタシナリオとセットの概念がある(Exampleと、Scenario outline)
開発サイクルの変化
上記の方法を用いてBDD開発を行うと、下記の手順で開発が可能になる。
(と、Cucumberのページに書いてある)
- プレーンテキストで振る舞いを書く
- Rubyでステップ書く
- Cukeで動かすとredにすればいいよ
- あとは全部動くように上をサイクルさせればいいじゃん
プレーンテキストで書かれた振る舞いは、技術系のお客さんであれば一見してわかるものだし、そうでなくてもある程度型にはまった仕様をお客さんから引き出す事ができる。
つまり、お客さんとのやりとりを簡素化できる可能性も内包している。
参考資料とか
- 「クは駆動のク〜Developer TestingとBDD〜」セッション資料
- スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)
- スはスペックのス 【第 2 回】 RSpec on Rails (コントローラとビュー編)
- Cucumberがアツい
- Webratがスゴい(続:Cucumberがアツい)
後半: Rails 2.3.0の話 (まつださん)
Rails 2.3.0のRC版インストールは、gem上で下記を実行するだけ。
sudo gem install rails --source http://gems.rubyonrails.org
Rails 2.3.0の主な変更点などは、下記のような感じ。
興味のある所だけをつまみ食いしているので、きちんと知りたかったら公式のリリースノートを読むべし。
- CGIベースからRack対応になった
- SomeController.call(env)できるようになった → irbとかでコントローラーのメソッドが呼べる!
- Dynamic Scopesが可能になった → Order.scoped_by_customer_id(12) みたいなの
- Default Scopesが可能になった → with_exclusive_scopeで素のfindに戻る
- Find with havingが可能になった
- コントローラーからのrender時、:fileとか:actionとかつけなくても良くなった
- application.rbの名前が、application_controller.rbに変わった
- ルーティングファイルをroutes.rb以外で定義できるようになった
- セッションの評価を少なくした(action内で使ってないのに読み込む事をしなくなった)
- respond_toが早くなった
- 「@person ? @person.name : nil」が、@person.try(:name)で書けるようになった
- Application Templatesが取り込まれた(DSLでrails hogeの結果をカスタマイズできるように)
- ActiveSupportの読み込みが早くなった
- WEBアプリそのものをプラグイン化できるようになった(Enginesが取り込まれた)
あと、今後のRailsの流れとしては、大きなものではMerbとの統合、それ以外ではユーザーの意見を反映させていこうとしているみたい。つまり、DHHをはじめRails開発チーム主体での進化は一旦収束に向かっている、というワケですね。
UserVoiceでは、Railsに実装してほしい機能や改善して欲しい所を投票形式で募っているので、是非こちらもチェックしてみてください。
http://rails.uservoice.com/
参考資料とか
- Rails 2.3.0リリースノート(英語)
- Rails 2.3.0リリースノート(imashoさんによる和訳)
- Rails 2.3.0リリースノート(conceal-rsさんによる意訳)
- Rails開発ブログ(英語)
遅くなりましたが、Rails勉強会の感想(というかメモ)でしたー。
Ruby, Rails, 勉強会 |
comments(0) |
trackbacks(0)
2009.03.07 Sat 20:46
TRACKBACKS
この記事へのトラックバックURL: http://www.red-mount.com/trackback/32_89a770cf4662606fcd41c59424597eb44e0c0c8f
ABOUT ME
tak (Takahito Sezutsu)
コメント、トラックバックはお気軽に!
COMMENTS
-
Beanstalk - WEBで管理可能なフリーのSubversionサーバー
→LILAC (08.14) -
CSS Nite in Ginza Vol.29に行ってきました。
→Betsy (05.14) -
「オリジナルの項目が見つからなかったので、エイリアス“********”は開けません。」と出て、Finderで外付けHDDが開けない時は
→poo (04.19) -
MacのSkypeでログイン時プルダウンメニューに表示されるSkype名を消す方法
→tak (06.22) -
「オリジナルの項目が見つからなかったので、エイリアス“********”は開けません。」と出て、Finderで外付けHDDが開けない時は
→tak (06.22) -
「オリジナルの項目が見つからなかったので、エイリアス“********”は開けません。」と出て、Finderで外付けHDDが開けない時は
→ko (06.22) -
MacのSkypeでログイン時プルダウンメニューに表示されるSkype名を消す方法
→Mac (05.06) -
MacのSkypeでログイン時プルダウンメニューに表示されるSkype名を消す方法
→tak (03.11) -
MacのSkypeでログイン時プルダウンメニューに表示されるSkype名を消す方法
→tama (03.11) -
Mac版ATOK定額制(体験版)を1週間使ってみた
→tak (09.19)
COMMENTS