Enhetstesting: En Dybdegående Guide
Enhetstesting er en etablert praksis innen programvareutvikling. Den hjelper utviklere med å identifisere og rette opp feil i koden på et tidlig stadium. Dette bidrar til å levere et bedre sluttprodukt til brukerne.
Det er en viktig del av utviklingsprosessen som har stor innvirkning på kvaliteten til koden.
Gjennom enhetstesting verifiseres oppførselen til koden ved å teste den med grenseverdier, standardverdier og ugyldige inndata. Testene sjekker også implisitte og eksplisitte antakelser i koden.
Enhetstesting er en detaljert prosess med flere trinn. Det er viktig å forsikre seg om at det ferdige produktet er feilfritt og fungerer i tråd med kundens forventninger før levering.
Testing før levering er avgjørende for å sikre kvaliteten og at den gjenspeiler standarden på arbeidet. Det er en verdifull ferdighet for enhver utvikler.
La oss se nærmere på hva enhetstesting innebærer og hvorfor det er så viktig for både utviklere og organisasjoner.
Hva er enhetstesting?
Enhetstesting er en fundamental del av programvareutvikling. Det fokuserer på testing av individuelle komponenter i en applikasjon. Dette gjør det lettere å oppdage feil tidlig. Hovedmålet er å sikre at hver komponent fungerer som forventet i henhold til kravene. En enhetstest kan ha flere innganger, men skal ideelt sett gi én enkelt utgang.
Når utviklere skriver kode, deles den opp i mindre, testbare enheter. Dette gjør det mulig å verifisere kildekoden. Enhetstesting tester dermed hver prosedyre, metode og funksjon. Dette gjelder både for objektorientert og prosedyrebasert programmering. Det er spesielt nyttig ved omskriving eller refaktorering av kode.
I bunn og grunn er enhetstesting en testprosedyre der en «enhet» refererer til en individuell komponent som må testes for å vurdere kvaliteten på koden.
Det finnes mange rammeverk for enhetstesting tilgjengelig for forskjellige programmeringsspråk som C, C++, Python, C#, Java og JavaScript. Eksempler inkluderer JEST, AVA, NUnit, unittest, JUnit, TestNG, Embunit og HtmlUnit.
Typer av enhetstesting
Innen programvaretesting finnes det mange metoder, hvorav enhetstesting er én. Enhetstesting deles videre inn i to kategorier. La oss utforske disse:
Manuell testing: Med manuell enhetstesting skriver utviklere kode for å teste spesifikke seksjoner. Dette gjøres ved å interagere med API-er eller programvaren direkte for å identifisere feil. Dette er en ressurskrevende og tidkrevende prosess. Den krever at noen jobber aktivt i testmiljøet. Dette kan også føre til menneskelige feil som skrivefeil eller utelatte trinn.
Automatisert testing: Her utføres testingen av maskinen ved hjelp av forhåndsskrevne testskript. Automatisert enhetstesting kan teste både enkle og komplekse sekvenser og gi konsistente resultater.
Automatisert testing er mer pålitelig og effektiv enn manuell testing. De fleste organisasjoner bruker automatisert testing i dag. Det er viktig å huske at kvaliteten på testingen avhenger av kvaliteten på de forhåndsskrevne testskriptene.
Automatisert enhetstesting er en nøkkelkomponent i kontinuerlig integrasjon og leveranse. Dette sikrer at testprosessen skaleres hver gang det legges til nye funksjoner i applikasjonen.
Hvorfor er enhetstesting viktig?
Hovedformålet med enhetstesting er å isolere alle deler av programmet. Dette gjør det mulig å teste om hver komponent fungerer som den skal uten feil. Isolasjonen av hver del gjør det enklere å identifisere eksakt hvordan koden oppfører seg i henhold til forventningene.
Noen av fordelene med enhetstesting er:
Kodekvalitet
Enhetstesting forbedrer kvaliteten på koden ved at utviklerne kan verifisere og eliminere feil før distribusjon. Den avdekker også mindre feil og bidrar til at bedre og mer pålitelig kode skrives.
Testprosessen kan føre til at utviklerne ser koden fra et annet perspektiv. Dette kan igjen inspirere til nye og bedre designideer. Det kan sammenlignes med korrekturlesing, som forbedrer den generelle kodestilen.
Smidig Utvikling
Enhetstesting bidrar til en smidigere utviklingsprosess. Når nye funksjoner legges til, kan det være nødvendig å endre allerede testet kode. Med enhetstester på plass kan man trygt refaktorere koden.
Tidlig Feiloppdagelse
Det er alltid fordelaktig å oppdage feil før integreringsprosessen. Siden utviklerne skriver testkoden, kan problemer identifiseres og rettes på et tidlig stadium. Dette sparer tid og ressurser samtidig som kodekvaliteten forbedres.
Presis Dokumentasjon
En utvikler som forstår grensesnittet til en enhet, vil kunne bruke testprogrammene til å undersøke individuelle deler av koden. Utvikleren vil også lære alle funksjonene i kodenheten og sikre at programvaren oppfører seg som forventet.
Kostnadsbesparelser
Enhetstesting fører til lavere kostnader siden feil kan oppdages og rettes på et tidlig stadium. Feil som oppdages senere i utviklingsprosessen, som ved aksepttesting eller systemtesting, er dyrere å korrigere da det krever endring i større deler av programvaren. Tidlig feilsøking sparer både tid og penger.
Enhetstestingsteknikker
Enhetstesting brukes på alle deler av programmet for å oppdage uventede feil. For å effektivisere arbeidet, brukes ofte tre testteknikker:
#1. White-Box Testing
White-box testing er også kjent som transparent- eller glass-box testing. Her kjenner testeren den interne funksjonaliteten. Testing omfatter de funksjonelle aspektene av programvareløsningen. Prosessen innebærer inndata, prosessering, planlegging av testcase og utdata eller sluttrapportering.
#2. Black-Box Testing
Black-box testing omfatter testing av brukergrensesnittet sammen med både inn- og utdata. Den fokuserer på brukerens perspektiv. Et eksempel er å teste om systemet håndterer ugyldig passordinput på riktig måte.
#3. Grey-Box Testing
Grey-box testing er semi-transparent. Dette er en kombinasjon av white-box og black-box testing. Her har brukeren delvis kjennskap til programvarens interne funksjonalitet. Dette inkluderer flere typer tester som matrisetesting, mønstertesting, regresjonstesting og ortogonal mønstertesting.
Hvordan skrive en enhetstest?
Å skrive enhetstestkode ligner utvikling av annen kode, men med noen forskjeller. Mens utviklere lager store programmer for å løse brukernes problemer, lager man enhetstestkode for å løse problemer i sitt eget program.
I praksis er utvikleren sin egen kunde under enhetstesting. Utvikleren må derfor se koden fra et kundeperspektiv og teste hver komponent for å møte de forventede kravene. Siden utvikleren også er skaperen av koden, er det enklere å identifisere endringer som kan gjøres for å forbedre resultatet.
- Først må man forstå kravene til hver kode som skal testes og gi den et passende metodenavn.
- Deretter må man bestemme testparametere og sikre at hver test gir det forventede resultatet. Unngå hierarkiske testklasser, men bruk gjerne oppsettmetoder og nestede verktøyklasser.
- Følg mønsteret «Arrange, Act, Assert» for å strukturere testen.
Gjør det samme for hver komponent av programmet. Skriv effektiv kode for å teste din egen kode. Finn problemer og identifiser kjernen i problemet raskt.
Begrensninger ved enhetstesting
Selv om enhetstesting er viktig, tar det ofte lengre tid å teste selv små kodekomponenter, spesielt i komplekse koder.
Derfor er det mulig at enhetstesting ikke oppdager alle feil i programmet. Den kan fange opp funksjonsfeil, men kan gå glipp av ytelsesproblemer, systemomfattende problemer eller integrasjonsfeil. Enhetstesting er mest effektiv når den brukes sammen med andre testmetoder.
Den største begrensningen er at den ikke kan bevise at det ikke finnes feil. Den kan kun vise tilstedeværelsen av feil, i likhet med andre typer tester. Det er viktig å føre nøyaktig oversikt over enhetstestkoden, slik at den kan brukes gjennom hele testprosessen.
Det er også vanskelig å teste alle mulige kombinasjoner av input uten automatisert testing. Det er viktig å fokusere på de større delene av programmet for å teste alle aspekter av koden, noe som kan være en krevende prosess.
De viktigste ulempene oppsummert:
- Det tar tid å skrive testcase.
- Enhetstester for eldre kode kan være vanskelig å skrive.
- Vedlikehold er nødvendig.
- Testing av GUI-kode kan være krevende.
- Den fanger ikke opp alle feil.
Enhetstesting vs. Funksjonell testing: Forskjeller
Enhetstesting og funksjonell testing er begge essensielle deler av programvaretesting. De har begge sin betydning og sine unike fordeler. Den største forskjellen er at enhetstesting utføres av utviklere, mens funksjonell testing utføres av testere under systemtesting.
La oss se på de viktigste forskjellene:
#1. Enhetstesting isolerer og tester individuelle komponenter i koden. Funksjonell testing tester hele programmets funksjoner i henhold til brukerkravene.
#2. Enhetstestkode er enklere å skrive og utføre. Den er en del av white-box testing. Hovedmålet er å teste isolerte enheter. Funksjonell testkode er mer kompleks og er en del av black-box testing. Hovedmålet er å teste hele programvarens funksjonalitet.
#3. Enhetstesting dekker forskjellige kodeområder, men krever mange testcase for å dekke hvert hjørne. Funksjonell testing krever ikke like mange testcase, og fokuserer på applikasjonsfunksjonalitet.
#4. Enhetstesting har lave vedlikeholdskostnader. Utviklere skriver koden i samme språk. Vedlikehold av funksjonell testing er mer kostbart. Testere trenger ikke det samme programmeringsspråket for å skrive koder. Testene dekker sluttbrukernes krav.
#5. Endringer i kode kan kreve endringer i enhetstestkoden. Enhetstestkode skrives i utviklingsfasen av utviklerne. Funksjonell testkode skrives av testere etter utviklingsfasen. Endringer i programvaren har ofte ikke så stor innvirkning på funksjonalitetstester.
#6. Populære verktøy for enhetstesting inkluderer Mockito, TestNG, NUnit og JUnit. Verktøy for funksjonell testing er blant annet SahiPro, UFT og Selenium.
Populære verktøy for enhetstesting
- NUnit: Et testrammeverk for .NET som lar deg skrive testskript manuelt. Det støtter også datadrevne tester.
- JUnit: En åpen kildekode testramme for enhetstester som hjelper Java-utviklere med å skrive og utføre repeterbare tester.
- TestNG: Et testrammeverk inspirert av NUnit og JUnit, med noen ekstra funksjoner. Det støtter også datadrevet og parameterisert testing.
- Jtest: Spesielt for testing av Java-programvare. Det støtter statisk kodeanalyse og sikrer feilfri koding.
- EMMA: Et verktøy for å måle og analysere Java-kodedekning. Støtter storskala programvareutvikling og iterativt arbeid.
- PHPUnit: Et testverktøy for PHP som tester små enheter av PHP-koden separat. Inkluderer fleksible påstander for enkel testing.
- unittest: Et innebygd testrammeverk for testing av Python-kode, med en enkel testkjører.
- QUnit: Et robust testrammeverk for frontend-utvikling. Populært blant utviklere av JQuery Mobile, JQuery UI og JQuery.
- Puppeteer: Et verktøy for testkjøring fra Google som gir et headless Chrome API for NodeJS-applikasjoner.
- Embunit: Et mye brukt rammeverk for enhetstesting av C- og C++-koder.
Konklusjon
Når man skriver store eller komplekse programmer, er enhetstesting avgjørende for å sjekke de minste testbare enhetene i applikasjonen. Under utviklingsprosessen skriver og kjører utviklerne testkoden for å oppdage feil.
Enhetstesting bidrar også til å sikre at endringer i koden ikke bryter applikasjonen, men snarere forbedrer kvaliteten. Med riktig enhetstesting kan man levere et utmerket sluttprodukt som oppfyller kundens forventninger.
Det er viktig å kjenne til de forskjellige typene av applikasjonstesting.