Enhetstesting er testing av de minste enhetene i et program, dvs. teste at metodene i en klasse implementerer ønsket oppførsel. JUnit er et praktisk rammeverk for å gjøre enhetstesting av Java–klasser. Enkelt sagt består enhetstesting med JUnit, også kalt JUnit-testing, i å lage instanser av klassen som skal testes og prøve ulike sekvenser av metodekall og sjekke om verdiene de returnerer stemmer med "fasiten". La oss ta følgende Counter
-klasse som eksempel.
...
Code Block | ||||
---|---|---|---|---|
| ||||
public class Counter { private int start, end, pos; public Counter(int start, int end) { this.start = start; this.end = end; } public int getCounter() { return this.pos; } public boolean count() { if (pos >= end) { return false; } this.pos = this.pos + 1; return true; } } |
...
Hvordan får vi så kjørt koden over, slik at vi får testet om Counter
-koden er korrekt i henhold til kravene? Koden må først legges inn i test-metoder i en test-klasse, og så må den kjøres ved hjelp av JUnit-rammeverket. En test-klasse må arve fra JUnit sin TestCase
-klasse og test-metodene må være void-metoder uten argumenter, med navn som begynner med "test". Husk å importere det du vil bruke fra
org.junit.jupiter.
Testmetodene må ha @Test over seg og ha void over seg, slik:
Code Block | ||||
---|---|---|---|---|
| ||||
public class CounterTest extends junit.framework.TestCaseimport static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; public class CounterTest { @Test public void testCounter() { Counter counter = new Counter(1, 3); assertEquals(1, counter.getCounter()); // sjekk om returverdi er 1 assertTrue(counter.count()); // sjekk om returverdi er true assertEquals(2, counter.getCounter()); // sjekk om returverdi er 2 assertFalse(counter.count()); // sjekk om returverdi er false assertEquals(3, counter.getCounter()); // sjekk om returverdi er 3 } } |
I Eclipse er det nå bare å høyreklikke på testklassen og velge Run as->JUnit Test. Da vil alle test-metodene i test-klassen bli kjørt og resultatet blir vist i et eget JUnit panel:
...
Meldingen forteller at sjekken vår i linje 6 i CounterTest.java har avdekket en feil, counter.getCounter() returnerte 0, mens den forventede verdier var 1! Hvis vi ser nærmere på koden, så ser vi at vi har glemt å initialisere pos-variabelen til start-verdien. Derfor startet den på 0 istedenfor 1. Dersom vi endrer linje 4 i Counter.java til this.til pos = start;
og kjører på nytt, så skal feilen være fikset:
...
Code Block | ||||
---|---|---|---|---|
| ||||
public class Counter { private int pos, end; public Counter(int start, int end) { this.pos = start; this.end = end; } public int getCounter() { return this.pos; } public boolean count() { if (pos < end) { this.pos = this.pos + 1; } return this.pos < end; } } |
Denne gangen kjører testen uten feil og vi har (større) grunn til å tro at Counter
-klassen er implementert i henhold til kravene.
...
- I dette eksemplet har vi kun testet klassen vår med ett sett test-data og dette er sjelden nok til å finne alle feil. Dersom vi f.eks. hadde instansiert med new Counter(0, 2), så hadde ikke den første feilen blitt oppdaget, siden default-verdien tilfeldigvis var riktig! Derfor er det lurt å teste med sannsynlige, usannsynlige og gjerne tilfeldige verdier.
- Det er vanlig å strukturere koden i mange små test-metoder, som hver tester kun ett krav. I dette tilfellet kunne vi laget to test-metoder, f.eks.
testCounter()
for å teste konstruktøren, ogtestCount()
for å testecount()
-metoden. Ved kjøring vil begge test-metodene bli utført og vi kan avdekke flere feil på en gang. Det vil dessuten ofte være praktisk å skrive private hjelpemetoder for å gjøre test-metodene ryddigere.
...
Les også :