Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

 

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
titleFørste versjon av Counter-klassen
linenumberstrue
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
titleTest-klasse for Counter-klassen
linenumberstrue
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
titleEndelig versjon av Counter-klassen
linenumberstrue
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, og testCount() for å teste count()-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å :