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

Let's begin Behavior Driven Development using RSpec

Embed Size (px)

DESCRIPTION

Introducing BDD and RSpec.

Citation preview

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日日曜日