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.
@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
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.