SlideShare una empresa de Scribd logo
1 de 64
Descargar para leer sin conexión
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

Más contenido relacionado

Más de Masahiro Tomita

本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャルMasahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトMasahiro Tomita
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話Masahiro Tomita
 

Más de Masahiro Tomita (20)

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

Último

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Último (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

RSpec と Cucumber

  • 1. RSpec と Cucumber とみたまさひろ 2011-01-15 RSpec と Cucumber Powered by Rabbit 0.9.2
  • 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
  • 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:<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
  • 60. 表を使う シナリオアウトライン: 宛先に応じた応答が返る 前提 MAIL FROM まで指定済み もし RCPT TO で <宛先> を指定する ならば <結果>応答が返されること 例: | 宛先 | 結果 | | tommy@localhost | "250 " | | fuga@example.com | "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