際際滷

際際滷Share a Scribd company logo
RSpec のここがすごい RSpec で傚冱議な UnitTest! RSpec  Ruby には、 Test::Unit があるし、 噸宥に UnitTest がけるよね なんで殖
RSpec のここがすごい RSpec で傚冱議な UnitTest! まずはこれをてくれ require 'lru_cache' describe LruCache do describe " を兜豚晒する栽 " do it " は、サイズを局したら、そのサイズのキャッシュができる ." do targ = LruCache.new(10) targ.limit.should == 10 end it " もし、サイズにマイナス、魘匹靴燭蕁∪翌がk伏する ." do lambda{ LruCache.new(-1) }.should raise_error(ArgumentError) end it " もし、サイズに nil を局したら、箭翌がk伏する ." do lambda{ LruCache.new(nil) }.should raise_error(ArgumentError) end it " もし、サイズに方メ塒發魘匹靴燭蕁∪翌がk伏する ." do lambda{ LruCache.new("a") }.should raise_error(ArgumentError) end end end http://github.com/mitim/tddbc-lrucache/blob/master/lru_cache_spec.rb
RSpec のここがすごい RSpec で傚冱議な UnitTest! 1.  まず  LruCache にvする 峰 (describe) だよ、と傚冱して 1.  そのうちの仝兜豚晒をする栽々のテストだよ、と傚冱して 1.  仝サイズを局したら、そのサイズのキャッシュができる々べきだと、宥械できることをh苧していて 1.  その坪否で targ.limit は 10 であるべき (should) と苧幣して 2.  仝サイズにマイナス、魘匹靴燭蕁∪翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1.  その坪否で  ArgumentError という error がk伏するべきと苧幣して 3.  仝サイズに nil を局したら、箭翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1.  その坪否で  ArgumentError という error がk伏するべきと苧幣して 4.  仝サイズに方メ塒發魘匹靴燭蕁∪翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1.  その坪否で  ArgumentError という error がk伏するべきと苧幣して これをるだけで、 LruCache が 仝採をするプログラムなのか々 がえてくる  しかも、 Test::Unit  Java の JUnit4.1 參念犁隠よりも、より 峰が宴 でiみやすい
UnitTest の肝の送れ より繁が iみやすい テストへ RSpec で傚冱議な UnitTest! UnitTest がレまるなかで、JRされていったこと 1. UnitTest は、ホワイトボックス?テスト ( テスト鵑糧コ`ドを尖盾したうえ  でのテスト ) ではない 。 2. UnitTest でテストしているのは、テスト鵑離ラスとメソッドの インタ フェ`ス だ。 1.  つまりは、ブラックボックス?テスト、ステ`トボックス?テストに 麿な らない 。 3.  インタフェ`ス の故とは、インプットとアウトプットが採であるかをしっかり _羨すること。 1.  つまりは、その インタフェ`ス の尅る玲いをしっかり_羨すること。 そうだ 尅る玲い をテストするんだ。
UnitTest の肝の送れ より繁が iみやすい テストへ -> Behavior Test  というJRへ。 RSpec で傚冱議な UnitTest! だったら、尅る玲いをもっとわかりやすく峰できないかな -> Java  の栽  : JUnit4.5 assertThat()  の鞠
-> Ruby  の栽  : RSpec  の鞠 いずれでも、功久にある房襪蓮 コ`ドは蒦^萹家砲iむためにある贋壓 々だということ。
ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! どちらかというと O に輝する深え圭。しかし、そのコ`ドに嚥える唹のさは、フロ`チャ`ト參貧。 ブラックボックスやステ`トボックスの深え圭徭悶は、夛晒返隈とそれに育うモジュ`ル晒のr旗から贋壓している。
ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! ブラックボックス?テスト ブラックボックスとは、あるクラスの巷_アクセッサに廣して、その インタフェ`ス を苧らかにすること。 じっさいの コ`ドやオブジェクトの彜Bは深]に秘れない で佩う。 クラス そのクラスの巷_されている何蛍┘瓮愁奪匹筌廛蹈僖謄5硲が、翌何からアクセス辛嬬になっていること。
ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! メソッド / プロパティ そのメソッドの IN  が苧らかになっていること。 IN 、哩、あるときは、それの
IN 、北」蒙eな」があるときは、その
IN 、オブジェクトの栽困修離好透`トに崙泙あるときは、ステ`ト IN 、 麝 のときの嘛が苧らかになっていること。 箭翌のk佩
gなるo嘛 IN 、鰉襪┐燭箸の OUT  が苧らかになっていること。 IN 、哩、あるときは、とくにその廠順、 OUT
IN 、北、あるときは、その栽の OUT
クラスにステ`トがあり、それにより OUT 、恣嘔される栽は、ステ`トeの OUT
ブラックボックス ステ`トボックス ステ`トボックス?テスト ステ`トボックスとは、あるクラスの オブジェクトのステ`ト やそのクラスが 麿に式ぼす唹 に廣して、そのステ`ト?唹を苧らかにすること。 じっさいの コ`ドは深]に秘れない で佩う。 クラス RSpec で傚冱議な UnitTest! そのクラス ( オブジェクト ) のステ`トとw卞が苧らかになっていること。
RSpec で傚冱議な UnitTest! ブラックボックス ステ`トボックス メソッド / プロパティ そのメソッドによる、クラス ( オブジェクト ) の ステ`トの筝 が苧らかになっていること。 IN 、砲茲襯好透`トの篁
IN 、八Fステ`トのMみ栽わせによるステ`トの篁 そのメソッドによる、 翌何への唹 が苧らかになっていること。 DB やファイル吉、h箪悶への唹
システム議なオブジェクトなど、徭附に砿尖慙泙里覆にのオブジェクトへの唹 そのメソッドでおこる、 翌何からの唹 が苧らかになっていること。 DB やファイル吉、h箪悶からの唹
システム議なオブジェクトなど、徭附に砿尖慙泙里覆にのオブジェクトからの唹
RSpec で傚冱議な UnitTest! ブラックボックス ステ`トボックス これらのインタフェ`スを吭Rしていくと しぜんに、肝のようなOを伉がけるようになっていく。 1.  メソッドの 哈方には、なるべく、鰓Oけない 。Oける栽も、双(enum)を聞 うなどしてヘ發砲覆蕕覆い茲Δ帽し鬚垢襦 2.  クラスの ステ`トは、駅勣恷詰泙撹する ようになる。}方のステ`トがjみ} jになる栽は、クラス蛍けを深え竃す。 3.  翌何への 唹は、なるべく電茅する ように深え竃す。翌何からの唹(筝辛嬬 來)も駅勣恷詰泙悄 TDD ではどうQうか 1.  どうテストをいたらいいかわからなくなった,修鵑rの峺になる。 2.  ただし、あまりガチガチに`られないように。
RSpec  のやる並、やらない並 RSpec のやる並 RSpec のやらない並 ( もちろん )UnitTest がける。
軸恙に UnitTest をg佩して、そのY惚をすぐに誼られる。
モックやスタブを聞える。 モックやスタブを聞えば、テスト譴鮟gれる。 Ruby のありとあらゆるC嬬が旋喘できる とくに、リフレクションがそのまま聞えたり、猟忖双伏撹がSなのがうれしい。 ホワイトボックス?テストはサポ`トしない。 もちろんデバッガC嬬なんてないし。 コ`ド?カバレッジはyしない。 rcovなどを旋喘しよう。 筝泣を湖岑しての徭g佩はされない。 e余CI吉を旋喘しよう。 RSpec で傚冱議な UnitTest!
RSpec の猟 なにはなくとも require require  'lru_cache' テスト鵑離侫.ぅ をiみzませる。 ちなみに、RSpecの採かをrequireする駅勣なない。 RSpec で傚冱議な UnitTest!
RSpec で傚冱議な UnitTest! RSpec の猟 まずは児云 describe  do end で、匯桑翌箸離屮蹈奪を峰する。 宥械は、肝のようにテスト鵑離ラスを傚冱しておく。 また、匯wにh苧を原けることも辛嬬。 describe   LRUCache  do end describe   LRUCache ,  " を兜豚晒する栽 "  do end もちろん、h苧だけにすることも辛嬬。  describe   "LRUCache のケ`ス "  do end
RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 describeの嶄にもdescribeを嶷ねられる たとえば、揖じクラスのテストでも、 兜豚晒のテストをがっつりやって、 肝にhogeメソッドのテスト、 そしてfugaメソッドのテストを ´とやっていくと、 駅隼議にテストがLくづらくなってくる 。 たとえば、 hogeメソッドのテストと fugaメソッドのテストとでは、 念笋捻慴なものがぜんぜん`う 。 そんなときには、 describe のなかにさらに describe をいて 、屁尖をつけることができる。
RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 describeのh苧猟 ここに採をくべきか。 徭隼に碧っぽく撹した猟にしたいなら、肝のように櫃鬚弔韻酉峰してみるといい。 [ クラス兆 ] ,  ^[ て / に / を / は / の ]$$ する栽 ( ケ`ス ) ̄ ☆クラス兆は、ひとつ貧のdescribeでまとめてしまった圭が峰がスッキリするのは、 冱うまでもoい。
RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 テストの念 before テスト云猟itをg佩する念に駅勣な、 テストと岷俊はvSない笋里燭瓩I尖 を峰する。 たとえば、テスト鵑離ブジェクトを伏撹して、インスタンス篳に秘れたり。 たとえば、モックやスタブを喘吭して、云麗のオブジェクトと彫り紋えたり。 たとえば、ファイルを喘吭したり。  before  :each do end before  :all do end :each を峺協した before は、光テスト (it) のたびに、その念に駅ずg佩される。 :all を峺協した before は、 describe の恷兜に匯業だけg佩される。
RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 テストの瘁I尖 after テストitをg佩した瘁に駅勣な、 テストと岷俊はvSない瘁頭原けのためのI尖 を峰する。  after  :each do end after  :all do end :each を峺協した after は、光テスト (it) をg佩するたびに、その瘁に駅ずg佩される。  :all を峺協した after は、 describe の恷瘁に匯業だけg佩される。
RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 テストのコ`ドは、すべて it の嶄に峰する。 児云議なき圭は、肝のとおり。  it  " テストのh苧 "  do [ テスト鵐ブジェクト ] . [ テスト鵐瓮愁奪 ] .should ==  [ Y惚 ] end
RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 ここに採をくべきか。 徭隼に碧っぽく撹した猟にしたい栽、肝のように櫃鬚弔韻酉峰してみるといい。 "[ どのような荷恬をする ] と、 [ そのY惚はどうなる ] 。 " itのh苧猟 児云議なC嬬勣周をh苧する栽 蒙歩なC嬬勣周や、エラ`議なC嬬勣周をh苧する栽 ^ は、$$すると、 〜〜 になる。 ̄ ^ もし、$$すると、 〜〜 になる。 ̄
RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 shouldメソッドは、そのオブジェクトの彜Bを_Jし、峺協された彜Bであるか倦か( ゛であるべき )を砲垢襦 ==  處麻徨のほか、 be 狼の Matcher が謹方喘吭されている。 畠てのオブジェクトに啜弔房咾┐蕕譴織瓮愁奪匹覆里如∋云議には採でも某苗棔 shouldメソッド should_notメソッド shouldと`い、こちらは倦協( ゛であってはいけない )をするときに聞喘する。
RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 shouldで砲任るよう、謹方のMatcherが喘吭されている。 Matcher蛤 == expected ==曳^のY惚が揖じか be_true 寔であるか be_false 里任△襪 be_nil nilか be_empty Arrayが腎か be_an_instance_of Class クラスがClassと匯崑するか be_a_kind_of Class クラスが峺協Class、もしくはそのサブクラスか == expected ==曳^のY惚が揖じか be_true 寔であるか be_false 里任△襪 be_nil nilか be_empty Arrayが腎か be_an_instance_of Class クラスがClassと匯崑するか be_a_kind_of Class クラスが峺協Class、もしくはそのサブクラスか
Ad

Recommended

屎号燕崔稠浸
屎号燕崔稠浸
zaru sakuraba
?
書さらなか?ら檎皆沿艶界に秘壇してみた
書さらなか?ら檎皆沿艶界に秘壇してみた
zaru sakuraba
?
Effective JavaScript Ch.1
Effective JavaScript Ch.1
Teppei Sato
?
永姻看沿鞄艶界霞を聞ったユニットテスト
永姻看沿鞄艶界霞を聞ったユニットテスト
Akio Ishida
?
永堰永児粥茶膿氏
永堰永児粥茶膿氏
Yuji Otani
?
phpspecで僥ぶLondon School TDD
phpspecで僥ぶLondon School TDD
Akio Ishida
?
#027 tddのさわり
#027 tddのさわり
畢和 崘圍
?
Orientations Inventory
Orientations Inventory
resurrectionsession
?
Infomil als informatiepunt over het Activiteitenbesluit
Infomil als informatiepunt over het Activiteitenbesluit
Netherlands Enterprise Agency (RVO.nl)
?
UCV IEEE fam ss
Francisco Apablaza
?
MacRuby Jogo Rapido
MacRuby Jogo Rapido
Diogo Santos
?
S Spw Ppt Edit
S Spw Ppt Edit
Konevo311
?
Acqueon - RAP CMS Data Bridge - Presentation
Acqueon - RAP CMS Data Bridge - Presentation
Acqueon Technologies Inc.
?
Inverted Nipple Correction
Inverted Nipple Correction
SHAILESH NISAL
?
Keylingo Translations Summary
Keylingo Translations Summary
themarxhouse
?
Интернет для индустрии красоты
Интернет для индустрии красоты
Fert
?
Russia
Russia
mazavr
?
Portfolio
Portfolio
thatguy88
?
Migration To The United States Of America
Migration To The United States Of America
13aadx
?
Installing the oracle bi mobile app designer
Installing the oracle bi mobile app designer
Ravi Kumar Lanke
?
Creating new service name for oracle database
Creating new service name for oracle database
Ravi Kumar Lanke
?
Earn More, Save More Or Invest Wisely V2
Earn More, Save More Or Invest Wisely V2
Sudhir Agarwal
?
Ca eed 2014 milan wg5 4 nl split incentive
Ca eed 2014 milan wg5 4 nl split incentive
Netherlands Enterprise Agency (RVO.nl)
?
[HQ NACIONAL] STREET FIGHTER II - ANO I: N?MERO 1 - Parte 4 ( Completo 10/ 0...
Santu│rio do Mestre Ryu
?
Strategie nutrizionali nella corsa gjav integratori ferrara
Strategie nutrizionali nella corsa gjav integratori ferrara
GJAV
?
Chicago (Group schoolwork project)
Chicago (Group schoolwork project)
Sonny Brabez
?
Ruby 3の侏容やってます
Ruby 3の侏容やってます
mametter
?
及3指京禽禽茶膿氏
及3指京禽禽茶膿氏
zakihaya
?

More Related Content

Viewers also liked (20)

Orientations Inventory
Orientations Inventory
resurrectionsession
?
Infomil als informatiepunt over het Activiteitenbesluit
Infomil als informatiepunt over het Activiteitenbesluit
Netherlands Enterprise Agency (RVO.nl)
?
UCV IEEE fam ss
Francisco Apablaza
?
MacRuby Jogo Rapido
MacRuby Jogo Rapido
Diogo Santos
?
S Spw Ppt Edit
S Spw Ppt Edit
Konevo311
?
Acqueon - RAP CMS Data Bridge - Presentation
Acqueon - RAP CMS Data Bridge - Presentation
Acqueon Technologies Inc.
?
Inverted Nipple Correction
Inverted Nipple Correction
SHAILESH NISAL
?
Keylingo Translations Summary
Keylingo Translations Summary
themarxhouse
?
Интернет для индустрии красоты
Интернет для индустрии красоты
Fert
?
Russia
Russia
mazavr
?
Portfolio
Portfolio
thatguy88
?
Migration To The United States Of America
Migration To The United States Of America
13aadx
?
Installing the oracle bi mobile app designer
Installing the oracle bi mobile app designer
Ravi Kumar Lanke
?
Creating new service name for oracle database
Creating new service name for oracle database
Ravi Kumar Lanke
?
Earn More, Save More Or Invest Wisely V2
Earn More, Save More Or Invest Wisely V2
Sudhir Agarwal
?
Ca eed 2014 milan wg5 4 nl split incentive
Ca eed 2014 milan wg5 4 nl split incentive
Netherlands Enterprise Agency (RVO.nl)
?
[HQ NACIONAL] STREET FIGHTER II - ANO I: N?MERO 1 - Parte 4 ( Completo 10/ 0...
Santu│rio do Mestre Ryu
?
Strategie nutrizionali nella corsa gjav integratori ferrara
Strategie nutrizionali nella corsa gjav integratori ferrara
GJAV
?
Chicago (Group schoolwork project)
Chicago (Group schoolwork project)
Sonny Brabez
?
UCV IEEE fam ss
Francisco Apablaza
?
Inverted Nipple Correction
Inverted Nipple Correction
SHAILESH NISAL
?
Keylingo Translations Summary
Keylingo Translations Summary
themarxhouse
?
Интернет для индустрии красоты
Интернет для индустрии красоты
Fert
?
Migration To The United States Of America
Migration To The United States Of America
13aadx
?
Installing the oracle bi mobile app designer
Installing the oracle bi mobile app designer
Ravi Kumar Lanke
?
Creating new service name for oracle database
Creating new service name for oracle database
Ravi Kumar Lanke
?
Earn More, Save More Or Invest Wisely V2
Earn More, Save More Or Invest Wisely V2
Sudhir Agarwal
?
[HQ NACIONAL] STREET FIGHTER II - ANO I: N?MERO 1 - Parte 4 ( Completo 10/ 0...
Santu│rio do Mestre Ryu
?
Strategie nutrizionali nella corsa gjav integratori ferrara
Strategie nutrizionali nella corsa gjav integratori ferrara
GJAV
?
Chicago (Group schoolwork project)
Chicago (Group schoolwork project)
Sonny Brabez
?

Similar to 檎皆沿艶界のここがすごい (20)

Ruby 3の侏容やってます
Ruby 3の侏容やってます
mametter
?
及3指京禽禽茶膿氏
及3指京禽禽茶膿氏
zakihaya
?
R spec茶氏
R spec茶氏
Tatsunori Nishikori
?
仇囿皆沿艶界
仇囿皆沿艶界
Tsunenori Oohara
?
恷除のg悶テスト
恷除のg悶テスト
Ken Morishita
?
侏プロファイラ些蚣鷭矚に児づくRuby 3の床議盾裂
侏プロファイラ些蚣鷭矚に児づくRuby 3の床議盾裂
mametter
?
Ruby2.0 - refinements - B函Ruby氏 及11指
Ruby2.0 - refinements - B函Ruby氏 及11指
Rie HIRONO
?
Small eigen collider ruby kaigi 2011
Small eigen collider ruby kaigi 2011
Andrew Grimm
?
Tdd
Tdd
Takaya Kotohata
?
はこだてIKA 及4指茶氏 g悶テスト
はこだてIKA 及4指茶氏 g悶テスト
Seiji KOMATSU
?
及4指茶氏 g悶テストのすすめ
及4指茶氏 g悶テストのすすめ
hakoika-itwg
?
Start!! Ruby
Start!! Ruby
mitim
?
テスティングフレ`ムワ`クに秘Tしてみた - Swift
テスティングフレ`ムワ`クに秘Tしてみた - Swift
Hisakuni Fujimoto
?
Ruby茶氏@奬始 "Rubyist秘Tv恙"
Ruby茶氏@奬始 "Rubyist秘Tv恙"
Koji SHIMADA
?
Small eigen collider ruby kaigi 2011
Small eigen collider ruby kaigi 2011
Andrew Grimm
?
遺看恢看鉛でもやりたいテスト徭強晒
遺看恢看鉛でもやりたいテスト徭強晒
daisukhayash
?
Ruby兜宀鬚吋譽奪好 及46指 ぉぉ Test::Unit
Ruby兜宀鬚吋譽奪好 及46指 ぉぉ Test::Unit
higaki
?
Ruby on Railsて?はし?めるrspecテスト
Ruby on Railsて?はし?めるrspecテスト
Kanako Kobayashi
?
SpockからRSpecにきたときの櫃?き #coedorb
SpockからRSpecにきたときの櫃?き #coedorb
Youtarou TAKAHASHI
?
Ruby 3の侏容やってます
Ruby 3の侏容やってます
mametter
?
及3指京禽禽茶膿氏
及3指京禽禽茶膿氏
zakihaya
?
侏プロファイラ些蚣鷭矚に児づくRuby 3の床議盾裂
侏プロファイラ些蚣鷭矚に児づくRuby 3の床議盾裂
mametter
?
Ruby2.0 - refinements - B函Ruby氏 及11指
Ruby2.0 - refinements - B函Ruby氏 及11指
Rie HIRONO
?
Small eigen collider ruby kaigi 2011
Small eigen collider ruby kaigi 2011
Andrew Grimm
?
はこだてIKA 及4指茶氏 g悶テスト
はこだてIKA 及4指茶氏 g悶テスト
Seiji KOMATSU
?
及4指茶氏 g悶テストのすすめ
及4指茶氏 g悶テストのすすめ
hakoika-itwg
?
Start!! Ruby
Start!! Ruby
mitim
?
テスティングフレ`ムワ`クに秘Tしてみた - Swift
テスティングフレ`ムワ`クに秘Tしてみた - Swift
Hisakuni Fujimoto
?
Ruby茶氏@奬始 "Rubyist秘Tv恙"
Ruby茶氏@奬始 "Rubyist秘Tv恙"
Koji SHIMADA
?
Small eigen collider ruby kaigi 2011
Small eigen collider ruby kaigi 2011
Andrew Grimm
?
遺看恢看鉛でもやりたいテスト徭強晒
遺看恢看鉛でもやりたいテスト徭強晒
daisukhayash
?
Ruby兜宀鬚吋譽奪好 及46指 ぉぉ Test::Unit
Ruby兜宀鬚吋譽奪好 及46指 ぉぉ Test::Unit
higaki
?
Ruby on Railsて?はし?めるrspecテスト
Ruby on Railsて?はし?めるrspecテスト
Kanako Kobayashi
?
SpockからRSpecにきたときの櫃?き #coedorb
SpockからRSpecにきたときの櫃?き #coedorb
Youtarou TAKAHASHI
?
Ad

檎皆沿艶界のここがすごい

  • 1. RSpec のここがすごい RSpec で傚冱議な UnitTest! RSpec Ruby には、 Test::Unit があるし、 噸宥に UnitTest がけるよね なんで殖
  • 2. RSpec のここがすごい RSpec で傚冱議な UnitTest! まずはこれをてくれ require 'lru_cache' describe LruCache do describe " を兜豚晒する栽 " do it " は、サイズを局したら、そのサイズのキャッシュができる ." do targ = LruCache.new(10) targ.limit.should == 10 end it " もし、サイズにマイナス、魘匹靴燭蕁∪翌がk伏する ." do lambda{ LruCache.new(-1) }.should raise_error(ArgumentError) end it " もし、サイズに nil を局したら、箭翌がk伏する ." do lambda{ LruCache.new(nil) }.should raise_error(ArgumentError) end it " もし、サイズに方メ塒發魘匹靴燭蕁∪翌がk伏する ." do lambda{ LruCache.new("a") }.should raise_error(ArgumentError) end end end http://github.com/mitim/tddbc-lrucache/blob/master/lru_cache_spec.rb
  • 3. RSpec のここがすごい RSpec で傚冱議な UnitTest! 1. まず LruCache にvする 峰 (describe) だよ、と傚冱して 1. そのうちの仝兜豚晒をする栽々のテストだよ、と傚冱して 1. 仝サイズを局したら、そのサイズのキャッシュができる々べきだと、宥械できることをh苧していて 1. その坪否で targ.limit は 10 であるべき (should) と苧幣して 2. 仝サイズにマイナス、魘匹靴燭蕁∪翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1. その坪否で ArgumentError という error がk伏するべきと苧幣して 3. 仝サイズに nil を局したら、箭翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1. その坪否で ArgumentError という error がk伏するべきと苧幣して 4. 仝サイズに方メ塒發魘匹靴燭蕁∪翌がk伏する々べきだと、哈方がおかしい栽に軟こることをh苧していて 1. その坪否で ArgumentError という error がk伏するべきと苧幣して これをるだけで、 LruCache が 仝採をするプログラムなのか々 がえてくる しかも、 Test::Unit Java の JUnit4.1 參念犁隠よりも、より 峰が宴 でiみやすい
  • 4. UnitTest の肝の送れ より繁が iみやすい テストへ RSpec で傚冱議な UnitTest! UnitTest がレまるなかで、JRされていったこと 1. UnitTest は、ホワイトボックス?テスト ( テスト鵑糧コ`ドを尖盾したうえ でのテスト ) ではない 。 2. UnitTest でテストしているのは、テスト鵑離ラスとメソッドの インタ フェ`ス だ。 1. つまりは、ブラックボックス?テスト、ステ`トボックス?テストに 麿な らない 。 3. インタフェ`ス の故とは、インプットとアウトプットが採であるかをしっかり _羨すること。 1. つまりは、その インタフェ`ス の尅る玲いをしっかり_羨すること。 そうだ 尅る玲い をテストするんだ。
  • 5. UnitTest の肝の送れ より繁が iみやすい テストへ -> Behavior Test というJRへ。 RSpec で傚冱議な UnitTest! だったら、尅る玲いをもっとわかりやすく峰できないかな -> Java の栽 : JUnit4.5 assertThat() の鞠
  • 6. -> Ruby の栽 : RSpec の鞠 いずれでも、功久にある房襪蓮 コ`ドは蒦^萹家砲iむためにある贋壓 々だということ。
  • 7. ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! どちらかというと O に輝する深え圭。しかし、そのコ`ドに嚥える唹のさは、フロ`チャ`ト參貧。 ブラックボックスやステ`トボックスの深え圭徭悶は、夛晒返隈とそれに育うモジュ`ル晒のr旗から贋壓している。
  • 8. ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! ブラックボックス?テスト ブラックボックスとは、あるクラスの巷_アクセッサに廣して、その インタフェ`ス を苧らかにすること。 じっさいの コ`ドやオブジェクトの彜Bは深]に秘れない で佩う。 クラス そのクラスの巷_されている何蛍┘瓮愁奪匹筌廛蹈僖謄5硲が、翌何からアクセス辛嬬になっていること。
  • 9. ブラックボックス ステ`トボックス RSpec で傚冱議な UnitTest! メソッド / プロパティ そのメソッドの IN が苧らかになっていること。 IN 、哩、あるときは、それの
  • 11. IN 、オブジェクトの栽困修離好透`トに崙泙あるときは、ステ`ト IN 、 麝 のときの嘛が苧らかになっていること。 箭翌のk佩
  • 12. gなるo嘛 IN 、鰉襪┐燭箸の OUT が苧らかになっていること。 IN 、哩、あるときは、とくにその廠順、 OUT
  • 15. ブラックボックス ステ`トボックス ステ`トボックス?テスト ステ`トボックスとは、あるクラスの オブジェクトのステ`ト やそのクラスが 麿に式ぼす唹 に廣して、そのステ`ト?唹を苧らかにすること。 じっさいの コ`ドは深]に秘れない で佩う。 クラス RSpec で傚冱議な UnitTest! そのクラス ( オブジェクト ) のステ`トとw卞が苧らかになっていること。
  • 16. RSpec で傚冱議な UnitTest! ブラックボックス ステ`トボックス メソッド / プロパティ そのメソッドによる、クラス ( オブジェクト ) の ステ`トの筝 が苧らかになっていること。 IN 、砲茲襯好透`トの篁
  • 17. IN 、八Fステ`トのMみ栽わせによるステ`トの篁 そのメソッドによる、 翌何への唹 が苧らかになっていること。 DB やファイル吉、h箪悶への唹
  • 20. RSpec で傚冱議な UnitTest! ブラックボックス ステ`トボックス これらのインタフェ`スを吭Rしていくと しぜんに、肝のようなOを伉がけるようになっていく。 1. メソッドの 哈方には、なるべく、鰓Oけない 。Oける栽も、双(enum)を聞 うなどしてヘ發砲覆蕕覆い茲Δ帽し鬚垢襦 2. クラスの ステ`トは、駅勣恷詰泙撹する ようになる。}方のステ`トがjみ} jになる栽は、クラス蛍けを深え竃す。 3. 翌何への 唹は、なるべく電茅する ように深え竃す。翌何からの唹(筝辛嬬 來)も駅勣恷詰泙悄 TDD ではどうQうか 1. どうテストをいたらいいかわからなくなった,修鵑rの峺になる。 2. ただし、あまりガチガチに`られないように。
  • 21. RSpec のやる並、やらない並 RSpec のやる並 RSpec のやらない並 ( もちろん )UnitTest がける。
  • 23. モックやスタブを聞える。 モックやスタブを聞えば、テスト譴鮟gれる。 Ruby のありとあらゆるC嬬が旋喘できる とくに、リフレクションがそのまま聞えたり、猟忖双伏撹がSなのがうれしい。 ホワイトボックス?テストはサポ`トしない。 もちろんデバッガC嬬なんてないし。 コ`ド?カバレッジはyしない。 rcovなどを旋喘しよう。 筝泣を湖岑しての徭g佩はされない。 e余CI吉を旋喘しよう。 RSpec で傚冱議な UnitTest!
  • 24. RSpec の猟 なにはなくとも require require 'lru_cache' テスト鵑離侫.ぅ をiみzませる。 ちなみに、RSpecの採かをrequireする駅勣なない。 RSpec で傚冱議な UnitTest!
  • 25. RSpec で傚冱議な UnitTest! RSpec の猟 まずは児云 describe do end で、匯桑翌箸離屮蹈奪を峰する。 宥械は、肝のようにテスト鵑離ラスを傚冱しておく。 また、匯wにh苧を原けることも辛嬬。 describe LRUCache do end describe LRUCache , " を兜豚晒する栽 " do end もちろん、h苧だけにすることも辛嬬。 describe "LRUCache のケ`ス " do end
  • 26. RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 describeの嶄にもdescribeを嶷ねられる たとえば、揖じクラスのテストでも、 兜豚晒のテストをがっつりやって、 肝にhogeメソッドのテスト、 そしてfugaメソッドのテストを ´とやっていくと、 駅隼議にテストがLくづらくなってくる 。 たとえば、 hogeメソッドのテストと fugaメソッドのテストとでは、 念笋捻慴なものがぜんぜん`う 。 そんなときには、 describe のなかにさらに describe をいて 、屁尖をつけることができる。
  • 27. RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 describeのh苧猟 ここに採をくべきか。 徭隼に碧っぽく撹した猟にしたいなら、肝のように櫃鬚弔韻酉峰してみるといい。 [ クラス兆 ] , ^[ て / に / を / は / の ]$$ する栽 ( ケ`ス ) ̄ ☆クラス兆は、ひとつ貧のdescribeでまとめてしまった圭が峰がスッキリするのは、 冱うまでもoい。
  • 28. RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 テストの念 before テスト云猟itをg佩する念に駅勣な、 テストと岷俊はvSない笋里燭瓩I尖 を峰する。 たとえば、テスト鵑離ブジェクトを伏撹して、インスタンス篳に秘れたり。 たとえば、モックやスタブを喘吭して、云麗のオブジェクトと彫り紋えたり。 たとえば、ファイルを喘吭したり。 before :each do end before :all do end :each を峺協した before は、光テスト (it) のたびに、その念に駅ずg佩される。 :all を峺協した before は、 describe の恷兜に匯業だけg佩される。
  • 29. RSpec の猟 RSpec で傚冱議な UnitTest! describe の嶄 テストの瘁I尖 after テストitをg佩した瘁に駅勣な、 テストと岷俊はvSない瘁頭原けのためのI尖 を峰する。 after :each do end after :all do end :each を峺協した after は、光テスト (it) をg佩するたびに、その瘁に駅ずg佩される。 :all を峺協した after は、 describe の恷瘁に匯業だけg佩される。
  • 30. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 テストのコ`ドは、すべて it の嶄に峰する。 児云議なき圭は、肝のとおり。 it " テストのh苧 " do [ テスト鵐ブジェクト ] . [ テスト鵐瓮愁奪 ] .should == [ Y惚 ] end
  • 31. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 ここに採をくべきか。 徭隼に碧っぽく撹した猟にしたい栽、肝のように櫃鬚弔韻酉峰してみるといい。 "[ どのような荷恬をする ] と、 [ そのY惚はどうなる ] 。 " itのh苧猟 児云議なC嬬勣周をh苧する栽 蒙歩なC嬬勣周や、エラ`議なC嬬勣周をh苧する栽 ^ は、$$すると、 〜〜 になる。 ̄ ^ もし、$$すると、 〜〜 になる。 ̄
  • 32. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 shouldメソッドは、そのオブジェクトの彜Bを_Jし、峺協された彜Bであるか倦か( ゛であるべき )を砲垢襦 == 處麻徨のほか、 be 狼の Matcher が謹方喘吭されている。 畠てのオブジェクトに啜弔房咾┐蕕譴織瓮愁奪匹覆里如∋云議には採でも某苗棔 shouldメソッド should_notメソッド shouldと`い、こちらは倦協( ゛であってはいけない )をするときに聞喘する。
  • 33. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 shouldで砲任るよう、謹方のMatcherが喘吭されている。 Matcher蛤 == expected ==曳^のY惚が揖じか be_true 寔であるか be_false 里任△襪 be_nil nilか be_empty Arrayが腎か be_an_instance_of Class クラスがClassと匯崑するか be_a_kind_of Class クラスが峺協Class、もしくはそのサブクラスか == expected ==曳^のY惚が揖じか be_true 寔であるか be_false 里任△襪 be_nil nilか be_empty Arrayが腎か be_an_instance_of Class クラスがClassと匯崑するか be_a_kind_of Class クラスが峺協Class、もしくはそのサブクラスか
  • 34. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 Matcher蛤 have_key key keyがあるか be_close E,D 方、、E゛Dの譴Г泙辰討い襪 change receiver,message,&block Procオブジェクトが篁するか change(receiver,message,&block).by value Procオブジェクトが峺協された、篁するか(should_notは聞喘できない) change(receiver,message,&block).from(before).to(after) Procオブジェクトがbeforeからafterに篁するか(should_notは聞喘できない) eql expected ==とほぼ揖x((eql?で曳^) equal expected 揖じオブジェクトか have(n).items 塘双などのコレクションオブジェクトが、nの勣殆を隔っているか。 have_exactly(n).items 塘双などのコレクションオブジェクトが、ちょうどnの勣殆を隔っているか。(should_notは聞喘できない) have_at_least(n).items 塘双などのコレクションオブジェクトが、n參貧の勣殆を隔っているか。(should_notは聞喘できない) have_at_most(n).items 塘双などのコレクションオブジェクトが、n參和の勣殆を隔っているか。(should_notは聞喘できない)
  • 35. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 Matcher蛤 include expected 塘双などのコレクションオブジェクトに、expectedが秘っているか。 match regexp 屎ア蹶Fregexpにマッチするか。 raise_error 箭翌がk伏するか。 raise_error Expected Expectedな箭翌がk伏するか。 raise_error Expected,message Expectedな箭翌が、messageを育ってk伏するか。 raise_error Expected,regexp Expectedな箭翌が、屎ア蹶Fにマッチするメッセ`ジを育ってk伏するか。 respond_to method,method,method... オブジェクトが、峺協メソッドを畠て隔つか。 satisfy {e ...} ブロックのg佩Y惚eにテストオブジェクトが局されるが寔になるか。 thorw_symbol(symbol=nil) symbolがthrowされるか。 いてる云繁が、聞ったことがないMatcherが謹方。
  • 36. RSpec の猟 RSpec で傚冱議な UnitTest! it の嶄 箭翌がk佩されたかどうかはどうチェックする 肝のようにすると、箭翌の俺彌ができ、箭翌k佩チェックができる。 proc{ [タ`ゲットオブジェクト].[タ`ゲットメソッド] }.should raise_error
  • 37. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 RSpecには、gなスタブとモックをMみzむCが喘吭されている。 ここでは、RSpecのスタブ/モックC嬬に醜泣を輝てる。 gなCなので、もっとダイナミックな碧Mみが圀しい栽は、mochaやflex_mockなどのモック喘ライブラリ/フレ`ムワ`クを旋喘した圭が紳覆いい。
  • 38. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 スタブとモックの`い スタブもモックも、UnitTestで駅勣になる、坪何聞喘している何瞳をエミュレ`トすることで、 云麗の何瞳の旗喘となる腎 のようなもののことを峺す。 なぜこんなものが駅勣なのか燭修譴蓮△海鵑弊輦匹砲茲辰討い襦 畠てを仝云麗々でテストしようとすると、仝畠てがBわないとテストできない々という云挑宜な並が軟こりかねない。
  • 40. UnitTest が寄きな}に卞ると粁?とY栽テスト晒してしまう、という}がある。 ある殻業のスタブ/モックを聞喘することで、これらの}が嗤C議にクリアされていく。 ☆ ただし、スタブ/モックを謹喘し^ぎると、書業はインタフェ`ス音匯崑のkを枠僕りにする、という彜rにもなりかねない。このあたりはさじ紗pが駅勣。
  • 41. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 スタブとモックの`い では、スタブとモックの`いはなにか 恷除、 Martin Fowler らが、このスタブとモックの`いにvして中易い深賀をしていた。この協xは書や匯違晒しており、RSpecでもこの吭龍でスタブとモックとを聞い蛍けている。 スタブ 仝 インタフェ`スの協xだけ匯崑 していれば、嶄附はどのように咾い討發いい里如△箸蠅△┐采智發靴討く腎筺垢里海箸鰕圓Α モック 仝インタフェ`スの協xだけではなく、 それがどのに柵ばれるか、またそれにして採を卦すべきかまでを庁 した腎筺垢里海箸鰕圓Α
  • 42. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 スタブ 採かのクラスのアクセッサをスタブ晒するときは、肝の猟でアクセッサをスタブに彫り紋える。 たとえば肝のようにくと、Stringクラスのsizeメソッドが、駅ず10を卦抜するようになる。 [クラス] .stub! (:[アクセッサ]) .and_return ([り]) # [クラス]は[アクセッサ]をスタブ晒し、[り]を卦す。 String .stub! (:size) .and_return (10)
  • 43. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 モック 採かのクラスのアクセッサをモック晒するときは、肝の猟でアクセッサをモックに彫り紋える。 [クラス] .should_recieve (:[アクセッサ]) # [クラス]は[アクセッサ]が柵ばれることを豚棋する。 [クラス] .should_recieve (:[アクセッサ]) .and_return ([り]) # [クラス]は[アクセッサ]が柵ばれることを豚棋し、そのY惚として[り]を卦す。 [クラス] .should_recieve (:[アクセッサ]) .with ([哈方]) .and_return ([り]) # [クラス]は[アクセッサ]が[哈方]で柵ばれることを豚棋し、そのY惚として[り]を卦す。
  • 44. RSpec の猟 RSpec で傚冱議な UnitTest! スタブ / モックC嬬 たとえば肝のようにくと、Arrayクラスのsliceメソッドが哈方(5,5)で柵ばれることを豚棋し、そのY惚として[5,6,7,8,9]を卦抜するようになる。 Array .should_recieve (:slice) .with (5,5) .and_return ([5,6,7,8,9]) モック
  • 45. RSpec をg佩しよう RSpec で傚冱議な UnitTest! 宥械のプログラミングrにテストを佩う栽 RSpecは、コンソ`ルからコマンドラインでg佩する。NetBeansを聞うと、なんとIDE坪でグラフ原でg佩できる。 $ spec -c -fs [specコ`ドファイル.rb] コンソ`ルを竃す。 Windowsの栽、Ruby Consoleを竃して specコ`ドのあるディレクトリに卞咾垢襦
  • 47. RSpec をg佩しよう RSpec で傚冱議な UnitTest! CI のなかでテストを宥して佩う栽 $ spec -c -fh [specコ`ドファイル.rb] > result.html 肝のようにすると、 HTML 侘塀でY惚を竃薦してくれる。 竃薦したHTMLを蒙協HTTPサ`バに塘崔するなり、メ`ルに耶原するなどまでを徭啝すると、かなり聞えるツ`ルになる。