• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
 

Rails Testing Environment - early 2009

on

  • 2,857 views

had a presentation on Sendai RubyKaigi, 24, Jan 2009.

had a presentation on Sendai RubyKaigi, 24, Jan 2009.

Statistics

Views

Total Views
2,857
Views on SlideShare
2,664
Embed Views
193

Actions

Likes
1
Downloads
9
Comments
0

5 Embeds 193

http://www.red-mount.com 148
http://coderwall.com 32
http://www.slideshare.net 8
http://webcache.googleusercontent.com 4
http://localhost 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Rails Testing Environment - early 2009 Rails Testing Environment - early 2009 Presentation Transcript

    • Railsテスティング環境 2009 新春 RSpec and Cucumber(w/Webrat) will change our...2009-01-24 仙台Ruby会議01(株)永和システムマネジメント ¦ Rails勉強会@東京諸橋恭介 this photo is by mrhayata, http://flickr.com/photos/mrhayata/2152987709/
    • 開催おめでとう ございます
    • Conclusion
    • RSpec and Cuke(w/Webrat) will change our...✓Test for developer. ✓プログラマにとってのテスト戦略✓Cycle of development. ✓開発サイクル this photo is by Muu-karhu, http://commons.wikimedia.org/wiki/Image:Kurkkuja.jpg
    • Rails’ Test environment on early 2009 is..✓Acceptance test with Cucumber✓Developer test with RSpec, especially model
    • 2009 -Model by AR or Ruby RSpec on Rails Controller by AC RSpec on Rails View by Haml or .. RSpec on Rails (many) Helper by AV or .. RSpec on Rails
    • About me
    • 諸橋恭介 http://d.hatena.ne.jp/moro/ Rails勉強会@東京の案内係をしています。 ここ2年ほどRubyやRailsのプロジェクトで仕事してます。✓http://ruby.agile.esm.co.jp/
    • 生まれてずっと 本吉/気仙沼 大学が 仙台http://www.sekaichizu.jp/atlas/japan/prefecture/map_800n/n800_miyagi.html
    • 大好きな仙台で話す機会をくださり 生まれてずっと ありがとうございます 本吉/気仙沼✓仙台Ruby会議実行委員のみなさま✓OSC仙台実行委員のみなさま✓本日、参加なさってるみなさま 大学が 仙台✓ustで見守ってくださっているみなさま✓永和システムマネジメントの同僚の皆さん✓留守番している妻と娘 http://www.sekaichizu.jp/atlas/japan/prefecture/map_800n/n800_miyagi.html
    • Rails本を書きました Rails 2.0対応ですが、2.2 でもけっこう大丈夫http://amazon.jp/gp/product/4797336625
    • Chronicle ofRails Testing
    • - 2006 Rails’Model by AR or Ruby UnitTest Controller by AC Rails’ FunctionalTestView by AV using ERb Helper by AV or ..
    • 2007-2008 Model by AR or Ruby RSpec on Rails Controller by AC RSpec on RailsRails’IntegrationTest View by ERb or .. RSpec on Rails (many) Helper by AV or .. RSpec on Rails
    • 2009 -Model by AR or Ruby RSpec on Rails Controller by AC RSpec on Rails View by Haml or .. RSpec on Rails (many) Helper by AV or .. RSpec on Rails
    • View Controller ModelRails’ Rails’ Rails’Integration Functional Unit N/A Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • RSpec and Cuke(w/Webrat) will change our...✓Test for developer. ✓プログラマにとってのテスト戦略✓Cycle of development. ✓開発サイクル this photo is by Muu-karhu, http://commons.wikimedia.org/wiki/Image:Kurkkuja.jpg
    • RSpec and Cuke(w/Webrat) will change our...✓Test for developer. ✓プログラマにとってのテスト戦略✓Cycle of development. ✓開発サイクル this photo is by Muu-karhu, http://commons.wikimedia.org/wiki/Image:Kurkkuja.jpg
    • Before RSpec on RailsRails’ Rails’ Rails’Integration Functional Unit N/A Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • Before RSpec on Rails✓Unit Test ✓ モデルのテスト ✓ fixtures✓Functional Test ✓ コントローラ/ビューを含むテスト ✓ アクションごとにテスト ✓ get post xhr, assert_select
    • Before RSpec on Rails✓Integration Test ✓アクションをまたぐテスト ✓Railsアプリを外側からブラック ボックステスト ✓ ActionController::Dispatcher.dispatch()
    • But Integration test is✓書くのが難しい ✓リクエストするURIを作る ✓クエリ/リクエストボディの準備 ✓詳細すぎるassertion✓あまり流行らなかった
    • But Integration test isclass TestCreateEntry < ActionController::IntegrationTest def test_create get “/entries/new” assert_response :success post_via_redirect “/entries”, {:entry => {:title => “IntegrationTest”, :body => “いいんだけど、ムズい!!”} :commit => “Create”}, {:accept_language => “ja-JP”} assert_response :success assert_select “IntegrationTest” endend
    • RSpec on Rails comeRails’ Rails’ Rails’Integration Functional Unit N/A Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • http://rspec.info
    • feature✓BDD フレームワーク.✓たくさんのmatcher✓Built-in Stubs and Mocks✓結果出力フォーマットいろいろ
    • describe Entry do fixtures :entries, :blogs before(:each) do @entry = entries(:kakutani_earliest) end it "は特定のブログに属すること" do @entry.blog.should == blogs(:kakutani) endend
    • further information✓ るびま: スはスペックのス ✓ http://jp.rubyist.net/magazine/?0021-Rspec ✓ http://jp.rubyist.net/magazine/?0023-Rspec✓ RSpecを使ったテストコードを読もう ✓ http://www.atmarkit.co.jp/fcoding/articles/reading/02/ reading02a.html✓ RSpecで学ぶ BDD−振舞駆動開発−の基礎知識 ✓ WEB+DB vol.45 ✓ http://gihyo.jp/magazine/wdpress/archive/2008/vol45
    • RSpec on Rails come✓ MVCを分離して個別にテストできる✓ Railsのテストメソッドを使える ✓ fixtures ✓ assert_routing ✓ assert_tag✓ UnitとFunctional相当はこれで
    • RSpec on Rails come✓外側からのテストどうしようか問題✓Integration Test ...? ✓ やっぱり大変 ✓ 仕方ないので外側からのテストは手作業に
    • Cucumber comeRails’ Rails’ Rails’Integration Functional Unit N/A Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • http://cukes.info
    • What?✓"Cucumber executes plain text documentation of code against that code." from README ✓ Cucumberはプレーンテキストドキュメントに対応する コードを実行する(ためのアプリケーションです)✓ Better Integration Test
    • What?✓"Cucumber executes plain text documentation of code against that code." from README ✓ Cucumberはプレーンテキストドキュメントに対応する コードを実行する(ためのアプリケーションです)✓ Better Integration Test
    • Execute Plain Text✓ features✓ 実行したい仕様をプレーンテキストで記述する✓ step_definitions✓ プレーンテキストのfeaturesに対応する Rubyコードを探し、実行する
    • Cucumber (ストーリーランナー)*.feature steps/*.rb(プレインテキストによる (ストーリーを動かすためのユーザーストーリー記述) RubyとRSpecのコード) プロダクトコード Shintaro Kakutani, Oct, 2008http://www.slideshare.net/kakutani/working-effectively-with-legacy-tdiary-code-using-cucumber-and-rspec-presentation
    • Execute Plain Text✓ features✓ 実行したい仕様をプレーンテキストで記述する✓ step_definitions✓ プレーンテキストのfeaturesに対応する Rubyコードを探し、実行する
    • 構造付きの プレーンテキスト✓ 前提✓ もし✓ ならば✓and かつ
    • プレーンテキストシナリオ: 新しいエントリの登録前提 新規エントリページを表示しているもし "タイトル"に"Cucumberスゴイ"と入力するかつ "本文"に"これSugeeeeeeee"と入力するかつ "Create"ボタンを押すならば "これSugeeeeeeee"と表示されていること
    • Execute Plain Text✓ features✓ 実行したい仕様をプレーンテキストで記述する✓ step_definitions✓ プレーンテキストのfeaturesに対応する Rubyコードを探し、実行する
    • Plain Text to Ruby✓正規表現で自然言語文とRubyコードブロックを対応させる✓コードブロックはホントまんまRuby✓ ActiveRecordでデータ用意✓ Nokogiriで検証✓ Webratでアクセス
    • featureGiven I am on the new entry pagestepGiven /I am on the new entry page/ do visits "/entries/new"end
    • 前提 4つのエントリがあるGiven /(d+)つのエントリがある/ do |n|Entry.transaction do Entry.destroy_all n.to_i.times do |n| Entry.create! :name => "Entry #{n}" endend
    • What?✓"Cucumber executes plain text documentation of code against that code." from README ✓ Cucumberはプレーンテキストドキュメントに対応する コードを実行する(ためのアプリケーションです)✓ Better Integration Test
    • But Integration test is✓書くのが難しい ✓リクエストするURIを作る ✓クエリ/リクエストボディの準備 ✓詳細すぎるassertion✓あまり流行らなかった
    • Webrat Ruby Acceptance Testing for Web applicationshttp://github.com/brynary/webrat/tree/master
    • Webアプリを外から操作する DSLセット✓リンクを辿れる ✓click_link(link)✓ボタンを押せる ✓click_button(button)✓フォームに入力できる ✓fill_in(field, :with => value)
    • ラベルを使って入力できる✓"(.*)"に"(.*)"と入力する が ✓"input#entry_title"に"Cucumberがアツ イ"と入力する ではなく ✓"entry[title]"に"Cucumberがアツイ"と入 力する でもなく ✓"タイトル"に"Cucumberがアツイ"と入力す る と書ける
    • リンクもアンカーテキストで書ける!!✓"(.*)"リンクをクリックする が✓"a[@href=/entries]"リンクをクリックす る ではなく✓"エントリの一覧"リンクをクリックする と書ける
    • リンクの検証もできる✓"エントリの一覧"リンクをクリックする✓「エントリの一覧」というリンクがないとエラー✓リンク先で 50x系のレスポンスだとエラー✓フォームの入力項目なども同じく
    • When /^"(.*)"ボタンをクリックする$/ do |button|When /^"(.*)"リンクをクリックする$/ do |link|When /^"(.*)"に"(.*)"と入力する$/ do |field, value|When /^"(.*)"から"(.*)"を選択する$/ do |field, value|When /^"(.*)"をチェックする$/ do |field|When /^"(.*)"のチェックを外す$/ do |field|When /^"(.*?)"を選択する$/ do |field| http://github.com/openskip/skip-note/blob/HEAD/ features/step_definitions/webrat_ja_steps.rb
    • This is executable code.シナリオ: 新しいエントリの登録前提 新規エントリページを表示しているもし "タイトル"に"Cucumberスゴイ"と入力するかつ "本文"に"これSugeeeeeeee"と入力するかつ "Create"ボタンを押すならば "これSugeeeeeeee"と表示されていること
    • remember Integration test isclass TestCreateEntry < ActionController::IntegrationTest def test_create get “/entries/new” assert_response :success post_via_redirect “/entries”, {:entry => {:title => “IntegrationTest”, :body => “いいんだけど、ムズい!!”} :commit => “Create”}, {:accept_language => “ja-JP”} assert_response :success assert_select “IntegrationTest” endend
    • This is executable code. 要自作シナリオ: 新しいエントリの登録 visit “/some/where”前提 新規エントリページを表示しているもし "タイトル"に"Cucumberスゴイ"と入力するかつ "本文"に"これSugeeeeeeee"と入力するかつ "Create"ボタンを押すならば "これSugeeeeeeee"と表示されていること
    • This is executable code.シナリオ: 新しいエントリの登録✓ 仕様を自然言語で読み書きできる前提 新規エントリページを表示している✓もし日本語、意外となじむよ "タイトル"に"Cucumberスゴイ"と入力する✓かつ "本文"に"これSugeeeeeeee"と入力する その仕様をRubyで実行できるかつ "Create"ボタンを押す✓テストを宣言的に書けるならば "これSugeeeeeeee"と表示されていること
    • Merit for developer✓Railsアプリを外側からブラックボックシナリオ: 新しいエントリの登録前提 新規エントリページを表示している ステストできる "タイトル"に"Cucumberスゴイ"と入力するもし ActionController::Dispatcher.dispatch() ✓ "本文"に"これSugeeeeeeee"と入力する ✓かつ RCovとあわせてブラックボックスのカバレッジ!!かつ "Create"ボタンを押す✓アクションをとりあえず叩いてエラーが ないのを確認できるならば "これSugeeeeeeee"と表示されていること
    • Merit for developerシナリオ: 新しいエントリの登録✓前提Webratのおかげで簡単に書ける 新規エントリページを表示している ✓"タイトル"に"Cucumberスゴイ"と入力するもし アプリケーション独自のstepが14個で、C0 カバレッジ80%超。かつ "本文"に"これSugeeeeeeee"と入力する ✓ specと併せると90%超。かつ "Create"ボタンを押す ✓母国語は実になじむならば "これSugeeeeeeee"と表示されていること
    • Limitation✓Integration Testと同じ限界シナリオ: 新しいエントリの登録前提 新規エントリページを表示している ✓実際にリクエストを飛ばすわけではないもし "タイトル"に"Cucumberスゴイ"と入力する ✓ "本文"に"これSugeeeeeeee"と入力するかつ JSやCSSの検証は必要 ✓SeleniumやWatir...?かつ "Create"ボタンを押す ✓ "これSugeeeeeeee"と表示されていることならば Johnsonマダー?
    • TDD on RailsRails’ Rails’ Rails’Integration Functional Unit ? Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • Rails of Ruby on Rails✓ Fat Model ✓主要な処理はモデルに寄せる✓ Thin Controller ✓コントローラは薄く
    • Fat Model✓RSpecで!✓fixturesやっぱりいいね✓実際にSQL投げたい✓必要ならMock/Stubも
    • Thin Controller the Goalentry = Entry.new(params[:entry])entry.save() Kyosuke MOROHASHI, Feb, 2008 http://www.slideshare.net/moro/rails-form-chronicle
    • “Rails Code Quality Checklist” also says✓ “Each controller action only calls one model method other than an initial find or new. (Make custom .new or .update methods in the model with all necessary).” ✓ コントローラのアクションではfindやnew以外の モデルメソッドは一つくらいにしなさい。✓ “so your controllers look identical to the controllers generated by script/generate” I translated , see via http://d.hatena.ne.jp/moro/20080923/1222150102
    • My current Testing✓モデルに追加するメソッドは RSpecで徹底的にテスト✓コントローラやビュー、ヘルパーは Cucumberで✓ JSONやXMLを返す、またはコントローラが 膨らんでしまった場合はRSpecで
    • TDD on RailsRails’ Rails’ Rails’Integration Functional Unit ? Rails’ RSpec RSpec View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model Rails’ RSpec RSpecCucumber View/Helper Controller Model
    • RSpec and Cuke(w/Webrat) will change our...✓Test for developer. ✓プログラマにとってのテスト戦略✓Cycle of development. ✓開発サイクル this photo is by Muu-karhu, http://commons.wikimedia.org/wiki/Image:Kurkkuja.jpg
    • http://cukes.info
    • 1. Describe behaviour in plain text2. Write a step definition in Ruby3. Run and watch it fail4. Write code to make the step pass5. Run again and see the step pass6. Repeat 2-5 until green like a cuke7. Repeat 1-6 until the money runs out http://cukes.info
    • TDDによるイテレーション タスク リリース計画 完了条件 優先順位づけ 分解フィードバック バックログ テスト 満足条件 本番環境 受入テスト 検証 テスト駆動開発 ケース デプロイ 実施 受入テスト コード 統合 2週間でnバックログをこなす Copyright (c) 2008 Eiwa System Management, Inc. 58
    • TDDによるイテレーション タスク リリース計画 優先順位づけ 分解 RSpec 完了条件フィードバック バックログ テスト 満足条件 本番環境 受入テスト 検証 テスト駆動開発 ケース デプロイ 実施 受入テスト コード + JS with Selenium or so. 統合 + Style with your eye. 2週間でnバックログをこなす Copyright (c) 2008 Eiwa System Management, Inc. 58
    • TDDによるイテレーション タスク リリース計画 完了条件 優先順位づけ 分解フィードバック バックログ テスト 満足条件 本番環境 受入テスト 検証 テスト駆動開発 ケース デプロイ 実施 受入テスト コード 統合 2週間でnバックログをこなす Copyright (c) 2008 Eiwa System Management, Inc. 58
    • Conclusion
    • TodayModel by AR or Ruby RSpec Controller by AC RSpec View by Haml or .. RSpec (many) Helper by AV or .. RSpec
    • RSpec and Cuke(w/Webrat) will change our..✓Test for developer. ✓プログラマにとってのテスト戦略✓Cycle of development. ✓開発サイクル
    • you.any?{|u| u.question?}
    • FAQ: Cukeで Ajaxのテストできる残念ながらJavaScriptはテストできません Seleniumを試してみる? Johnsonというものがあって。リリース期待逆にSelenや手動テストの箇所を局所化できる、と考えるんだ!!JSONやXMLのAPI系はRSpec Controllerが最適な感じです。
    • FAQ: これまででいちばん辛かった体験をできた範囲では認証が辛かったです。 パスワードログインは余裕。 OpenIDも頑張った。 独自SSO系はだいぶ辛いOpenIDのstepはできてます githubのkakutani-fake-openid-server openskip/skip-noteのopenid_fake_steps.rbをどうぞ
    • FAQ: テストの 変更コストは?実感ベースで悪くない気がしますよ。 ラベル, リンクテキストが変わったらテスト修正 name属性やhref属性の変更だけなら修正不要ユーザにとって納得感のある修正i18nしてるときは、最初に訳語を練るときにまだるっこしいかも
    • FAQ: テストの網羅性は?C0で80%くらいまでは楽に出ます。 本気出せば90%くらいまでは余裕かとExample(表)とScenario outlineを使うノウハウができればもっと役立つ予感 正常系ストライクシナリオ + 表で境界値 異常系大ボールシナリオ + 表で境界値
    • ご清聴 ありがとうございました