Samouczek JUnit5

Samouczek JUnit5: Kompletny przewodnik do frameworka testowania w języku Java

Wprowadzenie

JUnit5 to popularny framework testowania w języku Java, który umożliwia programistom pisanie, uruchamianie i utrzymywanie testów w ramach ich projektów. Jest rozszerzeniem poprzedniego frameworka JUnit4 i oferuje szereg nowych funkcji i ulepszeń, ułatwiających i usprawniających proces testowania.

JUnit5 jest oparty na koncepcji rozszerzalności, co umożliwia dostosowanie jego zachowania poprzez dodawanie niestandardowych rozszerzeń. Wprowadził również nowy zestaw adnotacji testowych, takie jak @DisplayName i @RepeatedTest, które zapewniają większą przejrzystość i elastyczność testów.

W tym samouczku przeprowadzimy Cię przez wszystkie aspekty JUnit5, od podstawowej konfiguracji po zaawansowane techniki testowania. Pokażemy Ci, jak pisać testy jednostkowe, testy integracyjne i testy funkcjonalne, a także jak używać rozszerzeń i dostosowywać framework zgodnie z Twoimi potrzebami.

Konfiguracja JUnit5

Aby rozpocząć korzystanie z JUnit5, musisz dodać poniższą zależność do swojego pliku pom.xml:

xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>

Możesz także dodać zależności dla innych modułów JUnit5, takich jak junit-jupiter-params (do testów parametrycznych) lub junit-jupiter-engine (do niestandardowego uruchamiania testów).

Podstawowe testy jednostkowe

Testy jednostkowe skupiają się na testowaniu pojedynczych metod lub klas w izolacji. W JUnit5 wykorzystuje się adnotację @Test do oznaczania metod testowych. Na przykład:

java
import org.junit.jupiter.api.Test;

public class CalculatorTest {

@Test
void add() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}

W tym przykładzie testujemy metodę add klasy Calculator. Adnotacja @Test oznacza metodę jako test, a assertEquals() sprawdza, czy wynik dodania jest równy 5.

Testy integracyjne

Testy integracyjne testują interakcje między różnymi komponentami systemu. W JUnit5 wykorzystuje się adnotację @ExtendWith wraz z klasą rozszerzenia, która zapewnia dodatkowe funkcjonalności. Na przykład:

java
import org.junit.jupiter.api.ExtendWith;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class ServiceTest {

@Mock
private Repository repository;

@InjectMocks
private Service service;

@Test
void save() {
service.save("test");
verify(repository).save("test");
}
}

W tym przykładzie rozszerzamy test o klasę MockitoExtension, która umożliwia nam korzystanie z biblioteki Mockito do tworzenia obiektów zastępczych. Test sprawdza, czy metoda save klasy Service wywołuje metodę save repozytorium.

Testy funkcjonalne

Testy funkcjonalne testują całe funkcje lub scenariusze w aplikacji. W JUnit5 nie ma dedykowanej adnotacji dla testów funkcjonalnych, ale możesz użyć istniejących adnotacji, takich jak @Test i @ExtendWith. Na przykład:

java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTest {

@Autowired
private MockMvc mockMvc;

@Test
void index() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}

W tym przykładzie używamy zależności Spring Boot do tworzenia aplikacji kontekstowej i automatycznego konfigurowania obiektu MockMvc do testowania kontrolerów internetowych. Test sprawdza, czy żądanie GET do adresu URL / zwraca kod stanu HTTP 200.

Rozszerzenia JUnit5

JUnit5 jest rozszerzalny, co oznacza, że możesz dodawać własne rozszerzenia, aby dostosować jego zachowanie. Rozszerzenia można tworzyć poprzez implementację interfejsu Extension. Na przykład:

java
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestInstancePostProcessor;

public class CustomExtension implements TestInstancePostProcessor {

@Override
public void postProcessTestInstance(Object testInstance, ExtensionContext context) {
// dostosowanie instancji testu
}
}

Ten rozszerzenie można zarejestrować w pliku junit-platform.properties, dodając następujący wpis:


junit.jupiter.extensions.post-processors = CustomExtension

Porównanie JUnit4 i JUnit5

JUnit5 oferuje szereg ulepszeń w porównaniu do JUnit4, w tym:

* Rozszerzalność: Możliwość dodawania niestandardowych rozszerzeń.
* Uproszczone adnotacje: Nowe adnotacje, takie jak @DisplayName i @RepeatedTest, zapewniające większą przejrzystość i elastyczność.
* Wyrażenia lambda: Obsługa wyrażeń lambda w adnotacjach testowych.
* Urządzenia adnotowalne: Możliwość adnotacji metod pomocniczych.
* Testowanie parametryczne: Ulepszone wsparcie dla testów parametrycznych.

Przykładowy projekt

Aby zobaczyć JUnit5 w akcji, zobacz przykładowy projekt na Github.

Konkluzja

JUnit5 to potężny i elastyczny framework testowy, który umożliwia programistom pisanie, uruchamianie i utrzymywanie testów w ramach ich projektów w języku Java. Jego rozszerzalność, uproszczone adnotacje i obsługa wyrażeń lambda sprawiają, że jest wygodnym i efektywnym rozwiązaniem do testowania różnego rodzaju aplikacji.

Stosując techniki omówione w tym samouczku, możesz skutecznie testować kod, zwiększać jego niezawodność i utrzymywać wysoką jakość swoich projektów w języku Java.

Często zadawane pytania

1. Czym różni się JUnit5 od JUnit4? JUnit5 oferuje rozszerzalność, uproszczone adnotacje, obsługę wyrażeń lambda, testowanie parametryczne i inne ulepszenia.
2. Jak skonfigurować JUnit5 w moim projekcie? Dodaj zależność junit-jupiter do swojego pliku pom.xml.
3. Jak utworzyć test jednostkowy w JUnit5? Użyj adnotacji @Test do oznaczania metod testowych.
4. Co to jest test integracyjny w JUnit5? Jest to test, który testuje interakcje między różnymi komponentami systemu.
5. Jak testować kontrolery internetowe za pomocą JUnit5? Wykorzystaj zależności Spring Boot do tworzenia aplikacji kontekstowej i obiektu MockMvc.
6. Co to są rozszerzenia JUnit5? Rozszerzenia JUnit5 to klasy implementujące interfejs Extension, które umożliwiają dostosowanie zachowania frameworka.
7. Jak porównać JUnit4 i JUnit5? JUnit5 oferuje rozszerzalność, uproszczone adnotacje, obsługę wyrażeń lambda i inne ulepszenia w stosunku do JUnit4.
8. Gdzie mogę znaleźć więcej informacji o JUnit5? Możesz zapoznać się z oficjalną dokumentacją oraz repozytorium na Githubie.