• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Bdd: Tdd and beyond the infinite
 

Bdd: Tdd and beyond the infinite

on

  • 4,390 views

 

Statistics

Views

Total Views
4,390
Views on SlideShare
4,032
Embed Views
358

Actions

Likes
15
Downloads
145
Comments
0

8 Embeds 358

http://giordano.scalzo.biz 332
http://www.slideshare.net 11
http://www.linkedin.com 7
http://192.168.6.52 3
http://www.scalzo.biz 2
http://webcache.googleusercontent.com 1
http://www.netvibes.com 1
https://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 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 Bdd: Tdd and beyond the infinite Presentation Transcript

  • BEHAVIOUR DRIVEN DEVELOPMENT: TDD AND BEYOND THE INFINITE
  • Duct Tape Religion War
  • At the beginning…
  •  
  •     end;     // CellText := str;   except     // Gabriele non t'ha beccato, Gigi neppure, a chi toccherà?   end; end;
  • 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; } } }
  • 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;
  •  
  •  
  • Kent Beck gave Tdd to programmers!
  • The Three Laws of TDD
  • 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.
  • 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.
  • 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.
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • TDD Cycle
  • Is that the end of our problems?
  • I’m a programmer, not a tester!
  • My code it’s difficult to test!
  • It’s a trivial, doesn’t need a test!
  • I’ve no time to make automatic tests!
  • It’s about specifications
  • 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.”
  • The Challenge
  • 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
  • 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!
  • puts ( 1 . .100 ). map { | n | '1' * n + &quot;:#{n} &quot; }. join . gsub ( /^(1{5})*:/,'Buzz').gsub(/^(1{3})*:/,'Fizz').gsub(/.*:|(z)d+/ , '1' ) WTF?!?!!
  • 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
  • package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return null ; } } Fizzbuzzer.java
  • package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return &quot;1&quot; ; } } Fizzbuzzer.java
  • @Test public void testForTwo (){ Assert . assertEquals ( &quot;2&quot; , new Fizzbuzzer (). count ( 2 )); } FizzbuzzTest.java
  • package biz . scalzo . tdd ; public class Fizzbuzzer { public String count ( int i ) { return Integer . toString ( i ); } } Fizzbuzzer.java
  • @Test public void testForThree (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 3 )); } FizzbuzzTest.java
  • 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
  • @Test public void testForFour (){ Assert . assertEquals ( &quot;4&quot; , new Fizzbuzzer (). count ( 4 )); } FizzbuzzTest.java
  • @Test public void testForFive (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 5 )); } FizzbuzzTest.java
  • 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
  • @Test public void testForSix (){ Assert . assertEquals ( &quot;Fizz&quot; , new Fizzbuzzer (). count ( 6 )); } FizzbuzzTest.java
  • 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
  • @Test public void testForSeven (){ Assert . assertEquals ( “7&quot; , new Fizzbuzzer (). count ( 7 )); } FizzbuzzTest.java
  • @Test public void testForEight (){ Assert . assertEquals ( “8&quot; , new Fizzbuzzer (). count ( 8 )); } FizzbuzzTest.java
  • @Test public void testForNine (){ Assert . assertEquals ( “Fizz&quot; , new Fizzbuzzer (). count ( 9 )); } FizzbuzzTest.java
  • @Test public void testForTen (){ Assert . assertEquals ( &quot;Buzz&quot; , new Fizzbuzzer (). count ( 10 )); } FizzbuzzTest.java
  • 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
  • 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
  • @Test public void testForFifteen (){ Assert . assertEquals ( &quot;FizzBuzz&quot; , new Fizzbuzzer (). count ( 15 )); } FizzbuzzTest.java
  • 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
  • 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
  • Result
  • 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
  • @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
  •  
  • Bdd Way
  • Bdd Way Test method names should be sentences
  • 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
  • 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
  • Bdd Way the class should do something
  • 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
  • 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
  • @Test public void shouldYellTwoForTwo () { assertThat ( new Fizzbuzzer (). count ( 2 ), is ( equalTo ( &quot;2&quot; ))); } AFizzbuzzer.java
  • @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
  • @Test public void shouldYellBuzzForMultipleOfFive () { int [] buzzers = { 5 , 10 }; for ( int buzzer : buzzers ) { assertThat ( new Fizzbuzzer (). count ( buzzer ), is ( equalTo ( &quot;Buzz&quot; ))); } } AFizzbuzzer.java
  • @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
  • @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
  •  
  • Fathers of Bdd
  • The Ruby Way to Bdd
  • $ :. 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
  • it &quot;should yell two for two&quot; do Fizzbuzzer . new . count ( 2 ). should == '2' end fizzbuzzer_spec.rb
  • it &quot;should yell Fizz for three&quot; do Fizzbuzzer . new . count ( 3 ). should == 'Fizz' end fizzbuzzer_spec.rb
  • 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
  • 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
  • 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
  • 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
  • Result
  • 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
  • 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
  • output
  • output
  • Stories
  • As a [role] I want [feature] So that [benefit] Story
  • Scenario 1: Title Given [context] And [some more context]... When [event] Then [outcome] And [another outcome] Scenario Acceptance Criteria
  • Cucumber
  • Cucumber fizzbuzzer.feature fizzbuzzer_steps.rb
  • Feature : perfect fizzbuzzing As a inattentive counter I want an automatic Fizzbuzzer So that I can win Fizzbuzz Championsip fizzbuzzer.feature
  • Scenario : manage fizz numbers Given a Fizzbuzzer When I ask for a multiple of 3 Then Fizzbuzzer yells 'Fizz' fizzbuzzer.feature
  • 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
  • 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
  • Scenario : manage plain numbers Given a Fizzbuzzer When I ask for a plain number Then Fizzbuzzer yells the number itself fizzbuzzer.feature
  • 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
  • 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
  • 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
  • neat, isn’t it?
  • Back to Java
  • Where it all started
  • jbehave manage_fizzbuzzer ManageFizzbuzzer.java ManageFizzbuzzerSteps.java
  • 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
  • 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
  • package biz . scalzo . jbehave ; import org . jbehave . scenario . Scenario ; public class ManageFizzbuzzer extends Scenario { public ManageFizzbuzzer () { super ( new ManageFizzbuzzerSteps ()); } } ManageFizzbuzzer.java
  • 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
  • @ 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
  • @ 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
  • @ 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
  • Other Frameworks
    • ASSpec ActionScript 3
    • CppSpec C++
    • Spec- cpp C++
    • CSpec C
    • cfSpec ColdFusion
    • dSpec Delphi
    • easyb Groovy
    • EasySpec Groovy
    • tspec Groovy
    • GSpec Groovy
    • Concordion Java
    • GivWenZen Java
    • Instinct Java
    • JavaStubs Java
    • JBehave Java
    • JDave Java
    • beanSpec Java
    • JFXtras Test JavaFX
    • JSpec JavaScript
    • JSSpec JavaScript
    • Screw- unit JavaScript
    Other Frameworks
    • NBehave .Net
    • NSpec .Net
    • NSpecify .Net
    • SpecUnit .Net
    • NUnit .Net
    • Specter .Net
    • StoryQ .Net
    • ObjectiveMatchy iPhone
    • PHPSpec PHP
    • Pyccuracy Python
    • Pyhistorian Python
    • PyCukes Python
    • Robot Framework Python
    • ScalaTest Scala
    • specs Scala
    Other Frameworks
  • Conclusions?
  • Bdd is about specifications
  • Homework
  • http://github.com/coreyhaines/ practice_game_of_life
  • 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
  • Start Bdd now!
  •  
  • ? ? ? ? ? ?