TDD over BDD why and how

Post on 09-Feb-2016

55 views 0 download

Tags:

description

TDD over BDD why and how. XP meetup Johannes 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. - PowerPoint PPT Presentation

Transcript of TDD over BDD why and how

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