SlideShare a Scribd company logo
1 of 41
Download to read offline
Test Driven Development
@Joachim_L
Hva?
• «Gjenoppdaget» av Kent Beck tidlig på 2000-tallet.
• Ga ut boka «Test Driven Development: By Example» i 2002
• Har sitt utspring i Extreme Programming-bevegelsens test first-filosofi
• Kent Beck bidro til å utforme «The Agile Manifesto» i 1999.
• Beskriver en utviklingsmetodikk med en svært kort syklus («red-
green-refactor») .
• Oppfordrer til enkelt design og øker tilliten til koden.
Hva?
• Handler først og fremst om design, ikke testing.
• Forskjellige typer
• Unit tests (enhetstester)
• Integrations tests (integrasjonstester)
• End-to-end tests (systemtester)
• Outside-in eller inside-out.
Hvorfor?
• Utviklere gjør feil.
“58% of software bugs result from test infrastructure and process, not design
defects” (Electric Cloud, 2. juni 2010)
• Jo tidligere man finner en feil, jo billigere er den å fikse.
• I TDD skrives testene før systemkoden – altså så tidlig som mulig.
• Testene sikrer at systemet implementerer designet.
• Testene er APIets første brukere.
Hvorfor?
• Mindre tid i debuggeren
• Eksisterende tester sikrer at ny kode ikke ødelegger eksisterende
funksjonalitet (regresjon)
• Gjør det lettere å skrive CLEAN-kode.
• Red-green-refactor sikrer at refactoring-prosessen kun endrer
implementasjon, ikke funksjonalitet.
• Kontinuerlig mestringsfølelse
• Alle liker vel grønne lys?
Hvordan?
Skriv tester for kode du skulle ønske du
hadde
TCYWYH – The Code You Wish You Had
Test First Development
1. Identifiser én ting koden skal gjøre.
2. Skriv en test som verifiserer at koden gjør den éne tingen.
3. Kjør testen (manuelt eller automatisk)
4. Skriv kode som gjør at systemet består testen.
• I denne fasen fokuserer man på at koden gjør det den skal, ikke at den er pen.
5. Refactor. (Gjør koden pen.)
6. Gå til pkt. 1
Red
GreenRefactor
Test First Development
1. Identifiser én ting koden skal gjøre.
2. Skriv en test som verifiserer at koden gjør den éne tingen.
3. Kjør testen (manuelt eller automatisk)
4. Skriv kode som gjør at systemet består testen.
• I denne fasen fokuserer man på at koden gjør det den skal, ikke at den er pen.
5. Refactor. (Gjør koden pen.)
6. Gå til pkt. 1
Red
GreenRefactor
Hvordan?
Testene skrives i henhold til FIRST-prinsippene:
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Hvordan?
Testene skrives i henhold til FIRST-prinsippene:
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Fast
Testene må være raske, ettersom de kjører kontinuerlig.
• Enhetstester må være raskere enn integrasjonstester som må være raskere
enn systemtester.
• Avhengigheter til andre systemer og moduler unngås, typisk med mocks og
stubs.
• Et verktøy som nCrunch kan automatisk kjøre tester som berøres når kode
endres.
Hvordan?
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Independent
Testene må være uavhengige av hverandre
• Tester må gi samme resultat uavhengig av rekkefølgen de blir kjørt i.
• En test kan ikke være avhengig av en annen tests resultat (eller klar over dens
eksistens).
• Bruk av f.eks SetUp-attributter i nUnit for å gjenskape opprinnelig state.
Hvordan?
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Repeatable
Testene må gi samme resultat uavhengig av hvor
mange ganger de kjøres.
• Igjen ved bruk av f.eks SetUp-attributter i nUnit for å gjenskape opprinnelig
state.
• Unngå avhengigheter til eksterne systemer.
Hvordan?
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Self-checking
Testene må automatisk vite om de er passert og
godkjent.
• Ingen manuelle rutiner/operasjoner (ingen output må verifiseres manuelt
eller observasjoner av annen art må gjøres).
Hvordan?
• Fast
• Independent
• Repeatable
• Self-checking
• Timely
Timely
Testene skal skrives til rett tid og alltid før systemkoden.
• Enhetstester skal skrives umiddelbart før koden den dekker.
Hvordan?
Om en test feiler skal det ikke være noen tvil om hva som har gått galt.
• Hver enkelt test bør teste så lite som mulig. (Én assert per test.)
• Testens (testmetodens) navn bør ikke etterlate noen tvil om hva den
tester.
• Særs ille: private void private void TestPostMethod();
• Ikke bra: private void DoublePost() ;
• Bedre: private void DoublePostOnBlogFails();
• Best: private void Double_post_on_article_throws_DuplicatePostException()
Hvordan?
Bytt ut kall til eksterne avhengigheter med mocks og stubs.
• Fordrer at man har kode skrevet etter Inversion of Control-prinsippet.
• Bruk et mocking-rammeverk om en stub ikke holder.
Hvordan?
• Arrange
• Act
• Assert
Arrange
• Om nødvendig:
• Sørg for at systemet er i samsvar med forutsetninger.
• Lag inputparametre
• Sett opp mocking
Hvordan?
• Arrange
• Act
• Assert
Act
• Gjør metodekallet som sørger for at koden som skal testes blir kjørt.
• Ta vare på eventuell returverdi.
Hvordan?
• Arrange
• Act
• Assert
Assert
• Verifiser at koden har gjort dene ene tingen som testen forventer.
• Returnert riktig verdi
• Kastet forventet Exception
Hvordan?
• Testpyramiden beskriver forholdet mellom antall tester av forskjellige
typer.
Enhetstester
GUI-
tester
Integrasjons-, komponent-
og/eller akseptansetester
Manuell testing
Verktøy - Testrammeverk
• Tester kan skrives uten et rammeverk, men…
• …et testrammeverk tilbyr
• klasser, attributter og interfacer som forenkler oppsett og utforming av
testene
• En «runner» som kjører testene
• Faktiske grønne og røde (og av og til gule) indikatorer.
Verktøy - Testrammeverk
• nUnit
• .net-port av javas jUnit.
• Stabil.
• Statisk
• Stagnert?
• Alternativer:
• MSTest (Microsofts egen, som følger med Visual Studio).
• xUnit
• Alt som er en [Fact] kjøres, i motsetning til nUnit, som krever [TestFixture] og [Test].
• Baserer seg på interfacer, ikke arv.
Verktøy - Mocking
• Bruk mocks (liksomobjekter) for å jukse til avhengigheter man ikke
har kontroll på.
• Webservicer
• Databaser
• Web APIer
• Moq
Verktøy - AutoFixture
• Kraftig verktøy for generering av data.
• Utviklere kan fokusere på funksjonaliteten som testes, ikke dataene
som brukes.
• Kan utvides til å generere hele objektstrukturer med avansert logikk.
Verktøy - AutoFixture
• Kraftig verktøy for generering av data.
• Utviklere kan fokusere på funksjonaliteten som testes, ikke dataene
som brukes.
• Kan utvides til å generere hele objektstrukturer med avansert logikk.
Videre lesning
• Test Driven Development: By Example, Kent Beck
Videre lesning
• Test Driven Development: By Example, Kent Beck
• Growing Object-Oriented Software, Guided by Tests [Paperback]
Videre lesning
• Test Driven Development: By Example, Kent Beck
• Growing Object-Oriented Software, Guided by Tests [Paperback]
• Professional Test Driven Development with C#
Eksempler
• Enhetstester
• Integrasjonstest
• GUI-tester
Eksempler
• Enhetstester
• Integrasjonstest
• GUI-tester
Eksempler
• Enhetstest
• Integrasjonstest
• GUI-tester
Eksempler
• Enhetstest
• Integrasjonstest
• GUI-tester
Eksempler
• Enhetstest
• Integrasjonstest
• GUI-tester

More Related Content

Similar to Introduksjon til TDD

GoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergGoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergFriprogsenteret
 
Smart-APITest.pdf
Smart-APITest.pdfSmart-APITest.pdf
Smart-APITest.pdfMinh Nguyen
 
Solide systemer med unit of work
Solide systemer med unit of workSolide systemer med unit of work
Solide systemer med unit of workEirik Maus
 
Automatisert Testing
Automatisert TestingAutomatisert Testing
Automatisert TestingAnders Sveen
 
Smidig 2011 TDD Workshop
Smidig 2011 TDD WorkshopSmidig 2011 TDD Workshop
Smidig 2011 TDD WorkshopJonas Follesø
 
Ikke test Puppet-koden din
Ikke test Puppet-koden dinIkke test Puppet-koden din
Ikke test Puppet-koden dinJan Ivar Beddari
 
Bygg applikasjonen din testbar
Bygg applikasjonen din testbarBygg applikasjonen din testbar
Bygg applikasjonen din testbarjanniche
 
Software Security: Hvordan bygge sikre systemer?
Software Security: Hvordan bygge sikre systemer?Software Security: Hvordan bygge sikre systemer?
Software Security: Hvordan bygge sikre systemer?Marie Elisabeth Gaup Moe
 
Creuna om brukeropplevelse - fra synsing til datadrevet innsikt
Creuna om brukeropplevelse - fra synsing til datadrevet innsiktCreuna om brukeropplevelse - fra synsing til datadrevet innsikt
Creuna om brukeropplevelse - fra synsing til datadrevet innsiktTord Heyerdahl
 
20211125 Odin - Modell-basert testing
20211125 Odin - Modell-basert testing 20211125 Odin - Modell-basert testing
20211125 Odin - Modell-basert testing Minh Nguyen
 
Kan vi skape mye mere verdi i softwareporosjekter
Kan vi skape mye mere verdi i softwareporosjekterKan vi skape mye mere verdi i softwareporosjekter
Kan vi skape mye mere verdi i softwareporosjekterThor Henning Hetland
 
JavaZone 2006 - Gode grep når prosjektet blir stort
JavaZone 2006 -  Gode grep når prosjektet blir stortJavaZone 2006 -  Gode grep når prosjektet blir stort
JavaZone 2006 - Gode grep når prosjektet blir stortEirik Torske
 
3-minutters guide: Slik lykkes du med smidig utvikling
3-minutters guide: Slik lykkes du med smidig utvikling3-minutters guide: Slik lykkes du med smidig utvikling
3-minutters guide: Slik lykkes du med smidig utviklingSteria Norway
 
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av AutentiseringsprosjektetIkt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektetleiftorger
 
Hjelp, vi må prodsette
Hjelp, vi må prodsetteHjelp, vi må prodsette
Hjelp, vi må prodsettejorgenwahlberg
 
Blazor - en kjapp intro
Blazor - en kjapp introBlazor - en kjapp intro
Blazor - en kjapp introRunegri
 

Similar to Introduksjon til TDD (20)

GoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergGoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen Wahlberg
 
Smart-APITest.pdf
Smart-APITest.pdfSmart-APITest.pdf
Smart-APITest.pdf
 
Solide systemer med unit of work
Solide systemer med unit of workSolide systemer med unit of work
Solide systemer med unit of work
 
140310 testing-workshop-island-2010-public
140310 testing-workshop-island-2010-public140310 testing-workshop-island-2010-public
140310 testing-workshop-island-2010-public
 
Automatisert Testing
Automatisert TestingAutomatisert Testing
Automatisert Testing
 
Smidig 2011 TDD Workshop
Smidig 2011 TDD WorkshopSmidig 2011 TDD Workshop
Smidig 2011 TDD Workshop
 
Ikke test Puppet-koden din
Ikke test Puppet-koden dinIkke test Puppet-koden din
Ikke test Puppet-koden din
 
Bygg applikasjonen din testbar
Bygg applikasjonen din testbarBygg applikasjonen din testbar
Bygg applikasjonen din testbar
 
Hele butikken i skyen
Hele butikken i skyenHele butikken i skyen
Hele butikken i skyen
 
Risikobasert testing
Risikobasert testingRisikobasert testing
Risikobasert testing
 
Software Security: Hvordan bygge sikre systemer?
Software Security: Hvordan bygge sikre systemer?Software Security: Hvordan bygge sikre systemer?
Software Security: Hvordan bygge sikre systemer?
 
Creuna om brukeropplevelse - fra synsing til datadrevet innsikt
Creuna om brukeropplevelse - fra synsing til datadrevet innsiktCreuna om brukeropplevelse - fra synsing til datadrevet innsikt
Creuna om brukeropplevelse - fra synsing til datadrevet innsikt
 
20211125 Odin - Modell-basert testing
20211125 Odin - Modell-basert testing 20211125 Odin - Modell-basert testing
20211125 Odin - Modell-basert testing
 
Kan vi skape mye mere verdi i softwareporosjekter
Kan vi skape mye mere verdi i softwareporosjekterKan vi skape mye mere verdi i softwareporosjekter
Kan vi skape mye mere verdi i softwareporosjekter
 
JavaZone 2006 - Gode grep når prosjektet blir stort
JavaZone 2006 -  Gode grep når prosjektet blir stortJavaZone 2006 -  Gode grep når prosjektet blir stort
JavaZone 2006 - Gode grep når prosjektet blir stort
 
3-minutters guide: Slik lykkes du med smidig utvikling
3-minutters guide: Slik lykkes du med smidig utvikling3-minutters guide: Slik lykkes du med smidig utvikling
3-minutters guide: Slik lykkes du med smidig utvikling
 
Devops eller dø!
Devops eller dø!Devops eller dø!
Devops eller dø!
 
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av AutentiseringsprosjektetIkt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
 
Hjelp, vi må prodsette
Hjelp, vi må prodsetteHjelp, vi må prodsette
Hjelp, vi må prodsette
 
Blazor - en kjapp intro
Blazor - en kjapp introBlazor - en kjapp intro
Blazor - en kjapp intro
 

Introduksjon til TDD

  • 2. Hva? • «Gjenoppdaget» av Kent Beck tidlig på 2000-tallet. • Ga ut boka «Test Driven Development: By Example» i 2002 • Har sitt utspring i Extreme Programming-bevegelsens test first-filosofi • Kent Beck bidro til å utforme «The Agile Manifesto» i 1999. • Beskriver en utviklingsmetodikk med en svært kort syklus («red- green-refactor») . • Oppfordrer til enkelt design og øker tilliten til koden.
  • 3. Hva? • Handler først og fremst om design, ikke testing. • Forskjellige typer • Unit tests (enhetstester) • Integrations tests (integrasjonstester) • End-to-end tests (systemtester) • Outside-in eller inside-out.
  • 4. Hvorfor? • Utviklere gjør feil. “58% of software bugs result from test infrastructure and process, not design defects” (Electric Cloud, 2. juni 2010) • Jo tidligere man finner en feil, jo billigere er den å fikse. • I TDD skrives testene før systemkoden – altså så tidlig som mulig. • Testene sikrer at systemet implementerer designet. • Testene er APIets første brukere.
  • 5. Hvorfor? • Mindre tid i debuggeren • Eksisterende tester sikrer at ny kode ikke ødelegger eksisterende funksjonalitet (regresjon) • Gjør det lettere å skrive CLEAN-kode. • Red-green-refactor sikrer at refactoring-prosessen kun endrer implementasjon, ikke funksjonalitet. • Kontinuerlig mestringsfølelse • Alle liker vel grønne lys?
  • 6. Hvordan? Skriv tester for kode du skulle ønske du hadde TCYWYH – The Code You Wish You Had
  • 7. Test First Development 1. Identifiser én ting koden skal gjøre. 2. Skriv en test som verifiserer at koden gjør den éne tingen. 3. Kjør testen (manuelt eller automatisk) 4. Skriv kode som gjør at systemet består testen. • I denne fasen fokuserer man på at koden gjør det den skal, ikke at den er pen. 5. Refactor. (Gjør koden pen.) 6. Gå til pkt. 1 Red GreenRefactor
  • 8. Test First Development 1. Identifiser én ting koden skal gjøre. 2. Skriv en test som verifiserer at koden gjør den éne tingen. 3. Kjør testen (manuelt eller automatisk) 4. Skriv kode som gjør at systemet består testen. • I denne fasen fokuserer man på at koden gjør det den skal, ikke at den er pen. 5. Refactor. (Gjør koden pen.) 6. Gå til pkt. 1 Red GreenRefactor
  • 9. Hvordan? Testene skrives i henhold til FIRST-prinsippene: • Fast • Independent • Repeatable • Self-checking • Timely
  • 10. Hvordan? Testene skrives i henhold til FIRST-prinsippene: • Fast • Independent • Repeatable • Self-checking • Timely
  • 11. Fast Testene må være raske, ettersom de kjører kontinuerlig. • Enhetstester må være raskere enn integrasjonstester som må være raskere enn systemtester. • Avhengigheter til andre systemer og moduler unngås, typisk med mocks og stubs. • Et verktøy som nCrunch kan automatisk kjøre tester som berøres når kode endres.
  • 12. Hvordan? • Fast • Independent • Repeatable • Self-checking • Timely
  • 13. Independent Testene må være uavhengige av hverandre • Tester må gi samme resultat uavhengig av rekkefølgen de blir kjørt i. • En test kan ikke være avhengig av en annen tests resultat (eller klar over dens eksistens). • Bruk av f.eks SetUp-attributter i nUnit for å gjenskape opprinnelig state.
  • 14. Hvordan? • Fast • Independent • Repeatable • Self-checking • Timely
  • 15. Repeatable Testene må gi samme resultat uavhengig av hvor mange ganger de kjøres. • Igjen ved bruk av f.eks SetUp-attributter i nUnit for å gjenskape opprinnelig state. • Unngå avhengigheter til eksterne systemer.
  • 16. Hvordan? • Fast • Independent • Repeatable • Self-checking • Timely
  • 17. Self-checking Testene må automatisk vite om de er passert og godkjent. • Ingen manuelle rutiner/operasjoner (ingen output må verifiseres manuelt eller observasjoner av annen art må gjøres).
  • 18. Hvordan? • Fast • Independent • Repeatable • Self-checking • Timely
  • 19. Timely Testene skal skrives til rett tid og alltid før systemkoden. • Enhetstester skal skrives umiddelbart før koden den dekker.
  • 20. Hvordan? Om en test feiler skal det ikke være noen tvil om hva som har gått galt. • Hver enkelt test bør teste så lite som mulig. (Én assert per test.) • Testens (testmetodens) navn bør ikke etterlate noen tvil om hva den tester. • Særs ille: private void private void TestPostMethod(); • Ikke bra: private void DoublePost() ; • Bedre: private void DoublePostOnBlogFails(); • Best: private void Double_post_on_article_throws_DuplicatePostException()
  • 21. Hvordan? Bytt ut kall til eksterne avhengigheter med mocks og stubs. • Fordrer at man har kode skrevet etter Inversion of Control-prinsippet. • Bruk et mocking-rammeverk om en stub ikke holder.
  • 23. Arrange • Om nødvendig: • Sørg for at systemet er i samsvar med forutsetninger. • Lag inputparametre • Sett opp mocking
  • 25. Act • Gjør metodekallet som sørger for at koden som skal testes blir kjørt. • Ta vare på eventuell returverdi.
  • 27. Assert • Verifiser at koden har gjort dene ene tingen som testen forventer. • Returnert riktig verdi • Kastet forventet Exception
  • 28. Hvordan? • Testpyramiden beskriver forholdet mellom antall tester av forskjellige typer. Enhetstester GUI- tester Integrasjons-, komponent- og/eller akseptansetester Manuell testing
  • 29. Verktøy - Testrammeverk • Tester kan skrives uten et rammeverk, men… • …et testrammeverk tilbyr • klasser, attributter og interfacer som forenkler oppsett og utforming av testene • En «runner» som kjører testene • Faktiske grønne og røde (og av og til gule) indikatorer.
  • 30. Verktøy - Testrammeverk • nUnit • .net-port av javas jUnit. • Stabil. • Statisk • Stagnert? • Alternativer: • MSTest (Microsofts egen, som følger med Visual Studio). • xUnit • Alt som er en [Fact] kjøres, i motsetning til nUnit, som krever [TestFixture] og [Test]. • Baserer seg på interfacer, ikke arv.
  • 31. Verktøy - Mocking • Bruk mocks (liksomobjekter) for å jukse til avhengigheter man ikke har kontroll på. • Webservicer • Databaser • Web APIer • Moq
  • 32. Verktøy - AutoFixture • Kraftig verktøy for generering av data. • Utviklere kan fokusere på funksjonaliteten som testes, ikke dataene som brukes. • Kan utvides til å generere hele objektstrukturer med avansert logikk.
  • 33. Verktøy - AutoFixture • Kraftig verktøy for generering av data. • Utviklere kan fokusere på funksjonaliteten som testes, ikke dataene som brukes. • Kan utvides til å generere hele objektstrukturer med avansert logikk.
  • 34. Videre lesning • Test Driven Development: By Example, Kent Beck
  • 35. Videre lesning • Test Driven Development: By Example, Kent Beck • Growing Object-Oriented Software, Guided by Tests [Paperback]
  • 36. Videre lesning • Test Driven Development: By Example, Kent Beck • Growing Object-Oriented Software, Guided by Tests [Paperback] • Professional Test Driven Development with C#
  • 42. Takk!