Enhetstestning med JUnit

Introduktion till testning i Java

Maria Milusheva

Senior Software Engineer

Enhetstestning – definition

Två nyckelbegrepp:

Enhet – den minsta testbara delen av en applikation, till exempel en metod

Enhetstestning – ett test som verifierar att en enskild "enhet" av koden fungerar korrekt, isolerat från övriga delar

Introduktion till testning i Java

Enhetstestning handlar om detaljer

Att tänka på:

  • Enhetstestning handlar om små logikdelar, inte helheten

  • Andra testtyper fokuserar på helheten (t.ex. integrationstestning)

  • JUnit har fått sitt namn eftersom enhetstestning är dess primära användningsområde

En grafik som illustrerar sambandet mellan enhetstester och produktionskod

Introduktion till testning i Java

Testtyper – en kort översikt

  • I den här kursen fokuserar vi främst på enhets- och integrationstester
  • Men det finns många typer av testning!

Diagram över programvarutester, inklusive funktionell testning såsom enhetstestning och icke-funktionell testning såsom användbarhetstestning

Introduktion till testning i Java

Testtyper – en kort översikt

  • I den här kursen fokuserar vi främst på enhets- och integrationstester
  • Men det finns många typer av testning!

Diagram över programvarutester, inklusive funktionell testning såsom enhetstestning och icke-funktionell testning såsom användbarhetstestning. I denna version är enhets- och integrationstestning inringade

Introduktion till testning i Java

JUnit-syntax: assertTrue() och assertFalse()

  • assertTrue() kontrollerar att ett påstående är sant:
List<String> list = new ArrayList<>();

assertTrue(list.isEmpty()); // No error
  • assertFalse() kontrollerar det motsatta:
List<String> list = new ArrayList<>();
list.add("A");

assertFalse(list.isEmpty()); // No error
Introduktion till testning i Java

assertNull() och assertNotNull()

null-variabler kan orsaka NullPointerException!

  • Assertions som kontrollerar om en variabel är eller inte är nullassertNull() och assertNotNull()

  • Vanligt användningsfall: verifiera att ett hämtat värde inte är null

Map<String, Integer> catalogue = new HashMap<>();

catalogue.put("item1", 10);

// No errors
assertNotNull(catalogue.get("item1"));
assertNull(catalogue.get("item2"));
Introduktion till testning i Java

Assertions för undantag

Anta att vi vill verifiera att ett ArrayIndexOutOfBoundsException kastas:

public String getIndex(String[] array, int index) {
    return array[index];
}

JUnit erbjuder flera sätt att göra detta!

Introduktion till testning i Java

assertInstanceOf()

  • JUnit erbjuder assertThrows(), men det kräver avancerad Java-syntax (lambdauttryck)

  • assertInstanceOf() kan användas på följande sätt:

try {
    getIndex(new String[]{}, 4);
} catch (Exception e) {
    // Pass the expected class of the exception and the exception itself  
    assertInstanceOf(ArrayIndexOutOfBoundsException.class, e); 
}
1 https://www.baeldung.com/junit-assert-exception
Introduktion till testning i Java

Namnge enhetstester

  • Ett typiskt projekt innehåller hundratals enhetstester

  • De bör vara lättviktiga och enkla att förstå

  • De bör ha informativa namn så att det direkt framgår vad som gick fel om ett test misslyckas

Till exempel: methodUnderTest_expectedBehavior_conditions()

1 https://dzone.com/articles/7-popular-unit-test-naming?fromrel=true
Introduktion till testning i Java

Nu kör vi en övning!

Introduktion till testning i Java

Preparing Video For Download...