4)Railsテスティング環境 2009 - Cucumber,Webrat and Rspec -

諸橋恭介さんの発表(発表スライドはこちら)

まとめ

  • Cucumberが登場した事によってプログラマーのテスト環境が変わっている
    • 受け入れ場Cucumber
    • TDDはRSpec

Choronicle of Rails Testing
1)Railsでのテストの歴史

  • 〜2006はUnitTest(モデル),FunctionalTest(画面っぽい単位)
  • 2007〜2008はRSpecRailsと同時に使える。IntegrationTest(アクション/複数の画面をまたぐ)が入ってきた
  • 2009になって、IntegrationTest部分にCucumberが登場

2)TestUnitとFunctional Testだけの時

  • UnitTest
    • モデルのテスト
    • データはFixtures
  • FunctionalTest
    • コントローラー/ビューのテスト
  • IntegrationTest
    • アクションをまたぐテスト
    • Railsアプリを外部から操作する

Integration Test

  • 書くのが難しい
  • 流行しなかった?!
  • いいんだけど、コストが高くて難しい

3)Rspecの時
RSpec

  • BDDフレームワーク
    • 沢山のmatcher
    • buil-in Stubs and Mocks
    • 結果フォーマットを多数サポート
    • 日本語の情報も沢山あって便利

4)Rspec on Railsが来た

  • MVCを分離して個別にテスト可能
  • Railsのテストメソッドを使える
  • UnitとFunctional相当はこれで使える

外部からのテストをどうするかは依然として問題

5)Cucumber登場!(http://cukes.info)
プレーンテキストドキュメントに対応するコードを実行するためのアプリ

プレーンテキストの実行?

  • 実行したい仕様をプレーンテキストで記述(feature)
    • 予約語はある
    • "前提","もし","ならば","かつ"
  • プレーンテキストに対応するRubyコードを探して実行する

Better Integration Test

  • Intergration Testは書くのが難しい
    • リクエストするURIを作るのが面倒
    • クエリ、リクエストボディーの準備が大変
  • 上記をWebratでカバーできる(githubで探す)
    • Webアプリを外側から操作するDSLセット(リンクをたどる、ボタンを押す、フォームに入力する)

Webrat

  • ラベルを使ってデータを入力できる
  • リンクもアンカーテキストでできる!
  • リンクの検証もできる!(リンクできない、リンク先で50X系のエラーを検出)

Cucumberのメリット

Cucumberの限界

Rails of Ruby on Rails

  • 主要な処理をモデルによせてコントローラーを薄くする
    • Modelはテストしやすいのでそこで対応
  • 「コントローラのアクションではfindやnew以外のモデルメソッドは一つくらいにしなさい」といったアドバイスもある
  • モデルに追加するメソッドはRSpecで重点的にテスト
  • コントローラーやビュー、ヘルパーはCucumberでテスト

開発サイクル

  • Cucumberで受け入れ時などのテストに使いやすい
  • TDDによるインテグレーションがより回しやすい

まとめ

  • プログラマにとってのテスト戦略は変わっていける
  • 開発サイクルも改善できる

質疑)
Q.プレーンテキストで書いた仕様をそのまま納品しているのでしょうか?
A.テキスト形式なので必要な形にコンバートしたり、テキストに書いてあるフィーチャを集約した形でもいいと想う

  • >まだ大規模なシステム開発ではまだ使えいないので、エクセルでの仕様書が無くなっている訳では未だない(補足)

Q.日本語でテスト仕様を書けるのは便利だと想うけれど、開発者間での書く時の意思統一等はどうしているのでしょうか?
A.テスト書式そのものは自由に書いていて特に共用していない。

Q.コントローラをなるべく薄くするのは、いいと想っているが、コントローラーのアクション毎にモデルにメソッドが生まれたりするので、単純に主張すると危険
A.なるほど!

Q.CukeでAjaxのテストはできますか?
A.できません

Q.認証処理は?
A.パスワードログインは余裕。OpenIDはなんとか。独自SSOはかなり厳しい

Q.ラベル、リンクテキストが変わると?
A.テストを修正する必要があります