JUnit 5 – możliwości biblioteki w testach jednostkowych i nie tylko

JUnit5 to framework nowej generacji do testów jednostkowych 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. @Test czy 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
Jeśli kiedykolwiek miałeś do czynienia z sytuacją, w której musiałeś wdrożyć testy jednostkowe dla komponentów Spring z samym JUnitem? Ustrojstwo prawda ???? aktualnie kompletne wsparcie dla springa jest zaimplementowane
https://github.com/sbrannen/spring-test-junit5
Testy równoległe
JUnit 5 posada 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.