Bdd: Tdd and beyond the infinite

6,467 views
5,885 views

Published on

Published in: Technology, Business
0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,467
On SlideShare
0
From Embeds
0
Number of Embeds
391
Actions
Shares
0
Downloads
166
Comments
0
Likes
20
Embeds 0
No embeds

No notes for slide
  • si usa un semplice template per testare le classi. ogni classe ha un suo test case e aiuta a rimanere focalizzati
  • la classe ‘dovrebbe’ non ‘deve’ fare qualcosa in modo da indicare un comportamento possibile: se c’è un errore potrebbe essere un bug oppure potrebbe essere che quel comportamento non è più di quella classe
  • conversazione. rspec per sviluppatori. vecchio sogno che gli stakeholders possano scrivere direttamente le specifiche. si può avere un linguaggio di più alto livello
  • conversazione
  • Bdd: Tdd and beyond the infinite

    1. BEHAVIOUR DRIVEN DEVELOPMENT: TDD AND BEYOND THE INFINITE
    2. Duct Tape Religion War
    3. At the beginning…
    4.  
    5.     end;     // CellText := str;   except     // Gabriele non t'ha beccato, Gigi neppure, a chi toccherà?   end; end;
    6. while ((! found ) && ( pos < ( fileContent . Length - 6))) { byteData = new byte[6]; Array . Copy ( fileContent , pos , byteData , 0, 6); pos = pos + 6; str_byteData = enc . GetString ( byteData ); if ( str_byteData . Contains ( &quot;s&quot; )) { posE_byteData = str_byteData . IndexOf ( &quot;s&quot; ); pos = pos + ( posE_byteData - 6); Array . Copy ( fileContent , pos , byteData , 0, 6); pos = pos + 6; if ( byteData [0] == 0x73) // 's' { if ( byteData [1] == 0x74) // 't' { if ( byteData [2] == 0x72) // 'r' { if ( byteData [3] == 0x65) // 'e' { if ( byteData [4] == 0x61) // 'a' { if ( byteData [5] == 0x6D) // 'm' { found = true; break; } else { if ( byteData [5] == 0x73) { pos = pos - 1; } } }
    7. function TfrmPreviewTrascr.DBToLinear(DB: Double): Double; begin   //Result := Power(10, DB/20)*1;   Result := Power(10, DB / 100) * 1; { TODO : trovare la relazione corretta }   //LisyLabel4.Caption := Format('%.2f:%.2f', [DB, Result] ); end;
    8.  
    9.  
    10. Kent Beck gave Tdd to programmers!
    11. The Three Laws of TDD
    12. The Three Laws of TDD 1 - You are not allowed to write any production code unless it is to make a failing unit test pass.
    13. The Three Laws of TDD 1 - You are not allowed to write any production code unless it is to make a failing unit test pass. 2 - You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.
    14. The Three Laws of TDD 1 - You are not allowed to write any production code unless it is to make a failing unit test pass. 2 - You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 3 - You are not allowed to write any more production code than is sufficient to pass the one failing unit test.
    15. TDD Cycle
    16. TDD Cycle
    17. TDD Cycle
    18. TDD Cycle
    19. TDD Cycle
    20. TDD Cycle
    21. TDD Cycle
    22. TDD Cycle
    23. TDD Cycle
    24. TDD Cycle
    25. TDD Cycle
    26. Is that the end of our problems?
    27. I’m a programmer, not a tester!
    28. My code it’s difficult to test!
    29. It’s a trivial, doesn’t need a test!
    30. I’ve no time to make automatic tests!
    31. It’s about specifications
    32. Sapir-Whorf hypotesis “ there is a systematic relationship between the grammatical categories of the language a person speaks and how that person both understands the world and behaves in it.”
    33. The Challenge
    34. for ( var i = 1 ; i <= 100 ; i++){   var output = i + &quot;: &quot; ;   if (i % 3 == 0 ) output += &quot;fizz&quot; ;   if (i % 5 == 0 ) output += &quot;buzz&quot; ;   console.log(output); } 48 sec
    35. for ( var i = 1 ; i <= 100 ; i++){   var output = i + &quot;: &quot; ;   if (i % 3 == 0 ) output += &quot;fizz&quot; ;   if (i % 5 == 0 ) output += &quot;buzz&quot; ;   console.log(output); } But it’s wrong!
    36. puts ( 1 . .100 ). map { | n | '1' * n + &quot;:#{n} &quot; }. join . gsub ( /^(1{5})*:/,'Buzz').gsub(/^(1{3})*:/,'Fizz').gsub(/.*:|(z)d+/ , '1' ) WTF?!?!!
    37. package biz . scalzo . tdd ; import junit . framework . Assert ; import org . junit . Test ; import biz . scalzo . tdd . Fizzbuzzer ; public class FizzbuzzTest { @Test public void testForOne (){ Assert . assertEquals ( &quot;1&quot; , new Fizzbuzzer (). count ( 1 )); } } FizzbuzzTest.java
    38. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return null ; } } Fizzbuzzer.java
    39. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return &quot;1&quot; ; } } Fizzbuzzer.java
    40. @Test public void testForTwo (){ Assert . assertEquals ( &quot;2&quot; , new Fizzbuzzer (). count ( 2 )); } FizzbuzzTest.java
    41. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return Integer . toString ( i ); } } Fizzbuzzer.java
    42. @Test public void testForThree (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 3 )); } FizzbuzzTest.java
    43. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { if ( i == 3 ) return &quot;Fizz&quot; ; return Integer . toString ( i ); } } Fizzbuzzer.java
    44. @Test public void testForFour (){ Assert . assertEquals ( &quot;4&quot; , new Fizzbuzzer (). count ( 4 )); } FizzbuzzTest.java
    45. @Test public void testForFive (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 5 )); } FizzbuzzTest.java
    46. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { if ( i == 3 ) return &quot;Fizz&quot; ; if ( i == 5 ) return &quot;Buzz&quot; ; return Integer . toString ( i ); } } Fizzbuzzer.java
    47. @Test public void testForSix (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 6 )); } FizzbuzzTest.java
    48. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { if ( i % 3 == 0 ) return &quot;Fizz&quot; ; if ( i == 5 ) return &quot;Buzz&quot; ; return Integer . toString ( i ); } } Fizzbuzzer.java
    49. @Test public void testForSeven (){ Assert . assertEquals ( “7&quot; , new Fizzbuzzer (). count ( 7 )); } FizzbuzzTest.java
    50. @Test public void testForEight (){ Assert . assertEquals ( “8&quot; , new Fizzbuzzer (). count ( 8 )); } FizzbuzzTest.java
    51. @Test public void testForNine (){ Assert . assertEquals ( “Fizz&quot; , new Fizzbuzzer (). count ( 9 )); } FizzbuzzTest.java
    52. @Test public void testForTen (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 10 )); } FizzbuzzTest.java
    53. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { if ( i % 3 == 0 ) return &quot;Fizz&quot; ; if ( i % 5 == 0 ) return &quot;Buzz&quot; ; return Integer . toString ( i ); } } Fizzbuzzer.java
    54. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int number ) { if ( isMultipleOf ( number , 3 )) return &quot;Fizz&quot; ; if ( isMultipleOf ( number , 5 )) return &quot;Buzz&quot; ; return Integer . toString ( number ); } private boolean isMultipleOf ( int number , int multiple ) { return number % multiple == 0 ; } } Fizzbuzzer.java
    55. @Test public void testForFifteen (){ Assert . assertEquals ( &quot;FizzBuzz&quot; , new Fizzbuzzer (). count ( 15 )); } FizzbuzzTest.java
    56. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int number ) { if ( isMultipleOf ( number , 3 ) && isMultipleOf ( number , 5 )) return &quot;FizzBuzz&quot; ; if ( isMultipleOf ( number , 3 )) return &quot;Fizz&quot; ; if ( isMultipleOf ( number , 5 )) return &quot;Buzz&quot; ; return Integer . toString ( number ); } private boolean isMultipleOf ( int number , int multiple ) { return number % multiple == 0 ; } } Fizzbuzzer.java
    57. package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int number ) { String fizzOrBuzz = fizz ( number ) + buzz ( number ); return fizzOrBuzz . equals ( &quot;&quot; ) ? Integer . toString ( number ) : fizzOrBuzz ; } private boolean isMultipleOf ( int number , int multiple ) { return number % multiple == 0 ; } private String fizz ( int number ) { return isMultipleOf ( number , 3 ) ? &quot;Fizz&quot; : &quot;&quot; ; } private String buzz ( int number ) { return isMultipleOf ( number , 5 ) ? &quot;Buzz&quot; : &quot;&quot; ; } } Fizzbuzzer.java
    58. Result
    59. package biz . scalzo . tdd ; import junit . framework . Assert ; import org . junit . Test ; import biz . scalzo . tdd . Fizzbuzzer ; public class FizzbuzzTest { @Test public void testForOne (){ Assert . assertEquals ( &quot;1&quot; , new Fizzbuzzer (). count ( 1 )); } @Test public void testForTwo (){ Assert . assertEquals ( &quot;2&quot; , new Fizzbuzzer (). count ( 2 )); } @Test public void testForThree (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 3 )); } @Test public void testForFive (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 5 )); } @Test public void testForSix (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 6 )); } FizzbuzzTest.java
    60. @Test public void testForSeven (){ Assert . assertEquals ( &quot;7&quot; , new Fizzbuzzer (). count ( 7 )); } @Test public void testForEight (){ Assert . assertEquals ( &quot;8&quot; , new Fizzbuzzer (). count ( 8 )); } @Test public void testForNine (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 9 )); } @Test public void testForTen (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 10 )); } @Test public void testForFifteen (){ Assert . assertEquals ( &quot;FizzBuzz&quot; , new Fizzbuzzer (). count ( 15 )); } } FizzbuzzTest.java
    61.  
    62. Bdd Way
    63. Bdd Way Test method names should be sentences
    64. package biz . scalzo . bdd ; import java . util . ArrayList ; import java . util . List ; import org . junit . Test ; import static org . hamcrest . MatcherAssert . assertThat ; import static org . hamcrest . Matchers .*; public class AFizzbuzzer { @Test public void shouldYellOneForOne () { assertThat ( new Fizzbuzzer (). count ( 1 ), is ( equalTo ( &quot;1&quot; ))); } } AFizzbuzzer.java
    65. package biz . scalzo . bdd ; import java . util . ArrayList ; import java . util . List ; import org . junit . Test ; import static org . hamcrest . MatcherAssert . assertThat ; import static org . hamcrest . Matchers .*; public class AFizzbuzzer { @Test public void shouldYellOneForOne () { assertThat ( new Fizzbuzzer (). count ( 1 ), is ( equalTo ( &quot;1&quot; ))); } } AFizzbuzzer.java
    66. Bdd Way the class should do something
    67. package biz . scalzo . bdd ; import java . util . ArrayList ; import java . util . List ; import org . junit . Test ; import static org . hamcrest . MatcherAssert . assertThat ; import static org . hamcrest . Matchers .*; public class AFizzbuzzer { @Test public void shouldYellOneForOne () { assertThat ( new Fizzbuzzer (). count ( 1 ), is ( equalTo ( &quot;1&quot; ))); } } AFizzbuzzer.java
    68. package biz . scalzo . bdd ; import java . util . ArrayList ; import java . util . List ; import org . junit . Test ; import static org . hamcrest . MatcherAssert . assertThat ; import static org . hamcrest . Matchers .*; public class AFizzbuzzer { @Test public void shouldYellOneForOne () { assertThat ( new Fizzbuzzer (). count ( 1 ), is ( equalTo ( &quot;1&quot; ))); } } AFizzbuzzer.java
    69. @Test public void shouldYellTwoForTwo () { assertThat ( new Fizzbuzzer (). count ( 2 ), is ( equalTo ( &quot;2&quot; ))); } AFizzbuzzer.java
    70. @Test public void shouldYellFizzForMultipleOfThree () { int [] fizzers = { 3 , 6 , 9 , 12 , 18 }; for ( int fizzer : fizzers ) { assertThat ( new Fizzbuzzer (). count ( fizzer ), is ( equalTo ( &quot;Fizz&quot; ))); } } AFizzbuzzer.java
    71. @Test public void shouldYellBuzzForMultipleOfFive () { int [] buzzers = { 5 , 10 }; for ( int buzzer : buzzers ) { assertThat ( new Fizzbuzzer (). count ( buzzer ), is ( equalTo ( &quot;Buzz&quot; ))); } } AFizzbuzzer.java
    72. @Test public void shouldYellFizzBuzzForMultipleOfThreeAndFive () { int [] fizzBuzzers = { 15 , 30 , 45 , 60 }; for ( int fizzBuzzer : fizzBuzzers ) { assertThat ( new Fizzbuzzer (). count ( fizzBuzzer ), is ( equalTo ( &quot;FizzBuzz&quot; ))); } } AFizzbuzzer.java
    73. @Test public void shouldYellTheNumberForNotMultipleOfThreeOrFive () { for ( int plainNumber : plainNumbers ()) { assertThat ( new Fizzbuzzer (). count ( plainNumber ), is ( equalTo ( Integer . toString ( plainNumber )))); } } private List < Integer > plainNumbers () { List < Integer > numbers = new ArrayList < Integer >(); for ( int i = 1 ; i <= 100 ; i ++) numbers . add ( i ); for ( int i = 1 ; i < 35 ; i ++) numbers . remove ( new Integer ( i * 3 )); for ( int i = 1 ; i < 25 ; i ++) numbers . remove ( new Integer ( i * 5 )); return numbers ; } AFizzbuzzer.java
    74.  
    75. Fathers of Bdd
    76. The Ruby Way to Bdd
    77. $ :. unshift File . join ( File . dirname ( __FILE__ ), *% w [.. lib ]) require &quot;fizzbuzzer&quot; describe &quot;Fizzbuzzer&quot; do it &quot;should yell one for one&quot; do Fizzbuzzer . new . count ( 1 ). should == '1' end end fizzbuzzer_spec.rb
    78. it &quot;should yell two for two&quot; do Fizzbuzzer . new . count ( 2 ). should == '2' end fizzbuzzer_spec.rb
    79. it &quot;should yell Fizz for three&quot; do Fizzbuzzer . new . count ( 3 ). should == 'Fizz' end fizzbuzzer_spec.rb
    80. it &quot;should yell Fizz for multiple of three&quot; do [ 3 , 6 , 9 , 12 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'Fizz' end end fizzbuzzer_spec.rb
    81. it &quot;should yell Buzz for multiple of five&quot; do [ 5 , 10 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'Buzz' end end fizzbuzzer_spec.rb
    82. it &quot;should yell FizzBuzz for multiple of three and five&quot; do [ 15 , 30 , 45 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'FizzBuzz' end end fizzbuzzer_spec.rb
    83. it &quot;should yell the number itself for non multiple of three or five&quot; do ( 1 . .100 ). select { | n | n % 3 != 0 && n % 5 != 0 }. each do | number | Fizzbuzzer . new . count ( number ). should == number . to_s end end fizzbuzzer_spec.rb
    84. Result
    85. class Fixnum def fizzbuzzed ? &quot;FizzBuzz&quot; if self % 3 == 0 && self % 5 == 0 end def fizzed ? &quot;Fizz&quot; if self % 3 == 0 end def buzzed ? &quot;Buzz&quot; if self % 5 == 0 end end class Fizzbuzzer def count ( number ) number . fizzbuzzed ? || number . fizzed ? || number . buzzed ? || number . to_s end end fizzbuzzer.rb
    86. describe &quot;Fizzbuzzer&quot; do it &quot;should yell one for one&quot; do Fizzbuzzer . new . count ( 1 ). should == '1' end it &quot;should yell two for two&quot; do Fizzbuzzer . new . count ( 2 ). should == '2' end it &quot;should yell Fizz for multiple of three&quot; do [ 3 , 6 , 9 , 12 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'Fizz' end end it &quot;should yell Buzz for multiple of five&quot; do [ 5 , 10 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'Buzz' end end it &quot;should yell FizzBuzz for multiple of three and five&quot; do [ 15 , 30 , 45 ]. each do | number | Fizzbuzzer . new . count ( number ). should == 'FizzBuzz' end end it &quot;should yell the number itself for non multiple of three or five&quot; do ( 1 . .100 ). select { | n | n % 3 != 0 && n % 5 != 0 }. each do | number | Fizzbuzzer . new . count ( number ). should == number . to_s end end end fizzbuzzer_spec.rb
    87. output
    88. output
    89. Stories
    90. As a [role] I want [feature] So that [benefit] Story
    91. Scenario 1: Title Given [context] And [some more context]... When [event] Then [outcome] And [another outcome] Scenario Acceptance Criteria
    92. Cucumber
    93. Cucumber fizzbuzzer.feature fizzbuzzer_steps.rb
    94. Feature : perfect fizzbuzzing As a inattentive counter I want an automatic Fizzbuzzer So that I can win Fizzbuzz Championsip fizzbuzzer.feature
    95. Scenario : manage fizz numbers Given a Fizzbuzzer When I ask for a multiple of 3 Then Fizzbuzzer yells 'Fizz' fizzbuzzer.feature
    96. require &quot;fizzbuzzer&quot; Given &quot;a Fizzbuzzer&quot; do @fizzbuzzer = Fizzbuzzer . new end When &quot;I ask for a multiple of $m&quot; do | m | @result = [ 1 , 2 ]. map { | base | @fizzbuzzer . count ( base * eval ( m ). to_i ) } end Then &quot;Fizzbuzzer yells '$yell'&quot; do | yell | @result . each do | result | result . should == yell end end fizzbuzzer_steps.rb
    97. Scenario : manage buzz numbers Given a Fizzbuzzer When I ask for a multiple of 5 Then Fizzbuzzer yells 'Buzz' Scenario : manage fizzbuzz numbers Given a Fizzbuzzer When I ask for a multiple of 3 * 5 Then Fizzbuzzer yells 'FizzBuzz' fizzbuzzer.feature
    98. Scenario : manage plain numbers Given a Fizzbuzzer When I ask for a plain number Then Fizzbuzzer yells the number itself fizzbuzzer.feature
    99. When &quot;I ask for a plain number&quot; do @expected = ( 1 . .100 ). select { | n | n % 3 != 0 && n % 5 != 0 } @result = @expected . each do | number | @fizzbuzzer . count ( number ). to_i end end Then &quot;Fizzbuzzer yells the number itself&quot; do @result . should == @expected end fizzbuzzer_steps.rb
    100. Scenario Outline : manage plain numbers Given a Fizzbuzzer When I ask for '<number>' Then Fizzbuzzer yells '<result>' Examples : | number | result | | 1 | 1 | | 2 | 2 | | 3 | Fizz | | 4 | 4 | | 5 | Buzz | | 6 | Fizz | fizzbuzzer.feature
    101. When &quot;I ask for '$m'&quot; do | number | @result = @fizzbuzzer . count ( number . to_i ) end Then &quot;Fizzbuzzer yells '$yell'&quot; do | yell | @result . each do | result | result . should == yell end end fizzbuzzer_steps.rb
    102. neat, isn’t it?
    103. Back to Java
    104. Where it all started
    105. jbehave manage_fizzbuzzer ManageFizzbuzzer.java ManageFizzbuzzerSteps.java
    106. Feature : perfect fizzbuzzing As a inattentive counter I want an automatic Fizzbuzzer So that I can win Fizzbuzz Championsip Scenario : manage fizz numbers Given a Fizzbuzzer When I ask for a multiple of 3 Then Fizzbuzzer yells 'Fizz' Scenario : manage buzz numbers Given a Fizzbuzzer When I ask for a multiple of 5 Then Fizzbuzzer yells 'Buzz' Scenario : manage fizzbuzz numbers Given a Fizzbuzzer When I ask for a multiple of 15 Then Fizzbuzzer yells 'FizzBuzz' manage_fizzbuzzer
    107. Scenario : manage plain numbers Given a Fizzbuzzer When I ask for a plain number Then Fizzbuzzer yells the number itself Scenario : manage plain numbers Given a Fizzbuzzer When I ask for '[number]' Then Fizzbuzzer yells '[yell]' Examples : | number | yell | | 1 | 1 | | 2 | 2 | | 3 | Fizz | | 4 | 4 | | 5 | Buzz | | 6 | Fizz | manage_fizzbuzzer
    108. package biz . scalzo . jbehave ; import org . jbehave . scenario . Scenario ; public class ManageFizzbuzzer extends Scenario { public ManageFizzbuzzer () { super ( new ManageFizzbuzzerSteps ()); } } ManageFizzbuzzer.java
    109. import biz . scalzo . bdd . Fizzbuzzer ; public class ManageFizzbuzzerSteps extends Steps { private Fizzbuzzer fizzbuzzer ; private List < String > results ; private List < String > expected ; private String result ; @BeforeScenario public void setUp () { expected = new ArrayList < String >(); results = new ArrayList < String >(); } ManageFizzbuzzerSteps.java
    110. @ Given ( &quot;a Fizzbuzzer&quot; ) public void startFizzbuzzer () { fizzbuzzer = new Fizzbuzzer (); } @ When ( &quot;I ask for a multiple of $divisor&quot; ) public void askForMultipleOf ( int divisor ) { for ( int number = 1 ; number < 3 ; ++ number ) results . add ( fizzbuzzer . count ( number * divisor )); } @ Then ( &quot;Fizzbuzzer yells '$yell'&quot; ) public void checkYell ( String yell ) { for ( String result : results ) { assertThat ( result , is ( equalTo ( yell ))); } } ManageFizzbuzzerSteps.java
    111. @ When ( &quot;I ask for a plain number&quot; ) public void askForPlainNumbers () { for ( int i = 1 ; i <= 100 ; i ++) if ( i % 3 != 0 && i % 5 != 0 ) expected . add ( Integer . toString ( i )); for ( String number : expected ) results . add ( fizzbuzzer . count ( Integer . parseInt ( number ))); } @ Then ( &quot;Fizzbuzzer yells the number itself&quot; ) public void yellsNumberItself () { for ( int i = 0 ; i < expected . size (); i ++) { assertThat ( results . get ( i ), is ( equalTo ( expected . get ( i )))); } } ManageFizzbuzzerSteps.java
    112. @ When ( &quot;I ask for '[number]'&quot; ) public void askFor ( @ Named ( &quot;number&quot; ) int number ) { result = fizzbuzzer . count ( number ); } @ Then ( &quot;Fizzbuzzer yells '[yell]'&quot; ) public void checkResult ( @ Named ( &quot;yell&quot; ) String yell ) { assertThat ( result , is ( equalTo ( yell ))); } ManageFizzbuzzerSteps.java
    113. Other Frameworks
    114. <ul><li>ASSpec ActionScript 3 </li></ul><ul><li>CppSpec C++ </li></ul><ul><li>Spec- cpp C++ </li></ul><ul><li>CSpec C </li></ul><ul><li>cfSpec ColdFusion </li></ul><ul><li>dSpec Delphi </li></ul><ul><li>easyb Groovy </li></ul><ul><li>EasySpec Groovy </li></ul><ul><li>tspec Groovy </li></ul><ul><li>GSpec Groovy </li></ul><ul><li>Concordion Java </li></ul><ul><li>GivWenZen Java </li></ul><ul><li>Instinct Java </li></ul><ul><li>JavaStubs Java </li></ul><ul><li>JBehave Java </li></ul><ul><li>JDave Java </li></ul><ul><li>beanSpec Java </li></ul><ul><li>JFXtras Test JavaFX </li></ul><ul><li>JSpec JavaScript </li></ul><ul><li>JSSpec JavaScript </li></ul><ul><li>Screw- unit JavaScript </li></ul>Other Frameworks
    115. <ul><li>NBehave .Net </li></ul><ul><li>NSpec .Net </li></ul><ul><li>NSpecify .Net </li></ul><ul><li>SpecUnit .Net </li></ul><ul><li>NUnit .Net </li></ul><ul><li>Specter .Net </li></ul><ul><li>StoryQ .Net </li></ul><ul><li>ObjectiveMatchy iPhone </li></ul><ul><li>PHPSpec PHP </li></ul><ul><li>Pyccuracy Python </li></ul><ul><li>Pyhistorian Python </li></ul><ul><li>PyCukes Python </li></ul><ul><li>Robot Framework Python </li></ul><ul><li>ScalaTest Scala </li></ul><ul><li>specs Scala </li></ul>Other Frameworks
    116. Conclusions?
    117. Bdd is about specifications
    118. Homework
    119. http://github.com/coreyhaines/ practice_game_of_life
    120. Feature: Evolving a living cell    In order to create a functioning rules engine    As a programmer of Conway's Game of Life    I can evolve a single living cell      Scenario: Living cell with 0 neighbors dies      Given the following setup        | . | . | . |        | . | x | . |        | . | . | . |      When I evolve the board      Then the center cell should be dead      Scenario: Living cell with 1 neighbor dies      Given the following setup        | . | x | . |        | . | x | . |        | . | . | . |      When I evolve the board      Then the center cell should be dead      Scenario: Living cell with 2 neighbors lives      Given the following setup        | . | x | . |        | . | x | x |        | . | . | . |      When I evolve the board      Then the center cell should be alive      Scenario: Living cell with 3 neighbors lives      Given the following setup        | x | x | x |        | . | x | . |        | . | . | . |      When I evolve the board      Then the center cell should be alive
    121. Start Bdd now!
    122.  
    123. ? ? ? ? ? ?

    ×