RSpec と
                   Cucumber
                    とみたまさひろ
                       2011-01-15

RSpec と Cucumber           Powered by Rabbit 0.9.2
自己紹介
      ✓ とみた まさひろ
      ✓ プログラマー
      ✓ mailto:tommy@tmtm.org
      ✓ http://d.hatena.ne.jp/tmtms
      ✓ http://twitter.com/tmtms
                                              1/63
RSpec と Cucumber                   Powered by Rabbit 0.9.2
自己紹介

      ✓ 日本Rubyの会
      ✓ 日本MySQLユーザ会
      ✓ Ruby/MySQL ライブラリ
      ✓ Ruby歴, MySQL歴 十数年

                                       2/63
RSpec と Cucumber            Powered by Rabbit 0.9.2
自己紹介




                   こんな本書きました

                                          3/63
RSpec と Cucumber               Powered by Rabbit 0.9.2
NSEG

      ✓ #1 Rubyの黒魔術
      ✓ #3 はじめてのRuby拡張ライブラ
        リ
      ✓ #6 Ruby紹介

                                     4/63
RSpec と Cucumber          Powered by Rabbit 0.9.2
今回は
             RSpec と
            Cucumber
               の話
RSpec と Cucumber
                              5/63
                   Powered by Rabbit 0.9.2
読みやすく
   て自動実行
   できるテスト                     6/63
RSpec と Cucumber   Powered by Rabbit 0.9.2
RSpec
                              7/63
RSpec と Cucumber   Powered by Rabbit 0.9.2
RSpec


      ✓ Rubyプログラム用の TDDツール
      ✓ 最新バージョン 2.4
      ✓ http://relishapp.com/rspec


                                           8/63
RSpec と Cucumber                Powered by Rabbit 0.9.2
RSpec




                                      9/63
RSpec と Cucumber           Powered by Rabbit 0.9.2
「The RSpec Book」




                                              10/63
RSpec と Cucumber                      Powered by Rabbit 0.9.2
特徴

      ✓ 英語っぽい
      ✓ モックが強力&簡単
      ✓ ファイル変更時に自動的実行
      ✓ テストカバー率が測れる

                                11/63
RSpec と Cucumber        Powered by Rabbit 0.9.2
インストール



                   % sudo gem install rspec



                                                  12/63
RSpec と Cucumber                          Powered by Rabbit 0.9.2
基本的な書き方

      ✓ ファイル名は *_spec.rb
      ✓ ○○について --- describe
      ✓ ○○の場合 --- context
      ✓ ○○となること --- it

                                      13/63
RSpec と Cucumber              Powered by Rabbit 0.9.2
基本的な書き方
              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/63
RSpec と Cucumber                           Powered by Rabbit 0.9.2
実行


            % rspec array_spec.rb
            ..

            Finished in 0.00054 seconds
            2 examples, 0 failures

                                            15/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
ドキュメントっぽい出力
                   % rspec -fd array_spec.rb

                   Array
                     when new
                       should be empty
                       size should == 0

                   Finished in 0.00068 seconds
                   2 examples, 0 failures
                                                       16/63
RSpec と Cucumber                               Powered by Rabbit 0.9.2
冗長
              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/63
RSpec と Cucumber                           Powered by Rabbit 0.9.2
簡潔に

            describe Array do
              context 'when new' do
                it{should be_empty}
                its(:size){should == 0}
              end
            end
                                            18/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
出力
                   % rspec -fd b.rb

                   Array
                     when new
                       should be empty
                       size
                         should == 0

                   Finished in 0.00078 seconds
                   2 examples, 0 failures
                                                         19/63
RSpec と Cucumber                                 Powered by Rabbit 0.9.2
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/63
RSpec と Cucumber                       Powered by Rabbit 0.9.2
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/63
RSpec と Cucumber                                  Powered by Rabbit 0.9.2
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/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
例外処理



            expect{...}.to
              raise_error(RuntimeError, 'msg...')




                                                     23/63
RSpec と Cucumber                             Powered by Rabbit 0.9.2
英語っぽいっていってもやりす
          ぎだろJK


            ary = []
            expect{ary.push 123}.to
              change{ary.size}.from(0).to(1)


                                                 24/63
RSpec と Cucumber                         Powered by Rabbit 0.9.2
モック                    25/63
RSpec と Cucumber   Powered by Rabbit 0.9.2
モック

      ✓ ダミーのオブジェクト
      ✓ ファイル, ネットワーク, DB, 時刻,
        etc...
      ✓ double() でモックオブジェクトを
        作成

                                  26/63
RSpec と Cucumber          Powered by Rabbit 0.9.2
モック


            obj = double 'label', :size=>3
            obj.size #=> 3
            obj.hoge #=> Error



                                               27/63
RSpec と Cucumber                       Powered by Rabbit 0.9.2
モック


            obj = double 'Array'
            obj.stub(:size).and_return 3
            obj.stub(:values_at).with(0).and_return 'a'
            # 呼ばれなかったらエラー
            obj.should_receive(:fetch)



                                                           28/63
RSpec と Cucumber                                   Powered by Rabbit 0.9.2
モック

           # 一度だけ呼び出される
           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/63
RSpec と Cucumber                                              Powered by Rabbit 0.9.2
既存オブジェクトのメソッドを置
       き換え可能

     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/63
RSpec と Cucumber                                     Powered by Rabbit 0.9.2
モックを返す


           before do
             # どんなメソッド呼び出しもエラーにしない
             logger = double('Logger').as_null_object
             Logger.stub(:new).and_return logger
           end
           it ...



                                                        31/63
RSpec と Cucumber                                Powered by Rabbit 0.9.2
自動
RSpec と Cucumber
                   実行           32/63
                        Powered by Rabbit 0.9.2
autotest

                   .rspec
                   lib/hoge.rb
                   spec/hoge_spec.rb
     hoge.rb が変更されると自動的に
     hoge_spec.rb が実行される
                                               33/63
RSpec と Cucumber                       Powered by Rabbit 0.9.2
インストール&実行


            % sudo gem install ZenTest

            % autotest


                                            34/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
デモ
RSpec と Cucumber
                           35/63
                   Powered by Rabbit 0.9.2
カバレッジ


      ✓ テストカバー率を測れる
      ✓ Ruby 1.9 ではまだちゃんと動作
        しない(?)


                                   36/63
RSpec と Cucumber           Powered by Rabbit 0.9.2
RCov




                                  37/63
RSpec と Cucumber          Powered by Rabbit 0.9.2
インストール&実行


            % sudo gem install rcov

            % rcov rspec spec/hoge_spec.rb

            テスト対象のものだけ集計
            % rcov -x ^/ -x _spec.rb rspec spec/hoge_spec.rb




                                                               38/63
RSpec と Cucumber                                       Powered by Rabbit 0.9.2
デモ
RSpec と Cucumber
                           39/63
                   Powered by Rabbit 0.9.2
RSpec の
    話はここま
       で
RSpec と Cucumber
                           40/63
                   Powered by Rabbit 0.9.2
Cucumber
                           41/63
RSpec と Cucumber   Powered by Rabbit 0.9.2
Cucumber
      ✓ 受け入れテスト用ツール
      ✓ プログラムを外部からテスト
      ✓ テスト対象の言語は問わない
      ✓ テスト自体は Ruby で記述
      ✓ http://cukes.info/
                                      42/63
RSpec と Cucumber              Powered by Rabbit 0.9.2
Cucumber




                                      43/63
RSpec と Cucumber              Powered by Rabbit 0.9.2
「はじめる! Cucumber」




       達人出版会の電子書籍。Railsプログラムのテスト
                                           44/63
RSpec と Cucumber                   Powered by Rabbit 0.9.2
インストール



            % sudo gem install cucumber



                                            45/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
書き方
                   # language: ja
                   フィーチャ: ○○できる
                     ○○として、
                     ○○したい。
                     なぜなら、○○だから。
                    シナリオ: ○○すると○○される
                     前提 ○○の状態
                     もし ○○する
                     かつ ○○する
                     ならば ○○されること
                                            46/63
RSpec と Cucumber                    Powered by Rabbit 0.9.2
文章で書ける


      ✓ プログラマじゃなくても読める
      ✓ プログラマじゃなくても書ける
        …かは微妙


                                    47/63
RSpec と Cucumber            Powered by Rabbit 0.9.2
こんな場面で

      ✓ Web アプリケーションのテスト
      ✓ Rails で使うと便利な機能多数
      ✓ Rails や Web アプリ以外でも使
        える

                                    48/63
RSpec と Cucumber            Powered by Rabbit 0.9.2
今回の例は

      ✓ SMTPの送信テスト
      ✓ プログラム開発以外にも使える
        よ!
      ✓ Rails 以外にも使えるよ!
              というか Rails 知らないし



                                         49/63
RSpec と Cucumber                 Powered by Rabbit 0.9.2
feature ファイル

           # language: ja
           フィーチャ: メールが送信できる
             SMTPクライアントとして、
             メールを送信したい。
             なぜなら、メールを利用者に届けたいから。
               シナリオ: 接続するとバナーが返る
                前提 サーバーが起動している
                もし 25番ポートに接続する
                ならば "220 "応答が返されること

                                              50/63
RSpec と Cucumber                      Powered by Rabbit 0.9.2
実行

           % 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/63
RSpec と Cucumber                                               Powered by Rabbit 0.9.2
HTML出力



           % cucumber smtp.feature -f html -o /tmp/smtp.html




                                                               52/63
RSpec と Cucumber                                       Powered by Rabbit 0.9.2
HTML出力




                                    53/63
RSpec と Cucumber            Powered by Rabbit 0.9.2
仕組み

                   features/
                   ├── smtp.feature
                   └── step_definitions/
                       └── smtp_steps.rb
    ✓ step_definitions 配下のスクリプト
      で対応する処理を実行
                                               54/63
RSpec と Cucumber                       Powered by Rabbit 0.9.2
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/63
RSpec と Cucumber                                Powered by Rabbit 0.9.2
少し動的に

          前提 'サーバーが起動している' 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/63
RSpec と Cucumber                                       Powered by Rabbit 0.9.2
既存の定義を利用して定義


           シナリオ: RCPT TO が受け付けられる
            前提 MAIL FROM まで指定済み
            もし RCPT TO で tommy@localhost を指定する
            ならば "250 "応答が返されること




                                                  57/63
RSpec と Cucumber                          Powered by Rabbit 0.9.2
既存の定義を利用して定義

            前提 '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/63
RSpec と Cucumber                                   Powered by Rabbit 0.9.2
表を使う

           シナリオアウトライン: 宛先に応じた応答が返る
            前提 MAIL FROM まで指定済み
            もし RCPT TO で <宛先> を指定する
            ならば <結果>応答が返されること

           例:
            | 宛先               | 結果     |
            | tommy@localhost | "250 " |
            | fuga@example.com | "550 " |


                                                    59/63
RSpec と Cucumber                            Powered by Rabbit 0.9.2
結果




                                60/63
RSpec と Cucumber        Powered by Rabbit 0.9.2
Rails で使うと

      feature ファイルに
      ✓ ○○に○○と入力する
      ✓ ○○ボタンをクリックする
      ✓ ○○と表示されていること
       と書ける機能が用意されているらしい
                                        61/63
RSpec と Cucumber                Powered by Rabbit 0.9.2
自動でできる
        ことは
      機械にやらせ
         よう
RSpec と Cucumber
                           62/63
                   Powered by Rabbit 0.9.2
ご清聴あ
   りがとうご
   ざいました
RSpec と Cucumber
                           63/63
                   Powered by Rabbit 0.9.2

More Related Content

PDF
JVM-Reading-ConcurrentMarkSweep
PDF
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
PDF
Rails application template
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設
PDF
Begin cucumber-in-real-world
PDF
Gojko Adzic Cucumber
PDF
開発者による現実的な自動化テスト及びRubyのテストツールについて
PDF
Haikara
JVM-Reading-ConcurrentMarkSweep
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
Rails application template
x86-64/Linuxに独自メモリ空間を勝手増設
Begin cucumber-in-real-world
Gojko Adzic Cucumber
開発者による現実的な自動化テスト及びRubyのテストツールについて
Haikara

Similar to RSpec と Cucumber (20)

PDF
今さらながらRSpecに入門してみた
PPTX
R spec勉強会
PDF
Ruby紹介
PPTX
Benkyokai
PDF
#027 tddのさわり
PDF
Rubykansai 81
PPT
ODP
RSpecのここがすごい!
PDF
Rubyの黒魔術
PPTX
実は怖くないDevOps
PDF
Ruby開発が教えてくれたこと
PPT
Ruby on Rails3 Tutorial Chapter3
PDF
俺のRails開発環境
PDF
最近の単体テスト
PDF
20110820 metaprogramming
PDF
Ruby 3の型推論やってます
PDF
魂のコーディング
PDF
地獄Spec
PDF
地獄Spec
今さらながらRSpecに入門してみた
R spec勉強会
Ruby紹介
Benkyokai
#027 tddのさわり
Rubykansai 81
RSpecのここがすごい!
Rubyの黒魔術
実は怖くないDevOps
Ruby開発が教えてくれたこと
Ruby on Rails3 Tutorial Chapter3
俺のRails開発環境
最近の単体テスト
20110820 metaprogramming
Ruby 3の型推論やってます
魂のコーディング
地獄Spec
地獄Spec
Ad

More from Masahiro Tomita (20)

PDF
お前の罪を数えろ
PDF
Ruby 2.5
PDF
本当はこわいMySQLプロトコル
PDF
ネットワークこわい
PDF
MySQLの文字コード事情 2017春版
PDF
MySQLの文字コード事情 2017版
PDF
PDF
MySQLの文字コード事情
PDF
進捗と品質
PDF
MySQLを拡張する
PDF
「理論から学ぶデータベース実践入門」読書会スペシャル
PDF
MyNAができるまで
PDF
文字化け
PDF
PDF
メールの暗号化
PDF
文字化け
PDF
進捗と品質
PDF
アジャイルジャパン長野サテライト
PDF
🍣=🍺
お前の罪を数えろ
Ruby 2.5
本当はこわいMySQLプロトコル
ネットワークこわい
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017版
MySQLの文字コード事情
進捗と品質
MySQLを拡張する
「理論から学ぶデータベース実践入門」読書会スペシャル
MyNAができるまで
文字化け
メールの暗号化
文字化け
進捗と品質
アジャイルジャパン長野サテライト
🍣=🍺
Ad

Recently uploaded (11)

PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
Working as an OSS Developer at Ruby Association Activity Report 2025
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
20250823_IoTLT_vol126_kitazaki_v1___.pdf
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
Working as an OSS Developer at Ruby Association Activity Report 2025
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由

RSpec と Cucumber

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