Slide 1

Slide 1 text

ʰΞδϟΠϧιϑτ΢ΣΞ։ൃͷ Ԟٛʱ͔ΒֶͿςετۦಈ։ൃ +BOVBSZUI 5BLFTIJ:POFLVCP !UZPOFLVCP

Slide 2

Slide 2 text

ςετϑΝʔετ ͱ ςετۦಈ։ൃ

Slide 3

Slide 3 text

ςετϑΝʔετ ϓϩμΫτίʔυΑΓઌʹ ςετίʔυΛॻ͘͜ͱ

Slide 4

Slide 4 text

ςετۦಈ։ൃ 5FTU%SJWFO%FWFMPQNFOU ςετίʔυΛಓ۩ʹ 
 ͯ͠ɺ։ൃΛճ͢͜ͱ

Slide 5

Slide 5 text

ϨουάϦʔϯϦϑΝΫλϦϯά ᶃࣦഊ͢ΔςετΛॻ͘ ᶄςετ͕௨Δγϯϓϧ ͳίʔυΛॻ͘ ᶅϦϑΝΫλϦϯά͠ ͯίʔυΛ៉ྷʹ͢Δ

Slide 6

Slide 6 text

ςετϑΝʔετ͕ͩ ςετۦಈ։ൃͰͳ͍ྫ ઌʹ͢΂ͯͷςετίʔυΛॻ͘ class FooTest { def testFoo1() { } def testFoo2() { } def testFoo3() { } def testFoo4() { } … } class Foo { // ͜Ε͔Β࣮૷ }

Slide 7

Slide 7 text

ςετϑΝʔετ͕ͩ ςετۦಈ։ൃͰͳ͍ྫ ໰୊఺ ᶃࣦഊ͢ΔςετΛॻ͘ ᶄςετ͕௨Δγϯϓϧ ͳίʔυΛॻ͘ ᶅϦϑΝΫλϦϯά͠ ͯίʔυΛ៉ྷʹ͢Δ ϑΟʔυόοΫͷܽ೗

Slide 8

Slide 8 text

ςετϑΝʔετ͕ͩ ςετۦಈ։ൃͰͳ͍ྫ ࣄલʹઃܭ͠ա͗Δ class FooTest { def testDoFoo() { } } class BarTest { def testDoBar() { } }

Slide 9

Slide 9 text

ςετϑΝʔετ͕ͩ ςετۦಈ։ൃͰͳ͍ྫ ໰୊఺ ᶃࣦഊ͢ΔςετΛॻ͘ ᶄςετ͕௨Δγϯϓϧ ͳίʔυΛॻ͘ ᶅϦϑΝΫλϦϯά͠ ͯίʔυΛ៉ྷʹ͢Δ ϧʔϓ͸ճΔ͕ޮՌ͕ݮΔ

Slide 10

Slide 10 text

#%6' ࣄલͷઃܭΛ΍Γա͗Δͱ ޡͬͨઃܭ΍ա৒ઃܭΛੜΉ #JH%FTJHO6Q'SPOU

Slide 11

Slide 11 text

αϯΫίετ ઌʹίετΛ෷ͬͯߦͬͨઃܭ͸ ࣺͯͮΒ͍ʢଛ੾ΓͰ͖ͳ͍ʣ 4VOL$PTU

Slide 12

Slide 12 text

2 5%%Ͱ͸ࣄલઃܭ͸͠ͳ͍ͷʁ

Slide 13

Slide 13 text

" ඞཁͳΒɺखॻ͖ͷϥϑεέον ΍$3$ͳͲखܰʹ࡞੒Ͱ͖ࣺͯͯ ΍͍͢πʔϧΛ࢖͏

Slide 14

Slide 14 text

ʮͳΜͱͳ͘ཧղ͸Ͱ͖͚ͨͲ ۩ମతʹͲ͏΍ͬͯ5%%Λ ਐΊ͍͍͔ͯΘ͔Βͳ͍ʯ

Slide 15

Slide 15 text

ͱͯ΋ྑ͍ྫ͕͋Γ·ͨ͠ʂ

Slide 16

Slide 16 text

ʲୈষʳ ϓϩάϥϛϯά Τϐιʔυ

Slide 17

Slide 17 text

Ϙ΢ϦϯάͷείΞूܭ ΞϓϦέʔγϣϯΛ5%% Ͱ։ൃ͢Δαϯϓϧ 4 5 1 5 14 4 29 6 6 133 2 49 5 60 1 61 0 77 7 97 6 117

Slide 18

Slide 18 text

w ౤ٿॱʹ౗ͨ͠ϐϯ਺Λه࿥͢Δ w ࢦఆͨ͠ϑϨʔϜʹ͓͚ΔείΞΛܭࢉ Ͱ͖Δ w ࠷৽ͷείΞΛܭࢉͰ͖Δʢશͯͷ౤ٿ ͕׬͍ྃͯ͠Ε͹ɺ࠷ऴతͳείΞʣ 4 5 1 5 14 4 29 6 6 133 2 49 5 60 1 61 0 77 7 97 6 117 ৼΔ෣͍ʢΞϓϦέʔγϣϯ࢓༷ʣ

Slide 19

Slide 19 text

ࣄલઃܭʢϥϑεέονʣ

Slide 20

Slide 20 text

Ϙϒ͓͡͞Μͱಉ྅͕ ϖΞϓϩͰḷͬͨಓے

Slide 21

Slide 21 text

w ςετ͢΂͖5ISPXͷৼ෣͍͕ݟ͍ͩͤͣɺ 'SBNFͷςετ͔Βॻ͖࢝Ίͨɻ w ࠷΋୯७ͳςετέʔε͔Β࢝Ίɺ࠷΋୯७ͳ ࣮૷ͰςετΛ௨͢ɻ ࠷ॳͷςετέʔε public class Frame { public int getScore() { return 0 ; } } class FrameSpec extends Specification { def "ະ౤ٿͷͱ͖ͷείΞ͸0Ͱ͋Δ"() { given : def f = new Frame( ) when : def score = f.getScore( ) then : score == 0 } } ˞ॻ੶Ͱ͸+6OJUΛ࢖͍ͬͯΔ ͕ɺຊࢿྉͰ͸4QPDLΛ࢖༻

Slide 22

Slide 22 text

w ࣍ʹ୯७ͳςετέʔεΛ௥Ճ͠ɺςετ͕௨ ΔΑ͏ʹίʔυΛमਖ਼͢Δ ࣍ͷςετέʔε class FrameSpec extends Specification { .. def "1ճ౤ٿͨ͠ͱ͖ʹείΞ͕ਖ਼͍͠"() { given : def f = new Frame( ) when : f.add(5 ) then : f.getScore() == 5 } } public class Frame { private int itsScore = 0 ; public int getScore() { return itsScore ; } public void add(int pins) { itsScore += pins ; } }

Slide 23

Slide 23 text

ग़ͩ͠͸ॱௐʂ

Slide 24

Slide 24 text

w εϖΞ΍ετϥΠΫΛग़ͨ͠৔߹ɺϑϨʔϜͷ είΞܭࢉʹ͸ޙଓͷϑϨʔϜͷ৘ใ͕ඞཁɻ w (BNFΦϒδΣΫτ͸'SBNFΛϦϯΫϦετͰ ؅ཧ͢΂͖ʁ w 'SBNFͷ࡞ۀΛதஅͯ͠ɺ(BNFͷ࡞ۀʹ੾Γ ସ͑Δɻ ෳ਺ճ౤ٿͨ͠৔߹ʁ

Slide 25

Slide 25 text

(BNFͷ࣮૷Λগͣͭ͠ਐΊΔ class GameSpec extends Specification { when : g.add(5 ) g.add(4 ) g.add(7 ) g.add(2 ) then : g.score() == 1 8 g.scoreForFrame(1) == 9 g.scoreForFrame(2) == 1 8 } public class Game { private int itsScore = 0 ; private int[] itsThrows = new int[21] ; private int itsCurrentThrow = 0 ; public int score() { return itsScore ; } public void add(int pins) { itsThrows[itsCurrentThrow++] = pins ; itsScore += pins ; } public int scoreForFrame(int frame) { int score = 0 ; for (int ball = 0; frame > 0 && (ball < itsCurrentThrow) ; ball += 2, frame--) { score += itsThrows[ball] + itsThrows[ball + 1] ; } return score ; } }

Slide 26

Slide 26 text

lίʔυ͕ͦΕΛඞཁͩͱ ओு͠ͳ͍ݶΓɺϦϯΫϦετ͸ ༻ҙͨ͘͠ͳ͍Μͩz

Slide 27

Slide 27 text

w ୯ͳΔ഑ྻͰ༻Λ଍͢ͳΒɺͦΕͰ0, w ઃܭ্ͷ൑அΛ஗ΒͤΔ γϯϓϧͳઃܭΛબ୒͠Α͏ public class Game { private int itsScore = 0 ; private int[] itsThrows = new int[21] ; private int itsCurrentThrow = 0 ;

Slide 28

Slide 28 text

w ςετ͕͋Δ͔Β҆৺ϦϑΝΫλϦϯά ৗʹϦϑΝΫλϦϯά͠Α͏ public int scoreForFrame(int frame) { int score = 0 ; for (int ball = 0; frame > 0 && (ball < itsCurrentThrow) ; ball += 2, frame--) { score += itsThrows[ball] + itsThrows[ball + 1] ; } return score ; } public int scoreForFrame(int theFrame) { int ball = 0 ; int score = 0 ; for (int currentFrame = 0; currentFrame < theFrame ; currentFrame++) { int firstThrow = itsThrows[ball++] ; int secondThrow = itsThrows[ball++] ; score += firstThrow + secondThrow ; } return score ; }

Slide 29

Slide 29 text

w εϖΞΛग़ͨ͠ͱ͖ w ετϥΠΫΛग़ͨ͠ͱ͖ w ύʔϑΣΫτήʔϜ w ϦΞϧͳαϯϓϧ w ΤοδέʔεʢύʔϑΣΫτήʔϜະ਱ͳͲʣ ઴ਐతʹ(BNFͷ࣮૷ΛਐΊΔ 4 5 1 5 14 4 29 6 6 133 2 49 5 60 1 61 0 77 7 97 6 117

Slide 30

Slide 30 text

w શͯͷςετέʔε͕௨ΓɺΞϓϦέʔγϣϯ ͷৼΔ෣͍͕׬੒͕ͨ͠ɺϦϑΝΫλϦϯά͸ ଓ͍͍ͯ͘ɻ w 4DPSFSΦϒδΣΫτͷඞཁੑΛ೏Θͤͳ͕ Βɺͪ͝Ό͍ͭͨίʔυΛ͖Ε͍ʹ͍ͯ͘͠ɻ ͞ΒͳΔϦϑΝΫλϦϯά

Slide 31

Slide 31 text

if (strike()) { score += 10 + nextTwoBallsForStrike() ; ball++ ; } else if (spare()) { score += 10 + nextBallForSpare() ; ball+=2 ; } else { score += handleSecondThrow() ; } l͜ͷTDPSF'PS'SBNFؔ਺Λݟͯ͝ΒΜΑʂ ͜Εͦ͜Ϙ΢ϦϯάͷϧʔϧΛ͖ΘΊͯ؆ܿ ʹهड़ͨ࢟ͩ͠Αʂz

Slide 32

Slide 32 text

׬੒ܗ l͜ΕͰɺ(BNF͸ϑϨʔϜͷ؅ཧ͚ͩΛͯ͠ɺ 4DPSFS͸είΞͷܭࢉ͚ͩΛ୲౰͢Δਤࣜʹͳͬ ͨͶɻ͜Εͧɺ୯Ұ੹೚ͷݪଇʢ431ʣͩʂz

Slide 33

Slide 33 text

ͲͪΒͷઃܭ͕͙͢Ε͍ͯΔ͔ʁ if (strike()) { score += 10 + nextTwoBallsForStrike() ; ball++ ; } else if (spare()) { score += 10 + nextBallForSpare() ; ball+=2 ; } else { score += handleSecondThrow() ; } ࣄલͷઃܭ 5%%ʹΑΔઃܭ

Slide 34

Slide 34 text

ద੾ͳϞσϦϯά ࣮ੈքͷ֓೦ߏ଄Λ஧࣮ʹղܾྖ Ҭʹ࠶ݱ͢Δ͜ͱ͕͍ͭ΋ਖ਼͍͠ ͱ͸ݶΒͳ͍

Slide 35

Slide 35 text

ٙ໰ 4DPSFS͸ςετ͠ͳ͍ͷʁ

Slide 36

Slide 36 text

ϢχοτςετͷʮϢχοτʯ lϢχοτͱ͸;Δ·͍ͷ୯ Ґɺͭ·Γಠཱͨ͠ݕূՄ ೳͳ;Δ·͍ͷ͜ͱͩz

Slide 37

Slide 37 text

ৼ෣͍ͷू߹ମΛςετ͢Δ l͋ΒΏΔ؍࡯Մೳͳ;Δ· ͍͕ɺͦΕʹඥͮ͘ςετ Λ࣋ͭ΂͖Ͱ͋Δ͜ͱΛҙ ຯ͢Δɻz

Slide 38

Slide 38 text

ৼΔ෣͍ͷू߹ମͷϑΝαʔυͰ ͋Δ(BNFΛςετ͢Ε͹0,

Slide 39

Slide 39 text

࣮ࡍɺΧόϨοδ΋໰୊ͳ͔ͬͨ

Slide 40

Slide 40 text

w 5%%ͷαΠΫϧͰ(BNFͷৼ෣͍Λશ࣮ͯ૷͠ ͨޙɺϦϑΝΫλϦϯάͰ4DPSFSΛநग़ɻ w (BNF4QFDͰৼ෣͍Λݻఆ͢Δ͜ͱͰɺϦ ϑΝΫλϦϯάΛߦ͏͜ͱ͕Ͱ͖ͨɻ Ϙϒ͓͡͞Μୡ͕ḷͬͨ࿏

Slide 41

Slide 41 text

w ॻ੶ͷதͰϘϒ͓͡͞Μୡ͕ḷͬͨ࿏ΛɺԾʹ ηΠόʔϧʔτͱݺͿʢ࣭໰͸ड͚෇͚ͳ͍ʣ 5%%ͷϧʔτ͸Ұͭͱ͸ݶΒͳ͍

Slide 42

Slide 42 text

w 4DPSFSͷඞཁੑ͕ݟ͑ͨஈ֊Ͱ4DPSFS4QFD Λ࡞੒͠ɺ5%%Ͱ4DPSFSΛઌʹ࢓্͛Δɻ w ΠϯαΠυΞ΢τʢϘτϜΞοϓʣɻ ႒ϧʔτ

Slide 43

Slide 43 text

w 4DPSFSͷඞཁੑ͕ݟ͑ͨΒɺ4DPSFSͷϞοΫ Λ࢖ͬͯ(BNFͷ࣮૷ΛਐΊ͍ͯ͘ɻ w Ξ΢ταΠυΠϯʢτοϓμ΢ϯʣɻ ࡩϧʔτ

Slide 44

Slide 44 text

ϞοΫΛ࢖ͬͨςετ private Game g private Scorer s def setup() { s = Mock() // ScorerͷϞοΫ g = new Game(s ) } def "2ճ౤ٿͨ͠ͱ͖ͷείΞ͕ਖ਼͍͠"() { when : g.add(5 ) g.add(4 ) def score = g.score( ) then : score == 9 1 * s.addThrow(5 ) 1 * s.addThrow(4 ) 1 * s.scoreForFrame(2) >> 9 } ؒ઀ೖྗ ؒ઀ग़ྗ ʨ ૬ޓ࡞༻ͷݕূ

Slide 45

Slide 45 text

w (BNFΛपΓ͔Βಠཱͯ͠ςετͰ͖Δɻ w 4DPSFSͷ࣮૷͕ͳ͍࣌఺Ͱɺઌʹ(BNFΛςε τͰ͖Δɻ w ϞοΫΛܦ༝͠ɺؒ઀ೖྗ΍ؒ઀ग़ྗΛ࢖ͬͯ (BNFͷৼ෣͍΍ঢ়ଶΛνΣοΫͰ͖Δɻ w (BNFͱ4DPSFSͷ૬ޓ࡞༻ΛδϟετΠϯλΠ ϜͰઃܭͰ͖Δɻ ϞοΫΞϓϩʔνͷϝϦοτ

Slide 46

Slide 46 text

w ࣮૷ͷৄࡉʹґଘ͢ΔͨΊɺ੬͍ςετͱͳΓ ΍͍͢ɻ w ॻ͘ͷʹख͕͔͔ؒΔɻ w (BNF4DPSFSʢৼ෣͍ͷू߹ମʣʹର͢Δ ςετ΋ผ్ॻ͘ඞཁ͕͋Δɻ ϞοΫΞϓϩʔνͷσϝϦοτ

Slide 47

Slide 47 text

w ϞοΫΛ࢖ͬͯॻ͍ͨ(BNF4QFD͸͋͘·Ͱ ઃܭΛਐΊΔҰ࣌తͳಓ۩ͱߟ͑ɺࣺͯͯΑ͠ ʢৼ෣͍ͷू߹ମʹର͢Δςετ͕࢒Ε͹Մʣ ઃܭͷͨΊ͚ͩͷςετίʔυ

Slide 48

Slide 48 text

·ͱΊ

Slide 49

Slide 49 text

5%%ͷຊ࣭͸ɺ ϨουάϦʔϯϦϑΝΫλϦϯά ͷαΠΫϧͰߦ͏ δϟετΠϯλΠϜͷઃܭͰ͋Δ

Slide 50

Slide 50 text

Ϣχοτςετͷ୯Ґ͸ ৼ෣͍ͷू߹ମͱ͠Α͏

Slide 51

Slide 51 text

ʰΞδϟΠϧιϑτ΢ΣΞ։ൃͷ ԞٛʱষΛࣸܦͯ͠Έ·͠ΐ͏

Slide 52

Slide 52 text

ʰΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛୈ̎൛ʱ ϩόʔτɾ$ɾϚʔνϯஶ4#ΫϦΤΠςΟϒץ ʰϨΨγʔίʔυ͔Βͷ୤٫ʱ %BWJE4DPUU#FSOTUFJOஶΦϥΠϦʔɾδϟύϯץ ࢀߟจݙ