Oppførselen til et objekt er hva man til enhver tid kan be det om å gjøre og hvordan det påvirker objektets tilstand, og testing gjøres for å sjekke at oppførselen er implementert slik det er ment.

De fleste former for testing av oppførsel er basert på eksempler på riktig (eller gal) oppførsel. Siden en sjelden kan sjekke at noe alltid er tilfelle, må en istedet sjekke representative tilfeller. Teknikken består i å rigge opp en eller flere objekter i en start-tilstand og så se hvordan et eller flere av objektene oppfører seg når metoder kalles. Oppførselen sjekkes mot fasiten, altså forventet oppførsel, og avvik rapporteres som feil. Oppførselen til metoder som beregner verdier kan sjekkes direkte, mens oppførselen til metoder som endrer tilstanden må sjekkes indirekte, ved at tilstanden leses ut i etterkant.

Ta som eksempel oppførselen som er illustrert i Tilstand og oppførsel og vist under til venstre. Slike tilstandsdiagrammer er relativt rett frem å oversette til testkode: En rigger først opp objektene i start-tilstanden, ved å opprette objektene og sette attributtene. Så utføres kallet på en av transisjonene før en sjekker at tilstanden etterpå er slik diagrammet krever. Dersom tilstanden er feil så rapporteres dette, ellers så fortsetter en med denne tilstanden som utgangspunkt for videre testing. Denne teknikker er brukt i testkoden under til høyre.

Oppførselen til count()Countercounter = 1end = 3Countercounter = 2end = 3Countercounter = 3end = 3getCounter() => 1count()getCounter() => 2count()getCounter() => 3count()
Testing av oppførselen til count()
Counter counter = new Counter(1, 3);
if (getCounter() != 1) {
	throw new IllegalStateException("Expected that counter was 1, but actually it was " + getCounter());
}
counter.count();
if (getCounter() != 2) {
	throw new IllegalStateException("Expected that counter was 2, but actually it was " + getCounter());
}
counter.count();
if (getCounter() != 3) {
	throw new IllegalStateException("Expected that counter was 3, but actually it was " + getCounter());
}
counter.count();
if (getCounter() != 3) {
	throw new IllegalStateException("Expected that counter was 3, but actually it was " + getCounter());
}

 Det er et par som er verdt å kommentere:

  • Vi kan ikke teste end-attributtet, siden det ikke finnes noen getter for denne verdien. Denne testes implisitt når en kommer til siste tilstand og counter-verdien forblir den samme.
  • getCounter() testes ikke eksplisitt, men brukes til å teste count(), siden slike enkle getter-metoder er banale å implementere.
  • Med utgangspunkt i én start-tilstand, så kan en sjekke en sekvens av tilstander. Men dersom en tilstand har flere transisjoner til nye tilstander, så må en får en ikke testet alle alternativer uten å måtte rigge opp objektene på nytt.

Nedenfor vises oppførselen til en alternativ count-metode, hvor argumentet angir hvor langt det skal telles. Siden vi her har en forgreining, må vi teste ulike sekvenser for seg, ved å rigge opp start-tilstanden på nytt. Dette illustrerer også problemet med å teste metoder som tar argumenter: En må jo egentlig prøve alle mulige verdier for å sjekke at oppførsel er riktig for dem alle, og dette er i praksis umulig.

Oppførselen til count(int)Countercounter = 1end = 3Countercounter = 2end = 3Countercounter = 3end = 3count(1)count(1)count(2) count(2)
Testing av oppførselen til count(int)
Counter counter = new Counter(1, 3);
counter.count(1);
if (getCounter() != 2) {
	throw new IllegalStateException("Expected that counter was 2, but actually it was " + getCounter());
}
counter.count(1);
if (getCounter() != 3) {
	throw new IllegalStateException("Expected that counter was 3, but actually it was " + getCounter());
}
// test other path
counter = new Counter(1, 3);
counter.count(2);
if (getCounter() != 3) {
	throw new IllegalStateException("Expected that counter was 3, but actually it was " + getCounter());
}
// test yet another path
counter = new Counter(2, 3);
counter.count(2);
if (getCounter() != 3) {
	throw new IllegalStateException("Expected that counter was 3, but actually it was " + getCounter());
}