Możliwości JUnit 5

JUnit5 to framework nowej generacji do testów jednostkowych, który oferuje wiele ciekawych funkcji, takich jak np. testy parametryzowane, wstrzykiwanie zależności, całkowite wsparcie dla Javy 8, czy w końcu nowe API, umożliwiające łatwiejsze niż kiedykolwiek rozszerzanie możliwości frameworka i dostosowanie go do potrzeb projektowych. Pokażę kilka ciekawych rozwiązań, które aktualnie są wykorzystywane w projektach testowych.
JUnit5 vs JUnit4
Najpierw przedstawię Wam porównanie nowej i starej biblioteki.
Unit 4 to monolit. Jeden plik JAR (ang. Java Archive), który zawiera całą bibliotekę między innymi:
- klasy odpowiedzialne za wyszukiwanie testów,
- klasy odpowiedzialna za uruchamianie testów,
- klasy zawierające API do pisania testów (np.
@Testczy implementacje asercji).
JUnit 5 to niezależne komponenty:
- platforma do uruchamiania testów: JUnit Platform,
- API używane do pisania testów: JUnit Jupiter,
- API używane do uruchamia testów napisanych w starszych wersjach JUnit na platformie JUnit 5: JUnit Vintage.
W swojej codziennej pracy używa się JUnit Jupiter, czyli samego API, które pozwala na tworzenie testów. To właśnie JUnit Jupiter zawiera adnotacje, który są niezbędne w trakcie pisania testów. W trakcie uruchamiania testów pośrednio używa się też JUnit Platform, na przykład uruchamiając testy w IDE.
Co nowego ?
Adnotacje
Adnotacje Junit4 vs Junit5:
@BeforeClass–>@BeforeAll@Before–>@BeforeEach@After–>@AfterEach@AfterClass–>@AfterAll
Podstawowe adnotacje używane w testach pochodzą z pakietu org.junit.jupiter.api i są to:
@BeforeAll- metoda oznaczona tą adnotacją będzie wykonana przed wszystkimi innymi metodami w klasie@BeforeEach- metoda oznaczona tą adnotacją będzie wykonana przed każdym kolejnym testem@Test- właściwa metoda testowa@AfterEach- metoda oznaczona tą adnotacją będzie wykonana po każdym kolejnym teście@AfterAll- metoda oznaczona tą adnotacją będzie wykonana po wszystkich innych metodach w klasie
Inne przydatne adnotacje:
@DisplayName- pozwala na dostosowanie wyświetlanej nazwy testu@Disabled- wyłącza test@RepeatedTest- wykonuje test konfigurowalną liczbę powtórzeń@Tag- pozwala na tagowanie testów

Asercje
Do podstawowych asercji należą: assertEquals, assertArrayEquals, assertSame, assertNotSame, assertTrue, assertFalse, assertNull, assertNotNull, assertLinesMatch, assertIterablesMatch.

Ciekawostką są asercje grupowe Assert all
Assertions.assertAll weryfikuje, czy żadna z grupy asercji nie kończy się wyjątkiem:


Testowanie wyjątków
W odróżnieniu od JUnit 4, JUnit 5 nie pozwala na określenie oczekiwanego wyjątku w elemencie adnotacji @Test. W nowym podejściu użyte są wyrażenia lambda. Kod, który ma rzucić wyjątek, powinien implementować interfejs funkcyjny Executable. W najprostszym przypadku jest to wyrażenie lambda.
Metoda assertThrows przyjmuje klasę wyjątku, który powinien być rzucony implementację interfejsu, która powinna ten wyjątek rzucić:

assertThrows zwraca instancję wyjątku, który został rzucony.
Wspracie dla Springa
Zdarzyło Ci się kiedykolwiek mieć do czynienia z sytuacją, w której musiałeś wdrożyć testy jednostkowe dla komponentów Spring z samym JUnitem? Ustrojstwo, prawda???? Aktualnie zaimplementowane jest kompletne wsparcie dla Springa.
Testy równoległe
JUnit 5 posiada również wsparcie do testów równoległych, co umożliwia nam znaczące skrócenie czasu wywoływania naszych testów. Aby włączyć wykonywanie równoległe, wystarczy ustawić parametr konfiguracyjny junit.jupiter.execution.parallel.enabled na true w pliku junit-platform.properties.
Po włączeniu właściwości wykonywania testów równoległych, silnik JUnit Jupiter wykona testy równolegle zgodnie z dostarczoną konfiguracją z zadeklarowanymi mechanizmami synchronizacji.
Szczegóły dotyczące konfiguracji i synchronizacji można znaleźć w oficjalnej dokumentacji JUnit 5.
Wsparcie dla raportów Allure
Raport Allure to świetne rozwiązanie do raportowania automatyzacji testów.
Adnotacje Allure takie jak @Epic, @Feature, @Story i @Description powodują, że czytanie naszego testu jest bardziej zrozumiałe. Możemy również wprowadzić dodatkowe pola jak @Step (krok naszego testu) lub dodać załączniki i screenshoty z naszego testu.