Testy jednostkowe z JUnit

Wprowadzenie do testowania w Javie

Maria Milusheva

Senior Software Engineer

Test jednostkowy – definicja

Dwa kluczowe pojęcia:

Jednostka – najmniejsza testowalna część aplikacji, np. metoda

Test jednostkowy – test sprawdzający poprawność pojedynczej „jednostki" kodu w izolacji od pozostałych części aplikacji

Wprowadzenie do testowania w Javie

Testy jednostkowe dotyczą szczegółów

Uwagi:

  • Testy jednostkowe dotyczą małych fragmentów logiki, a nie całości

  • Inne rodzaje testów obejmują szerszy obraz (np. testy integracyjne)

  • Nazwa JUnit pochodzi od głównego zastosowania – testów jednostkowych

Grafika ilustrująca zależność między testami jednostkowymi a kodem produkcyjnym

Wprowadzenie do testowania w Javie

Rodzaje testów – krótki przegląd

  • W tym kursie skupiamy się głównie na testach jednostkowych i integracyjnych
  • Istnieje jednak wiele rodzajów testów!

Diagram typów testów oprogramowania, obejmujący testy funkcjonalne (np. testy jednostkowe) oraz niefunkcjonalne (np. testy użyteczności)

Wprowadzenie do testowania w Javie

Rodzaje testów – krótki przegląd

  • W tym kursie skupiamy się głównie na testach jednostkowych i integracyjnych
  • Istnieje jednak wiele rodzajów testów!

Diagram typów testów oprogramowania, obejmujący testy funkcjonalne (np. testy jednostkowe) oraz niefunkcjonalne (np. testy użyteczności). Na tej wersji zaznaczono testy jednostkowe i integracyjne

Wprowadzenie do testowania w Javie

Składnia JUnit: assertTrue() i assertFalse()

  • assertTrue() sprawdza, czy warunek jest prawdziwy:
List<String> list = new ArrayList<>();

assertTrue(list.isEmpty()); // No error
  • assertFalse() sprawdza warunek przeciwny:
List<String> list = new ArrayList<>();
list.add("A");

assertFalse(list.isEmpty()); // No error
Wprowadzenie do testowania w Javie

assertNull() i assertNotNull()

Zmienne null mogą powodować NullPointerException!

  • Asercje sprawdzające, czy zmienna jest lub nie jest nullassertNull() i assertNotNull()

  • Typowy przypadek użycia: sprawdzenie, czy pobrana wartość nie jest null

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

catalogue.put("item1", 10);

// No errors
assertNotNull(catalogue.get("item1"));
assertNull(catalogue.get("item2"));
Wprowadzenie do testowania w Javie

Testowanie wyjątków

Załóżmy, że chcemy sprawdzić, czy zostanie rzucony wyjątek ArrayIndexOutOfBoundsException:

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

JUnit oferuje wiele sposobów na zrobienie tego!

Wprowadzenie do testowania w Javie

assertInstanceOf()

  • JUnit udostępnia assertThrows(), ale wymaga zaawansowanej składni Java (wyrażenia lambda)

  • Można użyć assertInstanceOf() w następujący sposób:

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
Wprowadzenie do testowania w Javie

Nazewnictwo testów jednostkowych

  • Typowy projekt zawiera setki testów jednostkowych

  • Powinny być lekkie i łatwe do zrozumienia

  • Powinny mieć opisowe nazwy, aby od razu wiadomo było, co poszło nie tak w przypadku niepowodzenia

Na przykład: methodUnderTest_expectedBehavior_conditions()

1 https://dzone.com/articles/7-popular-unit-test-naming?fromrel=true
Wprowadzenie do testowania w Javie

Czas na ćwiczenia!

Wprowadzenie do testowania w Javie

Preparing Video For Download...