author-avatar
Dominik Martyniak
Spring Boot Test 10 minut

Spring Boot Test: Wprowadzenie do podstaw testowania w Spring Boot

Testowanie oprogramowania jest kluczowym elementem każdego procesu rozwoju aplikacji. Dzięki skutecznym testom, deweloperzy mogą zapewnić, że ich kod będzie działał poprawnie w różnych sytuacjach, co jest niezbędne dla tworzenia niezawodnych i wydajnych systemów. Spring Boot, będąc jednym z najpopularniejszych frameworków do tworzenia aplikacji Java, oferuje bogate możliwości testowania, które ułatwiają i przyspieszają pracę programistów. W tym artykule przyjrzymy się, jak wykorzystać Spring Boot Test, aby zwiększyć skuteczność testowania w naszych projektach.

Kod do repo na koncu artykułu


Spring Boot Test - Co to jest?

 

Spring Boot Test to moduł w ekosystemie Spring, który ułatwia testowanie aplikacji napisanych przy użyciu Spring Boot. Dostarcza on szereg narzędzi i adnotacji, które pozwalają na łatwe konfigurowanie i uruchamianie testów jednostkowych i integracyjnych. Dzięki integracji z popularnymi bibliotekami takimi jak JUnit, Mockito, czy Hamcrest, Spring Boot Test staje się potężnym narzędziem w rękach deweloperów.

 

Jak zacząć testować w Spring Boot?

 

Aby rozpocząć testowanie w Spring Boot, należy najpierw skonfigurować środowisko testowe. Spring Boot Test automatycznie konfiguruje wiele aspektów aplikacji, dzięki czemu można szybko przystąpić do pisania testów. Warto zacząć od prostych testów jednostkowych, które skupiają się na pojedynczych komponentach aplikacji. Następnie można przejść do bardziej złożonych testów integracyjnych, które testują interakcje między komponentami lub nawet całe procesy biznesowe.

Wejdzmy na knowle.pl i spróbujmy rozwiąc jedo zadanie a dodatkowo dodać test jednostkowy:

Sprawdzanie Długości Tekstu

W wpisie przedstawie metodę pozwalającą na sprawdzenie liczby znaków w tekście. Taka funkcjonalność może być przydatna w wielu sytuacjach, na przykład gdy musimy upewnić się, że nasz tekst nie przekracza określonej liczby znaków w formularzach internetowych, wiadomościach lub dokumentach.

package pl.devset.tutorial.services;

import org.springframework.stereotype.Service;

@Service
class TextAnalyzerService {

    int getTextLength(String text) {
        return text.length();
    }
}

Wykorzystamu tutaj api klasy String i metode length(); która zwraca długośc znaków.

Konfiguracja testu z wykorzystaniem Spring Boot Test

 

Zacznijmy od prostego przykładu. Załóżmy, że mamy klasę CalculatorService, która oferuje podstawowe operacje matematyczne. Aby przetestować tę klasę, możemy użyć następującej konstrukcji testu z użyciem JUnit:

package pl.devset.tutorial.services;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class TextAnalyzerServiceTest {

    @Autowired
    private TextAnalyzerService toTest;


    @Test
    public void should_return_correct_test_length() {

        //given
        String textOne = "Hello World";
        String textTwo = "";
        String textThree = "!@#123";
        
        //when
        int responseOne = toTest.getTextLength(textOne);
        int responseTwo = toTest.getTextLength(textTwo);
        int responseThree = toTest.getTextLength(textThree);

        //then
        assertEquals(11, responseOne);
        assertEquals(0, responseTwo);
        assertEquals(6, responseThree);
    }

}

 

Pierwszym krokiem jest przygotowanie środowiska testowego z użyciem adnotacji @SpringBootTest. Ta adnotacja mówi frameworkowi Spring Boot, aby uruchomił pełny kontekst aplikacji, umożliwiając wstrzykiwanie zależności i pełną konfigurację serwisów potrzebnych do testów. W naszym przypadku, TextAnalyzerService jest wstrzykiwany do klasy testowej za pomocą @Autowired, co pozwala na łatwe i szybkie korzystanie z funkcji serwisu bez konieczności manualnej ich konfiguracji.

Struktura i logika testu


Test opiera się na trzech głównych etapach:

Given, When, Then, które odpowiadają za odpowiednio: przygotowanie danych, wykonanie działania oraz weryfikację wyników.

Given:

Zdefiniowane są trzy różne ciągi tekstowe, które będą analizowane:
textOne z wartością "Hello World",
textTwo jako pusty ciąg znaków,
textThree zawierający specjalne znaki i cyfry "!@#123".


When:

Wywołujemy metodę getTextLength, przekazując do niej zdefiniowane ciągi tekstowe, co pozwala nam otrzymać odpowiedzi responseOne, responseTwo oraz responseThree.


Then:

Za pomocą assertEquals sprawdzamy, czy zwrócone długości tekstów są zgodne z oczekiwaniami: 11 dla "Hello World", 0 dla pustego ciągu, 6 dla ciągu ze specjalnymi znakami.

 

Dobre praktyki w nazywaniu metod testowych w Spring Boot Test


Jednym z kluczowych aspektów pisania czytelnego i łatwego do zrozumienia kodu testowego, szczególnie w przypadku testowania w Spring Boot, jest odpowiednie nazywanie metod testowych. W kontekście Spring Boot Test, zaleca się stosowanie konwencji nazewnictwa, która od razu informuje o przeznaczeniu testu. Użycie podkreślników (_) oraz opisowych fraz w nazwach metod testowych w Spring Boot Test jest przykładem takiej praktyki.

Przykład dobrej praktyki nazewnictwa w Spring Boot Test

Nazwa metody should_return_correct_test_length w Spring Boot Test jest przykładem dobrej praktyki. Jest ona zarówno opisowa, jak i bezpośrednio wskazuje, co test sprawdza:

should_return_correct_test_length – taka nazwa metody w Spring Boot Test od razu mówi testerowi i innym programistom co dana metoda testuje. W tym przypadku sprawdzamy, czy metoda getTextLength zwraca prawidłową długość tekstu dla różnych wejściowych ciągów znaków.
Zalety używania opisowych nazw w Spring Boot Test


Używanie takich nazw ma kilka istotnych zalet w kontekście Spring Boot Test:

  • Czytelność – Nazwy są czytelne i łatwo jest zrozumieć, co dany test sprawdza, nawet bez zagłębiania się w szczegóły implementacji.
  • Łatwość utrzymania – W przypadku potrzeby modyfikacji testów w Spring Boot, łatwiej jest zlokalizować odpowiednie metody odpowiadające konkretnym funkcjom czy błędom.
  • Dokumentacja – Opisowe nazwy metod działają jak dokumentacja, wyjaśniając cel i zakres testu, co jest szczególnie przydatne w dużych zespołach developerskich pracujących z Spring Boot.


Ciekawostka w spring boot test:

Dostęp do metod protected w testach
Warto zwrócić uwagę, że metoda getTextLength jest zadeklarowana jako protected. W normalnych warunkach dostęp do takich metod jest ograniczony do klas w tym samym pakiecie oraz klas dziedziczących. Nasze testy, znajdujące się w tym samym pakiecie pl.devset.tutorial.services co testowany serwis, mogą bez problemu wywoływać metodę getTextLength. Jest to przydatne w przypadkach, gdy chcemy zachować enkapsulację naszych serwisów, jednocześnie nie ograniczając możliwości ich testowania.

 

Uruchamianie i weryfikacja spring boot test

 

Po skonfigurowaniu i napisaniu testu jednostkowego, przyszedł czas na jego uruchomienie. Testy w Spring Boot można uruchomić za pomocą Gradle, co jest standardowym narzędziem budowania dla wielu projektów Java, w tym również dla aplikacji Spring Boot.

Aby uruchomić testy, wystarczy wykonać polecenie w linii komend, gradle test które uruchomi proces budowania i testowania. Poniżej znajduje się przykład wyniku takiego procesu, który pokazuje, że wszystko się skompilowało i testy jednostkowe zostały z powodzeniem wykonane:

BUILD SUCCESSFUL in 4s
4 actionable tasks: 4 executed
15:45:07: Execution finished ':test'.

Jest to potwierdzenie, że test should_return_correct_test_length został przeprowadzony pomyślnie. Wynik "BUILD SUCCESSFUL" mówi nam, że proces kompilacji i testowania zakończył się sukcesem, a wszystkie zadania ("actionable tasks") zostały wykonane.

To zapewnia pewność, że nasz serwis działa zgodnie z oczekiwaniami i jest w stanie poprawnie analizować długość podanych tekstów, bez występowania błędów.

 

Podsumowanie

 

Testowanie w Spring Boot za pomocą dedykowanego modułu Spring Boot Test stanowi skuteczne narzędzie do zapewnienia jakości oprogramowania. Poprzez systematyczne i dobrze zorganizowane testy, deweloperzy mogą szybko identyfikować i naprawiać błędy, zanim jeszcze trafią do produkcji, co znacząco wpływa na stabilność i niezawodność tworzonych aplikacji.

Link do repo

2
[spring boot, spring boot test]

Więcej od Dominik Martyniak

Więcej artykułów