RSpec と Cucumber

9,443 views

Published on

Published in: Technology
0 Comments
22 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,443
On SlideShare
0
From Embeds
0
Number of Embeds
100
Actions
Shares
0
Downloads
48
Comments
0
Likes
22
Embeds 0
No embeds

No notes for slide

RSpec と Cucumber

  1. 1. RSpec と Cucumber とみたまさひろ 2011-01-15RSpec と Cucumber Powered by Rabbit 0.9.2
  2. 2. 自己紹介 ✓ とみた まさひろ ✓ プログラマー ✓ mailto:tommy@tmtm.org ✓ http://d.hatena.ne.jp/tmtms ✓ http://twitter.com/tmtms 1/63RSpec と Cucumber Powered by Rabbit 0.9.2
  3. 3. 自己紹介 ✓ 日本Rubyの会 ✓ 日本MySQLユーザ会 ✓ Ruby/MySQL ライブラリ ✓ Ruby歴, MySQL歴 十数年 2/63RSpec と Cucumber Powered by Rabbit 0.9.2
  4. 4. 自己紹介 こんな本書きました 3/63RSpec と Cucumber Powered by Rabbit 0.9.2
  5. 5. NSEG ✓ #1 Rubyの黒魔術 ✓ #3 はじめてのRuby拡張ライブラ リ ✓ #6 Ruby紹介 4/63RSpec と Cucumber Powered by Rabbit 0.9.2
  6. 6. 今回は RSpec と Cucumber の話RSpec と Cucumber 5/63 Powered by Rabbit 0.9.2
  7. 7. 読みやすく て自動実行 できるテスト 6/63RSpec と Cucumber Powered by Rabbit 0.9.2
  8. 8. RSpec 7/63RSpec と Cucumber Powered by Rabbit 0.9.2
  9. 9. RSpec 8/63RSpec と Cucumber Powered by Rabbit 0.9.2
  10. 10. 「The RSpec Book」 9/63RSpec と Cucumber Powered by Rabbit 0.9.2
  11. 11. RSpec ✓ Rubyプログラム用の TDDツール ✓ 最新バージョン 2.4 ✓ http://relishapp.com/rspec 10/63RSpec と Cucumber Powered by Rabbit 0.9.2
  12. 12. 特徴 ✓ 英語っぽい ✓ モックが強力&簡単 ✓ ファイル変更時に自動的実行 ✓ テストカバー率が測れる 11/63RSpec と Cucumber Powered by Rabbit 0.9.2
  13. 13. インストール % sudo gem install rspec 12/63RSpec と Cucumber Powered by Rabbit 0.9.2
  14. 14. 基本的な書き方 ✓ ファイル名は *_spec.rb ✓ ○○について --- describe ✓ ○○の場合 --- context ✓ ○○となること --- it 13/63RSpec と Cucumber Powered by Rabbit 0.9.2
  15. 15. 基本的な書き方 describe Array do context when new do it should be empty do Array.new.should be_empty end it size should == 0 do Array.new.size.should == 0 end end end 14/63RSpec と Cucumber Powered by Rabbit 0.9.2
  16. 16. 実行 % rspec array_spec.rb .. Finished in 0.00054 seconds 2 examples, 0 failures 15/63RSpec と Cucumber Powered by Rabbit 0.9.2
  17. 17. ドキュメントっぽい出力 % rspec -fd array_spec.rb Array when new should be empty size should == 0 Finished in 0.00068 seconds 2 examples, 0 failures 16/63RSpec と Cucumber Powered by Rabbit 0.9.2
  18. 18. 冗長 describe Array do context when new do it should be empty do Array.new.should be_empty end it size should == 0 do Array.new.size.should == 0 end end end 17/63RSpec と Cucumber Powered by Rabbit 0.9.2
  19. 19. 簡潔に describe Array do context when new do it{should be_empty} its(:size){should == 0} end end 18/63RSpec と Cucumber Powered by Rabbit 0.9.2
  20. 20. 出力 % rspec -fd b.rb Array when new should be empty size should == 0 Finished in 0.00078 seconds 2 examples, 0 failures 19/63RSpec と Cucumber Powered by Rabbit 0.9.2
  21. 21. subject describe Array do context when new with 3 do subject{Array.new(3)} it{should == [nil, nil, nil]} its(:size){should == 3} end end 20/63RSpec と Cucumber Powered by Rabbit 0.9.2
  22. 22. before & after describe Hoge do before do # 前処理 @hoge = Hoge.new end after do # 後処理 @hoge.close end it ... do @hoge.fuga.should == 123 end end 21/63RSpec と Cucumber Powered by Rabbit 0.9.2
  23. 23. should ✓ ==, =~, >, >=, <, <= ✓ be_xxx : obj.xxx? メソッドが真 ✓ be_true, be_false, be_nil ✓ [1,2,3].should have(3).items ✓ [1,2,3].should include(2) 22/63RSpec と Cucumber Powered by Rabbit 0.9.2
  24. 24. 例外処理 expect{...}.to raise_error(RuntimeError, msg...) 23/63RSpec と Cucumber Powered by Rabbit 0.9.2
  25. 25. 英語っぽいっていってもやりす ぎだろJK ary = [] expect{ary.push 123}.to change{ary.size}.from(0).to(1) 24/63RSpec と Cucumber Powered by Rabbit 0.9.2
  26. 26. モック 25/63RSpec と Cucumber Powered by Rabbit 0.9.2
  27. 27. モック ✓ ダミーのオブジェクト ✓ ファイル, ネットワーク, DB, 時刻, etc... ✓ double() でモックオブジェクトを 作成 26/63RSpec と Cucumber Powered by Rabbit 0.9.2
  28. 28. モック obj = double label, :size=>3 obj.size #=> 3 obj.hoge #=> Error 27/63RSpec と Cucumber Powered by Rabbit 0.9.2
  29. 29. モック obj = double Array obj.stub(:size).and_return 3 obj.stub(:values_at).with(0).and_return a # 呼ばれなかったらエラー obj.should_receive(:fetch) 28/63RSpec と Cucumber Powered by Rabbit 0.9.2
  30. 30. モック # 一度だけ呼び出される obj.should_receive(:hoge).once # n回以上呼び出される obj.should_receive(:hoge).at_least(n).times # 引数が正規表現に一致する obj.should_receive(:hoge).with(/.../) # 引数が文字列 obj.should_receive(:hoge).with(an_instance_of(String)) # 引数が :key=>val を含むハッシュ obj.should_receive(:hoge).with(hash_including(:key=>val)) 29/63RSpec と Cucumber Powered by Rabbit 0.9.2
  31. 31. 既存オブジェクトのメソッドを置 き換え可能 it の中だけで有効 # 特定の時刻で実行したいテスト before do t = Time.local(2011,1,15,18,30,0) Time.stub(:now).and_return t end its(:tmpfile){should == 20110115183000.tmp} 30/63RSpec と Cucumber Powered by Rabbit 0.9.2
  32. 32. モックを返す before do # どんなメソッド呼び出しもエラーにしない logger = double(Logger).as_null_object Logger.stub(:new).and_return logger end it ... 31/63RSpec と Cucumber Powered by Rabbit 0.9.2
  33. 33. 自動RSpec と Cucumber 実行 32/63 Powered by Rabbit 0.9.2
  34. 34. autotest .rspec lib/hoge.rb spec/hoge_spec.rb hoge.rb が変更されると自動的に hoge_spec.rb が実行される 33/63RSpec と Cucumber Powered by Rabbit 0.9.2
  35. 35. インストール&実行 % sudo gem install ZenTest % autotest 34/63RSpec と Cucumber Powered by Rabbit 0.9.2
  36. 36. デモRSpec と Cucumber 35/63 Powered by Rabbit 0.9.2
  37. 37. カバレッジ ✓ テストカバー率を測れる ✓ Ruby 1.9 ではまだちゃんと動作 しない(?) 36/63RSpec と Cucumber Powered by Rabbit 0.9.2
  38. 38. RCov 37/63RSpec と Cucumber Powered by Rabbit 0.9.2
  39. 39. インストール&実行 % sudo gem install rcov % rcov rspec spec/hoge_spec.rb テスト対象のものだけ集計 % rcov -x ^/ -x _spec.rb rspec spec/hoge_spec.rb 38/63RSpec と Cucumber Powered by Rabbit 0.9.2
  40. 40. デモRSpec と Cucumber 39/63 Powered by Rabbit 0.9.2
  41. 41. RSpec の 話はここま でRSpec と Cucumber 40/63 Powered by Rabbit 0.9.2
  42. 42. Cucumber 41/63RSpec と Cucumber Powered by Rabbit 0.9.2
  43. 43. Cucumber ✓ 受け入れテスト用ツール ✓ プログラムを外部からテスト ✓ テスト対象の言語は問わない ✓ テスト自体は Ruby で記述 ✓ http://cukes.info/ 42/63RSpec と Cucumber Powered by Rabbit 0.9.2
  44. 44. Cucumber 43/63RSpec と Cucumber Powered by Rabbit 0.9.2
  45. 45. 「はじめる! Cucumber」 達人出版会の電子書籍。Railsプログラムのテスト 44/63RSpec と Cucumber Powered by Rabbit 0.9.2
  46. 46. インストール % sudo gem install cucumber 45/63RSpec と Cucumber Powered by Rabbit 0.9.2
  47. 47. 書き方 # language: ja フィーチャ: ○○できる ○○として、 ○○したい。 なぜなら、○○だから。 シナリオ: ○○すると○○される 前提 ○○の状態 もし ○○する かつ ○○する ならば ○○されること 46/63RSpec と Cucumber Powered by Rabbit 0.9.2
  48. 48. 文章で書ける ✓ プログラマじゃなくても読める ✓ プログラマじゃなくても書ける …かは微妙 47/63RSpec と Cucumber Powered by Rabbit 0.9.2
  49. 49. こんな場面で ✓ Web アプリケーションのテスト ✓ Rails で使うと便利な機能多数 ✓ Rails や Web アプリ以外でも使 える 48/63RSpec と Cucumber Powered by Rabbit 0.9.2
  50. 50. 今回の例は ✓ SMTPの送信テスト ✓ プログラム開発以外にも使える よ! ✓ Rails 以外にも使えるよ! というか Rails 知らないし 49/63RSpec と Cucumber Powered by Rabbit 0.9.2
  51. 51. feature ファイル # language: ja フィーチャ: メールが送信できる SMTPクライアントとして、 メールを送信したい。 なぜなら、メールを利用者に届けたいから。 シナリオ: 接続するとバナーが返る 前提 サーバーが起動している もし 25番ポートに接続する ならば "220 "応答が返されること 50/63RSpec と Cucumber Powered by Rabbit 0.9.2
  52. 52. 実行 % cucumber smtp.feature # language: ja フィーチャ: メールが送信できる SMTPクライアントとして、 メールを送信したい。 なぜなら、メールを利用者に届けたいから。 シナリオ: 接続するとバナーが返る # smtp.feature:7 前提サーバーが起動している # step_definitions/smtp_steps.rb:2 もし25番ポートに接続する # step_definitions/smtp_steps.rb:7 ならば"220 "応答が返されること # step_definitions/smtp_steps.rb:11 1 scenario (1 passed) 3 steps (3 passed) 0m0.002s 51/63RSpec と Cucumber Powered by Rabbit 0.9.2
  53. 53. HTML出力 % cucumber smtp.feature -f html -o /tmp/smtp.html 52/63RSpec と Cucumber Powered by Rabbit 0.9.2
  54. 54. HTML出力 53/63RSpec と Cucumber Powered by Rabbit 0.9.2
  55. 55. 仕組み features/ ├── smtp.feature └── step_definitions/ └── smtp_steps.rb ✓ step_definitions 配下のスクリプト で対応する処理を実行 54/63RSpec と Cucumber Powered by Rabbit 0.9.2
  56. 56. step_definitions ファイル 前提 サーバーが起動している do system ps -ef | grep -q postfix/master $?.should be_success end もし 25番ポートに接続する do @sock = TCPSocket.new(localhost, 25) end ならば "220 "応答が返されること do @sock.gets.should =~ /^220 / end 55/63RSpec と Cucumber Powered by Rabbit 0.9.2
  57. 57. 少し動的に 前提 サーバーが起動している do system ps -ef | grep -q postfix/master $?.should be_success end もし /(d+)番ポートに接続する/ do |port| @sock = TCPSocket.new(localhost, port) end ならば /"(.*)"応答が返されること/ do |status| @sock.gets.should =~ /^#{status}/ end 56/63RSpec と Cucumber Powered by Rabbit 0.9.2
  58. 58. 既存の定義を利用して定義 シナリオ: RCPT TO が受け付けられる 前提 MAIL FROM まで指定済み もし RCPT TO で tommy@localhost を指定する ならば "250 "応答が返されること 57/63RSpec と Cucumber Powered by Rabbit 0.9.2
  59. 59. 既存の定義を利用して定義 前提 MAIL FROM まで指定済み do もし 25番ポートに接続する ならば "220 "応答が返されること @sock.puts "MAIL FROM:<hoge@example.com>" ならば "250 "応答が返されること end もし /RCPT TO で (.*) を指定する/ do |rcpt| @sock.puts "RCPT TO:<#{rcpt}>" end 58/63RSpec と Cucumber Powered by Rabbit 0.9.2
  60. 60. 表を使う シナリオアウトライン: 宛先に応じた応答が返る 前提 MAIL FROM まで指定済み もし RCPT TO で <宛先> を指定する ならば <結果>応答が返されること 例: | 宛先 | 結果 | | tommy@localhost | "250 " | | fuga@example.com | "550 " | 59/63RSpec と Cucumber Powered by Rabbit 0.9.2
  61. 61. 結果 60/63RSpec と Cucumber Powered by Rabbit 0.9.2
  62. 62. Rails で使うと feature ファイルに ✓ ○○に○○と入力する ✓ ○○ボタンをクリックする ✓ ○○と表示されていること と書ける機能が用意されているらしい 61/63RSpec と Cucumber Powered by Rabbit 0.9.2
  63. 63. 自動でできる ことは 機械にやらせ ようRSpec と Cucumber 62/63 Powered by Rabbit 0.9.2
  64. 64. ご清聴あ りがとうご ざいましたRSpec と Cucumber 63/63 Powered by Rabbit 0.9.2

×