You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

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.

Counter er ment å implementere en teller fra en start-verdi til (men ikke med) en slutt-verdi. Hver gang vi caller count()-metoden, så skal telleren øke med 1, men bare dersom vi ennå ikke har nådd slutt-verdien. Idet slutt-verdien nås, så skal count() returnere false, ellers true. Teller-verdien får vi tak i med getCounter()-metoden.

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;
   }
}

Før vi tester Counter-klassen, må vi formulere oppførselen som testbare utsagn (regler) om metode-kall og returverdier. Et utsagt som at telleren skal økes hver gang count() kalles, holder ikke, siden telleren er en del av den private tilstanden til klassen og ikke en del av klassens metode-grensesnitt. Her er utsagn kun om konstruktøren og metodene:

  • Etter at klassen er instansiert med new Counter(start, end) skal getCounter() returnere start.
  • getCounter() skal returnere én mer for hver gang count() kalles, med mindre verdien er blitt end.
  • Det kallet til count() som gjør at getCounter() returnerer slutt-verdien, skal returnere true, ellers false.

Nå som utsagnene for oppførsel kun handler om kall til åpent tilgjengelige metoder, er det forholdsvis lett å skrive kode som tester dem. Vi instansierer rett og slett Counter-objekter og utfører sekvenser med kall og sjekker returverdier mot fasiten. JUnit-rammeverket har ferdiglagde metoder for det siste, altså å sammenligne en faktisk verdi med en forventet verdi. La oss se på testkoden for det første utsagnet over:

Counter counter = new Counter(0, 2);
assertEquals(0, getCounter());

Kallet til assertEquals sjekker om argumentene er like, det første er pr. kovensjon fasiten og det andre den faktiske (retur)verdien.

 

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;
   }
}
  • No labels