4)Railsテスティング環境 2009 - Cucumber,Webrat and Rspec -
諸橋恭介さんの発表(発表スライドはこちら)
まとめ
Choronicle of Rails Testing
1)Railsでのテストの歴史
- 〜2006はUnitTest(モデル),FunctionalTest(画面っぽい単位)
- 2007〜2008はRSpecがRailsと同時に使える。IntegrationTest(アクション/複数の画面をまたぐ)が入ってきた
- 2009になって、IntegrationTest部分にCucumberが登場
2)TestUnitとFunctional Testだけの時
- UnitTest
- モデルのテスト
- データはFixtures
- FunctionalTest
- コントローラー/ビューのテスト
- IntegrationTest
- アクションをまたぐテスト
- Railsアプリを外部から操作する
Integration Test
- 書くのが難しい
- 流行しなかった?!
- いいんだけど、コストが高くて難しい
- BDDフレームワーク
- 沢山のmatcher
- buil-in Stubs and Mocks
- 結果フォーマットを多数サポート
- 日本語の情報も沢山あって便利
外部からのテストをどうするかは依然として問題
5)Cucumber登場!(http://cukes.info)
プレーンテキストドキュメントに対応するコードを実行するためのアプリ
プレーンテキストの実行?
Better Integration Test
- Intergration Testは書くのが難しい
- 上記をWebratでカバーできる(githubで探す)
- Webアプリを外側から操作するDSLセット(リンクをたどる、ボタンを押す、フォームに入力する)
Webrat
- ラベルを使ってデータを入力できる
- リンクもアンカーテキストでできる!
- リンクの検証もできる!(リンクできない、リンク先で50X系のエラーを検出)
Cucumberのメリット
- その仕様をRubyで実行できる
- ブラックボックステストができる(RCovと合わせてカバレッジも取れる)
- Webratと一緒に使う事で簡単にできる
Cucumberの限界
- Integration Testと同じ限界はある
- Javascript部分やCSS等(そこはSelenium等)
- 主要な処理をモデルによせてコントローラーを薄くする
- Modelはテストしやすいのでそこで対応
- 「コントローラのアクションではfindやnew以外のモデルメソッドは一つくらいにしなさい」といったアドバイスもある
- モデルに追加するメソッドはRSpecで重点的にテスト
- コントローラーやビュー、ヘルパーはCucumberでテスト
開発サイクル
- Cucumberで受け入れ時などのテストに使いやすい
- TDDによるインテグレーションがより回しやすい
まとめ
- プログラマにとってのテスト戦略は変わっていける
- 開発サイクルも改善できる
質疑)
Q.プレーンテキストで書いた仕様をそのまま納品しているのでしょうか?
A.テキスト形式なので必要な形にコンバートしたり、テキストに書いてあるフィーチャを集約した形でもいいと想う
- >まだ大規模なシステム開発ではまだ使えいないので、エクセルでの仕様書が無くなっている訳では未だない(補足)
Q.日本語でテスト仕様を書けるのは便利だと想うけれど、開発者間での書く時の意思統一等はどうしているのでしょうか?
A.テスト書式そのものは自由に書いていて特に共用していない。
Q.コントローラをなるべく薄くするのは、いいと想っているが、コントローラーのアクション毎にモデルにメソッドが生まれたりするので、単純に主張すると危険
A.なるほど!
Q.CukeでAjaxのテストはできますか?
A.できません
Q.認証処理は?
A.パスワードログインは余裕。OpenIDはなんとか。独自SSOはかなり厳しい
Q.ラベル、リンクテキストが変わると?
A.テストを修正する必要があります