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
(men oftere enn du tror)
…kvalitetsgaranti
Eksempel: FitNesse
103.38% testdekning
(ikke bekreftet)
Støtter ikke UTF-8
Netto tap for brukere
2. Mordet på FitNesse
Johannes Kodebase main test FitNesse
Johannes Kodebase main test FitNesse Hmmm….
Johannes Kodebase main test FitNesse Litt rotete og tregt. Utvikler Enig. Let’s refactor!
Produktiv tid passerer….
Johannes Kodebase main test FitNesse Ah, endelig ferdig Utvikler
Johannes Kodebase main test FitNesse Hva med FitNesse? Utvikler
Johannes Kodebase main test FitNesse Burde gå greit… La oss se Utvikler
Johannes Kodebase main test FitNesse Kom visst borti noe Utvikler
Johannes Kodebase main test FitNesse Hva f… skjer her? Utvikler
Ikke-Produktiv tid passerer….
Neste morgen
Nesten ferdig med historien Johannes
Mangler bare FitNesse test Johannes
Samme her Johannes Hmmm….
Utvikler Hvorfor skriver vi FitNesse tester Hmmm… Johannes
Utvikler Det blir lissom JUnit-tester på nytt Johannes
Utvikler Litt vanskeligere å debugge… Johannes
Utvikler Men da bruker vi JUnit-testene. Johannes
Utvikler Har dere bruk for FitNesse testene? Hmmm… Johannes
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 Hva gjør dere med FitNesse tester
Johannes Utvikler Beskrive manuelle tester
Johannes 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 NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T15:00201…T16: MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T13:00201…T16: MWh (missing)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T15:00201…T16:00700 MWh -700 MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T14:00201…T15: MWh
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T15:00201…T16: MWh NO2Z201…T15:00201…T16:00288 MWh (ekstra)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når systemet mottar en utveksling over linje 12 på 700 MWh for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T15:00201…T16: MWh NLb201…T15:00201…T16:00700 MWh (ekstra)
Gitt at linje 12 går fra knutepunkt a til knutepunkt b, og knutepunkt a ligger i NO3 og knutepunkt b ligger i NL, når en utveksling over linje 12 på 700 MWh registreres for mellom 14:00 og 15:00, så skal følgende kraftbidrag blir registrert: OmrådeKnutepunktStartSluttEffekt NO3a201…T14:00201…T15: 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 linja så 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 linja så 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
@Test public 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!
@Test public 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); }
@Test public 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
Kommunikasjon eller Automatisering
Ja, takk
Men ikke i samme test
Takk for meg!