Effektiv testing Per Otto Bergum Christensen 9.-10. September, JavaZone Bergum Christensen Consulting
Om meg Per Otto Bergum Christensen (33) Siv.ing, Datateknikk, NTNU Jobbet med utviklingsprosjekter på JEE siden 2000, som utvikler, teamleder og arkitekt 8 års erfaring fra BEKK Consulting Nå: Bergum Christensen Consulting Bergum Christensen Consulting
Hvilke sideeffekter har test på et prosjekt?
Et verktøy for å nå nye høyder? Periklisgr - Fotolia.com http://www.flickr.com/photos/thyristor/2653744298/
Et hinder for endring? nsphotography - Fotolia.com
Hva må vi tenke på angående automatisert test?
Riktig valg av testverktøy RTimages - Fotolia.com
Riktig bruk av testverktøy Martin Green - Fotolia.com
Agenda: Effektiv testing Enhetstest Funksjonell test Test av brukergrensesnittet Eksempel på effektiv testing
Enhetstest frenta - Fotolia.com
En test public class TestSluttrabatt { @Test public void beregnesbasertpaaantallvarerogpris() { List<Integer> varebeloep = HandelTestdata.belopslisteMedTreVarekjoep(); int rabatt = Sluttrabatt.kalkulert(vareBeloep); assertequals(10, rabatt); } }
public class TestSluttrabatt { @Test public void beregnesbasertpaaantallvarerogpris() { List<Integer> varebeloep = HandelTestdata.belopslisteMedTreVarekjoep(); int rabatt = Sluttrabatt.kalkulert(vareBeloep); assertequals(10, rabatt); } }
Rimeligste vare i rabatt ved kjøp av tre varer public class TestSluttrabatt { @Test public void beregnesbasertpaaantallvarerogpris() { List<Integer> varebeloep = HandelTestdata.belopslisteMedTreVarekjoep(); int rabatt = Sluttrabatt.kalkulert(vareBeloep); assertequals(10, rabatt); } } [ 10, 20, 30 ]
Test redesignet public class TestSluttrabatt { @Test public void rimligstevareirabattvedkjoepavtrevarer() { List<Integer> varebeloep = aslist(10, 20, 30); int rabatt = Sluttrabatt.kalkulert(vareBeloep); assertequals(10, rabatt); } }
Enhetstest - tips Testmetodenavn som beskriver et krav Testblokk som verifiserer et krav Testdata nærme testblokken Testblokk som har riktig størrelse Unngå mocks i enhetstest
Funksjonell test Lukasz Laska - istockphoto.com
Fra Fitnesse Scenario Implementasjon av forretningsregler i regelmotor Test av forretningsregler med bruk av FitNesse Ingen faktisk bruk av FitNesse for å endre eller legge til testtilfeller Utfordringer Å utvikle tester og kjøre disse lokalt tok lang tid En kjøring på CI-server kunne ta 2-3 timer Alltid en eller flere tester som var brukket på CI Endring var tungt
Til funksjonell enhetstest Løsning Bruke testverktøy integrert med regelmotor Kjøring av tester på egen CI-server Migrere tester fra FitNesse til brunit Effekt Å utvikle tester og kjøre disse lokalt tok kort tid En kjøring på CI-server tok 1 minutt! Skjeldent at tester feilet på CI Endring var lett
Funksjonell test - tips Ikke lag en Fitnesse test pr funksjonelt krav, vedlikeholdskostnaden vil bli enorm Test avansert funksjonalitet uten infrastruktur, test infrastruktur med enkel funksjonalitet * Integrerer automatisk funksjonell akseptansetest i utviklingsmiljø og på CI-server Inkluder en stub-arkitektur som tillater kjøring av akseptansetester når integrasjonspunkter er nede * Sitat Johannes Brodwall
Test av brukergrensesnittet http://www.flickr.com/photos/arthur-caranta/3061093760
Mange tester Verifiserte brukerhistorier i detalj Brukt som akseptansetest Serverfarm for å få ned kjøretid på GUI-tester Alltid en eller flere tester som feilet Blame game når en GUI-test feilet
En stor test Smoke test av applikasjonen Ikke brukt som akseptansetest Ble kjørt av utviklere før innsjekk av kode Holdt applikasjonen stabil for utvikling
Test av brukergrensensittet - tips Ikke lag en GUI test pr funksjonelt krav, vedlikeholdskostnaden vil bli enorm Test solskinnshistorier. Unntak bør testes i raske funksjonelle tester Definer maks kjøretid for testene, og optimaliser testsettet når maks kjøretid er nådd Design applikasjonen slik at det er lett for tester å benytte den
o m e Hva får du av staten når du går av d g o r e l p m med pensjon? e s k E Eksempel på test av kode for beregning av alderspensjon http://www.nav.no/binary?id=331164&download=true
Valg av testverktøy Muligheter Watir/Cucumber FitNesse JUnit Konsekvenser Skrive ruby for test gjennom brukergrensesnittet? Skrive fixturekode for fit-tabeller? Skrive junit-tester? Hva har vi (utviklere) mest lyst til? Håndsopprekning!
JUnit vant!
Men, kunden snakker ikke Java... Sergey Rusakov - Fotolia.com
Det finnes løsninger Bruk av forretningsterminologi i koden Tester som uttrykker forretningskrav Eksempler relatert til forretningskrav Ett rapportverktøy som trekker ut relevante krav og eksempler, men finnes det? tiero - Fotolia.com
b c o D B i g d i r h t ng p a g e
BDoc #1 Primærverktøy når kunden ønsker å overlate utforming av tester og eksempler til utviklere, men samtidig ønsker innsyn Sekundærverktøy når kunden selv ønsker å definere tester, men ikke alle Er utvikleren sin letteste ryggesekk når det gjelder dokumentering av implementerte krav
BDoc #2 Analyserer JUnit-tester for brukerhistorier, krav og eksempler Produserer en javadoc-like rapport for brukerhistorier Designet med tanke på integrasjon med Maven Admin på BDoc: Per Otto Bergum Christensen
D O M E http://www.perottobergumchristensen.com/pensjonsberegning/site/bdoc
QA av BDoc rapport * Beregning av alderspensjon Spesifikasjonene var ikke 100% riktig Regler for opptjening til grunnpensjon var utelatt Pensjonsprosent så ikke riktig ut Dobbelsjekk med fagekspert angående pensjonsprosenten: Regler for pensjonsprosent var muligens riktig, men ikke sånn vi pleier å gjøre det QA gjennom bdoc-rapport avdekket feil og egne tolkninger hos utvikler angående regler, før applikasjonen var testet ved faktisk bruk *QA: Johannes Brodwall (takk skal du ha:)
Noen avsluttende ord om test
Ikke lag tester som ligner på dette... Perry Gerenday Photography
Følg enkle regler for testing Bruk riktig verktøy. Ideelt sett de verktøy som tilhører teknologien Skap bevissthet om feil i systemet Rett brukne tester når de oppstår Skriv om eller kast skjøre tester Ikke aksepter at kjøretid går fra minutter til timer Bruk tid på å etablere og rafinere praksis Det er lov å teste manuelt Invester i gode JUnit tester!
Bergum Christensen Consulting