Top Banner
http://www.flickr.com/photos/bruce_mcadam/3214482163/ Let’s begin Behavior Driven Development using RSpec 村田賢太 mrkn CLR/H #58 2011.05.21 2011522日日曜日
87

Let's begin Behavior Driven Development using RSpec

Jan 19, 2015

Download

Documents

Kenta Murata

Introducing BDD and RSpec.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/

Let’s begin Behavior Driven Developmentusing RSpec村田賢太 mrkn

CLR/H #582011.05.21

2011年5月22日日曜日

Page 2: Let's begin Behavior Driven Development using RSpec

自己紹介

2011年5月22日日曜日

Page 3: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/koichiroo/5244581973/

村田賢太mrkn

高専カンファレンス副代表

Ruby コミッタRuby 札幌

2011年5月22日日曜日

Page 4: Let's begin Behavior Driven Development using RSpec

2010年3月1日月曜日2011年5月22日日曜日

Page 5: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/2011年5月22日日曜日

Page 6: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/

Let’s begin Behavior Driven Developmentusing RSpec村田賢太 mrkn

CLR/H #582011.05.21

2011年5月22日日曜日

Page 7: Let's begin Behavior Driven Development using RSpec

三部構成

✓知識編

✓準備編

✓実践編

2011年5月22日日曜日

Page 8: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/

知識編2011年5月22日日曜日

Page 9: Let's begin Behavior Driven Development using RSpec

BDDBehavior Driven Development

2011年5月22日日曜日

Page 10: Let's begin Behavior Driven Development using RSpec

TDDTest Driven Development

2011年5月22日日曜日

Page 11: Let's begin Behavior Driven Development using RSpec

TDDTest Driven Development

2011年5月22日日曜日

Page 12: Let's begin Behavior Driven Development using RSpec

TDD → BDDという変化

2011年5月22日日曜日

Page 13: Let's begin Behavior Driven Development using RSpec

なぜ?

2011年5月22日日曜日

Page 14: Let's begin Behavior Driven Development using RSpec

× 機能のテスト

〇 振る舞いの設計

2011年5月22日日曜日

Page 15: Let's begin Behavior Driven Development using RSpec

何が違う?

2011年5月22日日曜日

Page 16: Let's begin Behavior Driven Development using RSpec

言葉遣い態 度

2011年5月22日日曜日

Page 17: Let's begin Behavior Driven Development using RSpec

test-unit

2011年5月22日日曜日

Page 18: Let's begin Behavior Driven Development using RSpec

module System class AgeCalculatorTest < Test::Unit::TestCase include RR::Adapters::TestUnit

def setup @calc = AgeCalculator.with_birthday(1981, 7, 20) end

def test_age_on assert_equal(29, @calc.age_on(2011, 7, 19)) assert_equal(30, @calc.age_on(2011, 7, 20)) end

def test_age_today d, m, y = [*Time.now][3..5] stub(@calc).age_on @calc.age_on_today assert_received(@calc) {|c| c.age_on(y, m, d) } end endend

2011年5月22日日曜日

Page 19: Let's begin Behavior Driven Development using RSpec

RSpec

2011年5月22日日曜日

Page 20: Let's begin Behavior Driven Development using RSpec

module System describe AgeCalculator do context ‘with birthday 1981-07-20’ do subject { AgeCalculator.with_birthday(1981, 7, 20) }

describe ‘#age_on’ do context ‘with 2011-07-19’ do specify ‘the age is 29’ do subject.age_on(2011, 7, 19).should be == 29 end end

context ‘with 2011-07-20’ do specify ‘the age is 30’ do subject.age_on(2011, 7, 20).should be == 30 end end end

describe ‘#age_on_today’ do it ‘calls age_on with year, month, and day on today’ do d, m, y = [*Time.now][3..5] subject.should_receive(:age_on).with(y, m, d) subject.age_on_today end end end endend

2011年5月22日日曜日

Page 21: Let's begin Behavior Driven Development using RSpec

見た目は違うけどやってる事は同じ

2011年5月22日日曜日

Page 22: Let's begin Behavior Driven Development using RSpec

見た目も違うし、やってる事も同じに見えるけど違う

2011年5月22日日曜日

Page 23: Let's begin Behavior Driven Development using RSpec

言葉遣い態 度

2011年5月22日日曜日

Page 24: Let's begin Behavior Driven Development using RSpec

そもそもTDDと言いながら我々は本当にテストをしていると言えるのだろうか?

2011年5月22日日曜日

Page 25: Let's begin Behavior Driven Development using RSpec

http://www.ne.jp/asahi/t/wada/articles/Test_in_TDD.pdf

!Test"#$%&'()$*

t-wadahttp://d.hatena.ne.jp/t-wada/

2005+7,23-@J2EE./012103

2011年5月22日日曜日

Page 26: Let's begin Behavior Driven Development using RSpec

http://www.ne.jp/asahi/t/wada/articles/Test_in_TDD.pdf

!"#$%1

! TDD&'()*+,&-.! "Test"/01213.45%&6784

" 9:;<=>?@A

" 2B%"Test"CDE&-.FGHIJKLF" MNO5PQCRS

! '()TUVWXOYZ[4

" 9:\#/ ]^#/ >?@A_`\

2011年5月22日日曜日

Page 27: Let's begin Behavior Driven Development using RSpec

http://www.ne.jp/asahi/t/wada/articles/Test_in_TDD.pdf

!"#$%1

! TDD&'()*+,&-.! "Test"/01213.45%&6784

" 9:;<=>?@A

" 2B%"Test"CDE&-.FGHIJKLF" MNO5PQCRS

! '()TUVWXOYZ[4

" 9:\#/ ]^#/ >?@A_`\

2011年5月22日日曜日

Page 28: Let's begin Behavior Driven Development using RSpec

http://www.ne.jp/asahi/t/wada/articles/Test_in_TDD.pdf

!"#$%2

! TDD%"Test"&'(())%*+%,%" -./0'(12%345

! TDD%67&89:;<=/>?@ABCD:;EFG>/HIJKL

2011年5月22日日曜日

Page 29: Let's begin Behavior Driven Development using RSpec

http://www.ne.jp/asahi/t/wada/articles/Test_in_TDD.pdf

!"#$%2

! TDD%"Test"&'(())%*+%,%" -./0'(12%345

! TDD%67&89:;<=/>?@ABCD:;EFG>/HIJKL

2011年5月22日日曜日

Page 30: Let's begin Behavior Driven Development using RSpec

http://blogs.itmedia.co.jp/hiranabe/2005/08/sd4__c05e.html2011年5月22日日曜日

Page 31: Let's begin Behavior Driven Development using RSpec

http://blogs.itmedia.co.jp/hiranabe/2005/10/tdd__bdd__731d.html2011年5月22日日曜日

Page 32: Let's begin Behavior Driven Development using RSpec

× 機能のテスト

〇 振る舞いの設計

2011年5月22日日曜日

Page 33: Let's begin Behavior Driven Development using RSpec

テストを書いてからコードを書く

振る舞いを設計してからコードを書く

2011年5月22日日曜日

Page 34: Let's begin Behavior Driven Development using RSpec

module System describe AgeCalculator do context ‘with birthday 1981-07-20’ do subject { AgeCalculator.with_birthday(1981, 7, 20) }

describe ‘#age_on’ do context ‘with 2011-07-19’ do specify ‘the age is 29’ do subject.age_on(2011, 7, 19).should be == 29 end end

context ‘with 2011-07-20’ do specify ‘the age is 30’ do subject.age_on(2011, 7, 20).should be == 30 end end end

describe ‘#age_on_today’ do it ‘calls age_on with year, month, and day on today’ do d, m, y = [*Time.now][3..5] subject.should_receive(:age_on).with(y, m, d) subject.age_on_today end end end endend 動く設計書

2011年5月22日日曜日

Page 35: Let's begin Behavior Driven Development using RSpec

知識編まとめ

✓TDDと言ってもテストしてるわけじゃない

✓“テストを書く” → “振る舞いを設計する”

✓設計の成果物が動くテスト

2011年5月22日日曜日

Page 36: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/

準備編2011年5月22日日曜日

Page 37: Let's begin Behavior Driven Development using RSpec

インストール

2011年5月22日日曜日

Page 38: Let's begin Behavior Driven Development using RSpec

Ruby 1.9.2p180

RSpec 2.5.0

2011年5月22日日曜日

Page 39: Let's begin Behavior Driven Development using RSpec

Ruby 1.9.2p180

RSpec 2.5.0

2011年5月22日日曜日

Page 40: Let's begin Behavior Driven Development using RSpec

RVMRuby Version Manager

2011年5月22日日曜日

Page 41: Let's begin Behavior Driven Development using RSpec

http://gihyo.jp/dev/serial/01/ruby/00392011年5月22日日曜日

Page 42: Let's begin Behavior Driven Development using RSpec

http://www.nicovideo.jp/watch/sm129758492011年5月22日日曜日

Page 43: Let's begin Behavior Driven Development using RSpec

インストールは出来たことにしよう

2011年5月22日日曜日

Page 44: Let's begin Behavior Driven Development using RSpec

Ruby 1.9.2p180

RSpec 2.5.0

2011年5月22日日曜日

Page 45: Let's begin Behavior Driven Development using RSpec

gem install rspec

2011年5月22日日曜日

Page 46: Let's begin Behavior Driven Development using RSpec

rspec の依存関係rspec-core

rspec-expectationsrspec-mocks

2011年5月22日日曜日

Page 47: Let's begin Behavior Driven Development using RSpec

ほかにあると便利なもの

✓autotest

✓bundler

✓simplecov

2011年5月22日日曜日

Page 48: Let's begin Behavior Driven Development using RSpec

準備編まとめ

✓RVM を使って Ruby をインストールした

✓gem install rspec で RSpec 一式をインストールした

2011年5月22日日曜日

Page 49: Let's begin Behavior Driven Development using RSpec

http://www.flickr.com/photos/bruce_mcadam/3214482163/

実践編2011年5月22日日曜日

Page 50: Let's begin Behavior Driven Development using RSpec

RSpec を使い始める

2011年5月22日日曜日

Page 51: Let's begin Behavior Driven Development using RSpec

いくつかの状況

1.TDDをやっている途中

2.コードはあるけどテストはない

3.ゼロから始める

2011年5月22日日曜日

Page 52: Let's begin Behavior Driven Development using RSpec

(1)

2011年5月22日日曜日

Page 53: Let's begin Behavior Driven Development using RSpec

TDDをやっている途中

✓test-unit から RSpec へ移行

✓テストを振る舞いの記述に書き換える

✓漏れなく書き換えられるか不安

2011年5月22日日曜日

Page 54: Let's begin Behavior Driven Development using RSpec

RSpec 1 の場合

✓require ‘spec/test/unit’ を使う

✓spec コマンドで test-unit の TestCase を実行できる

✓書き換える必要が無い

2011年5月22日日曜日

Page 55: Let's begin Behavior Driven Development using RSpec

RSpec 2 の場合

✓‘spec/test/unit’ 相当が無い

✓自分で少しずつ書き換えが必要

✓漏れなく書き換えられるか不安

2011年5月22日日曜日

Page 56: Let's begin Behavior Driven Development using RSpec

そこでカバレッジ

http://www.slideshare.net/t_wada/sapporo-rubykaigi01-twada-lt-presentation2011年5月22日日曜日

Page 57: Let's begin Behavior Driven Development using RSpec

そろそろカバレッジについて一言いっておくか

和田 卓人 (a.k.a id:t-wada)

Oct, 26, 2008 @SapporoRubyKaigi 01

http://www.slideshare.net/t_wada/sapporo-rubykaigi01-twada-lt-presentation2011年5月22日日曜日

Page 58: Let's begin Behavior Driven Development using RSpec

カバレッジを監視することで安心を得る

2011年5月22日日曜日

Page 59: Let's begin Behavior Driven Development using RSpec

RSpec 1 を使って書き換えてから RSpec 2 に移行しても良い

2011年5月22日日曜日

Page 60: Let's begin Behavior Driven Development using RSpec

(2)

2011年5月22日日曜日

Page 61: Let's begin Behavior Driven Development using RSpec

コードはあるけどテストはない

2011年5月22日日曜日

Page 62: Let's begin Behavior Driven Development using RSpec

遺産(Legacy)

Photo by rla579: http://flickr.com/photos/rla579/2482286520/2011年5月22日日曜日

Page 63: Let's begin Behavior Driven Development using RSpec

いきいきとしたレガシーコードとの暮らし

札幌Ruby会議01;北海道情報大学札幌サテライト; 2008-10-25(土)

角谷 信太郎Working Effectively with Legacy tDiary Codeusing Cucumber and RSpec

日本Rubyの会(株)永和システムマネジメント [email protected]

KAKUTANI Shintaro; Eiwa System Management,Inc.; Nihon Ruby-no-kai

http://kakutani.com/articles/working_effectively_with_legacy_tdiary_code_using_cucumber_and_rspec.pdf2011年5月22日日曜日

Page 64: Let's begin Behavior Driven Development using RSpec

(3)

2011年5月22日日曜日

Page 65: Let's begin Behavior Driven Development using RSpec

ゼロから始める

2011年5月22日日曜日

Page 66: Let's begin Behavior Driven Development using RSpec

BDDでゼロから何かを作ってみよう

2011年5月22日日曜日

Page 67: Let's begin Behavior Driven Development using RSpec

FizzBuzzCounter

2011年5月22日日曜日

Page 68: Let's begin Behavior Driven Development using RSpec

FizzBuzz✓1から順に数を数える

✓3の倍数の時 “Fizz”

✓5の倍数の時 “Buzz”

✓3と5の公倍数の時 “FizzBuzz”

2011年5月22日日曜日

Page 69: Let's begin Behavior Driven Development using RSpec

# たとえばこんな感じで動くものFizzBuzzCounter.new.each do |i| p iend#=> 1# 2# “Fizz”# 4# “Buzz”

2011年5月22日日曜日

Page 70: Let's begin Behavior Driven Development using RSpec

# こういう使い方もできたらいいfbc = FizzBuzzCounter.newp fbc.next #=> 1p fbc.next #=> 2p fbc.next #=> “Fizz”fbc.each {|i| break if i > 14 }p fbc.next #=> “FizzBuzz”

2011年5月22日日曜日

Page 71: Let's begin Behavior Driven Development using RSpec

# Enumerable としても使いたいfbc = FizzBuzzCounter.newp fbc.take(3) #=> [1, 2, “Fizz”]p fbc.take(3) #=> [4, “Buzz”, “Fizz”]

2011年5月22日日曜日

Page 72: Let's begin Behavior Driven Development using RSpec

開発の流れ1.最初 spec ファイル [Failed]

2.空のクラスを作る [Success]

3.振る舞いを一つ記述する [Failed]

4.それを実装する [Success]

5.3 に戻る

2011年5月22日日曜日

Page 73: Let's begin Behavior Driven Development using RSpec

ディレクトリ構造と設定✓実装ファイルは lib ディレクトリの中に置く

✓spec ファイルは spec ディレクトリの中に lib ディレクトリ内と同じ階層構造で置く

✓$LOAD_PATH などの共通設定は spec/spec_helper.rb に書き、各 spec ファイル で require ‘spec_helper’ する。

2011年5月22日日曜日

Page 74: Let's begin Behavior Driven Development using RSpec

Live Coding

2011年5月22日日曜日

Page 75: Let's begin Behavior Driven Development using RSpec

http://jp.rubyist.net/magazine/?0032-TranslationArticle

RSpec Best Practice2011年5月22日日曜日

Page 76: Let's begin Behavior Driven Development using RSpec

describe FizzBuzzCounter do describe ‘.filter’ do context ‘with 1’ do it ‘returns 1’ do FizzBuzzCounter. filter(1).should be == 1 end end endend

2011年5月22日日曜日

Page 77: Let's begin Behavior Driven Development using RSpec

describe FizzBuzzCounter do describe ‘.filter’ do context ‘with 1’ do it ‘returns 1’ do FizzBuzzCounter. filter(1).should be == 1 end end endend

should は省略する

クラスメソッドにはピリオド

メソッドの実引数を context で説明する

2011年5月22日日曜日

Page 78: Let's begin Behavior Driven Development using RSpec

Observer Pattern

2011年5月22日日曜日

Page 79: Let's begin Behavior Driven Development using RSpec

+ attach_observer(observer)+ detach_observer(observer)+ notify()

Observable+ update()Observer

subject

observers

1 *

ConcreteObserverClient+ change()ConcreteObserver

2011年5月22日日曜日

Page 80: Let's begin Behavior Driven Development using RSpec

aConcreteObservable aConcreteObserver anotherConcreteObserveraClient

notify()

update()

update()

change()

2011年5月22日日曜日

Page 81: Let's begin Behavior Driven Development using RSpec

複数のオブジェクト間における相互作用を設計する

2011年5月22日日曜日

Page 82: Let's begin Behavior Driven Development using RSpec

aConcreteObservable aConcreteObserver anotherConcreteObserveraClient

notify()

update()

update()

change()

2011年5月22日日曜日

Page 83: Let's begin Behavior Driven Development using RSpec

振る舞いの抽出

✓対象の change() を呼び出したら、それ自身の notify() が呼び出される

✓対象の change() を呼び出したら、対象に事前に登録してあるオブザーバの update() が呼び出される

2011年5月22日日曜日

Page 84: Let's begin Behavior Driven Development using RSpec

Test Double

2011年5月22日日曜日

Page 85: Let's begin Behavior Driven Development using RSpec

describe ConcreteObservable do describe ‘#change’ do it ‘calls its notify()’ do subject.should_receive(:notify) subject.change end endend

2011年5月22日日曜日

Page 86: Let's begin Behavior Driven Development using RSpec

describe ConcreteObservable do describe ‘#change’ do subject { ConcreteObservable.new }

it “calls observers’ update()” do observer = double(‘an observer’) observer.should_receive(:update) subject.change end endend

2011年5月22日日曜日

Page 87: Let's begin Behavior Driven Development using RSpec

http://ironruby.codeplex.com/2011年5月22日日曜日