TDD over BDD why and how
Post on 09-Feb-2016
54 Views
Preview:
DESCRIPTION
Transcript
TDD over BDDwhy and how
XP meetupJohannes Brodwall, Programming artist
Steria Norway
•Hva er TDD?•Hvem myrdet FitNesse?•Hvorfor vil BDD feile?•Et alternativ
1. TDD
Demo
TDD er…
…treningsform
…frigjøring av hjernekraft
…forståelse
TDD er ikke…
…alltid riktig
…alltid riktig(men oftere enn du tror)
…kvalitetsgaranti
Eksempel:FitNesse
103.38% testdekning
103.38% testdekning(ikke bekreftet)
Støtter ikke UTF-8
Netto tap for brukere
2. Mordet på FitNesse
Johannes
Kodebase
maintest
FitNesse
Johannes
Kodebase
maintest
FitNesse
Hmmm….
Johannes
Kodebase
maintest
FitNesse
Litt rotete og tregt.
Utvikler
Enig. Let’s refactor!
Produktiv tid passerer….
Johannes
Kodebase
maintest
FitNesse
Ah, endelig ferdig
Utvikler
Johannes
Kodebase
maintest
FitNesse
Hva med FitNesse?
Utvikler
Johannes
Kodebase
maintest
FitNesse
Burde gå greit… La
oss se
Utvikler
Johannes
Kodebase
maintest
FitNesse
Kom visst borti noe
Utvikler
Johannes
Kodebase
maintest
FitNesse
Hva f… skjer her?
Utvikler
Ikke-Produktiv tid passerer….
Neste morgen
Nesten ferdig med historien
Johannes
Mangler bare FitNesse test
Johannes
Samme herJohannes
Hmmm….
Utvikler
Utvikler
Hvorfor skriver vi FitNesse tester
Hmmm…
Johannes
Utvikler
Utvikler
Det blir lissom JUnit-tester på
nytt
Johannes
Utvikler
Utvikler
Litt vanskeligere å debugge…
Johannes
Utvikler
Utvikler
Men da bruker vi JUnit-testene.
Johannes
Utvikler
Utvikler
Har dere bruk for FitNesse testene?
Hmmm…
Johannes
Utvikler
Utvikler
Tror testleder vil ha dem…
Hmmm….Johannes
Testleder
Hva bruker vi FitNesse testene
til?
Johannes
Utviklerne viser dem til meg når de er ferdige.
Testleder
Johannes
Og jeg tror kunden vil ha
dem
Hmmm….
Kundens arkitekt
Johannes
Få FitNesse tester er slik vi
vil…
Johannes
Jeg har ikke sett på FitNesse på
måneder
Produkteier
Johannes
Utvikler
Utvikler
Hva gjør dere med FitNesse
tester
Johannes
Utvikler
Utvikler
Beskrive manuelle tester
Johannes
Utvikler
Utvikler
Ja. Ugh!
When …
… stop digging!
3. Hvorfor BDD mislykkes
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12 på
700 MWh for 12.06.2011 mellom 14:00 og 15:00,så skal følgende kraftbidrag blir registrert:
Område Knutepunkt Start Slutt EffektNO3 a 201…T15:00 201…T16:00 -700 MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,
og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12
på 700 MWh for 12.06.2011 mellom 14:00 og 15:00,
så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T13:00 201…T16:00 -700 MWh
(missing)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,
og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12
på 700 MWh for 12.06.2011 mellom 14:00 og 15:00,
så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T15:00 201…T16:00 700 MWh
-700 MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,
og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12
på 700 MWh for 12.06.2011 mellom 14:00 og 15:00,
så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T14:00 201…T15:00 -700 MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,
og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12
på 700 MWh for 12.06.2011 mellom 14:00 og 15:00,
så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T15:00 201…T16:00 -700 MWh
NO2 Z 201…T15:00 201…T16:00 288 MWh (ekstra)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,
og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når systemet mottar en utveksling over linje 12
på 700 MWh for 12.06.2011 mellom 14:00 og 15:00,
så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T15:00 201…T16:00 -700 MWh
NL b 201…T15:00 201…T16:00 700 MWh (ekstra)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b,og knutepunkt a ligger i NO3og knutepunkt b ligger i NL,når en utveksling over linje 12 på 700 MWh registreres for 12.06.2011 mellom 14:00 og 15:00,så skal følgende kraftbidrag blir registrert:Område Knutepunkt Start Slutt EffektNO3 a 201…T14:00 201…T15:00 -700 MWh
Holy crap!
Johannes
Gitt en kraftlinje fra et norsk elspotområde til et utlandsk elspotområde,
Når vi mottar en måling for linjaså skal kun bidraget til det norske
området registreres
Hva er viktig med ”key examples?”
Kundedialog er essensielt
Automatisering er irrelevant
Ingen går i prod uten manuell test
4. Hvordan lykkes med TDD
1. Nøkkeleksempel
Gitt en kraftlinje fra et norsk elspotområde til et utlandsk elspotområde,
Når vi mottar en måling for linjaså skal kun bidraget til det norske
området registreres
Nøkkeleksempel:Formål fremfor automatisering
De lo når jeg testet manuelt,
… men når det ikke var feil…
2. Enhetstest
@Testpublic void shouldCreatePerson() throws Exception { Connection connMock = mock(Connection.class); PreparedStatement statementMock = mock(PreparedStatement.class); when(connMock.prepareStatement(anyString())) .thenReturn(statementMock); Person person = Person.withName("Darth", "Vader"); personDao.createPerson(person); ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); verify(connMock.prepareStatement(sqlCaptor.capture())); assertThat(sqlCaptor.getValue()) .contains("insert into table person");
verify(statementMock).setString(1, "Darth"); verify(statementMock).setString(2, "Vader");}
NEVER
do this!
@Testpublic void shouldLimitFindToQuery() throws Exception { personDao.beginTransaction(); Person matchingPerson = Person.withName("Darth", "Vader"); Person nonMatchingPerson = Person.withName("Darth", “Maul"); personDao.createPerson(matchingPerson); personDao.createPerson(nonMatchingPerson);
assertThat(personDao.findPeople("vader")) .contains(matchingPerson) .excludes(nonMatchingPerson);}
@Testpublic void shouldLimitFindToQuery() { Person match = Person.withName("Darth", "Vader"); Person nonMatch = Person.withName("Darth", “Maul"); personDao.createPerson(match); personDao.createPerson(nonMatch);
assertThat(personDao.findPeople("vader")) .contains(match) .excludes(nonMatch);}
Enhetstest:Formål fremfor oppførsel
3. Trening
Trening:Intensjon framfor
tastetrykk
Kommunikasjoneller
Automatisering
Ja, takk
Men ikke i samme test
Takk for meg!johannes.brodwall@steria.no
http://johannesbrodwall.comhttp://sterkblanding.no
http://twitter.com/jhannes
top related