testy -Mateusz Łukaszczyk

Testy, testy, testy – Spring Boot początki

Od czego zacząłem przygodę z testami?

Początki zawsze są trudne, szczególnie jeśli się nie ma pojęcia od czego zacząć. 

Testy są jednym z najważniejszych narzędzi każdego programisty, a nie każdy je na początku swojej drogi pisze. 

Każdemu Juniorowi na początku brakuje tej umiejetności. 

Jest pewna historia, która gdzieś mi utkwiła w głowie. Do tej pory nie mogę sobie przypomnieć, gdzie ją usłyszałem.

Student podchodzi po zajęciach do prowadzącego i pyta:

„Panie Doktorze, co ja mam zrobić? Mój kod wygląda okropnie i nie działa tak jak powinien. Ma Pan jakieś wskazówki?”

Doktor odpowiedział, po czym wywiązał się krótki dialog:

– A piszesz testy?
– Nie piszę
– To zacznij pisać i daj mi znać, co się zmieniło

Student po kilku tygodniach nauki wraca do wykładowcy i znowu pyta

– Panie Doktorze piszę testy od kilku tygodni.
– I co się zmieniło?
– Mój kod wygląda ładniej, ale nadal nie działa
– To pisz więcej testów

Gdzieś z tyłu głowy mam ten dialog, więc zacząłem chłonąć wszystko, co możliwe na ten temat.

Testy jednostkowe

Testy jednostkowe są najprostszymi testami, jednak warto zadać pytanie po co je wykonywać?

Przede wszystkim testy warto wykonywać, aby w przyszłości łatwo zauważyć, gdzie wystąpił błąd. Przy programach, których napisanie zajmuje parę godzin lub parę dni mogą nie mieć aż tyle sensu. Jednak kiedy aplikacja zaczyna się rozszerzać, a jedna zmiana może spowodować błąd krytyczny, to warto wrócić do testów. 

Ten pierwszy moment, który daje satysfakcję z napisania testów, to wtedy gdy aplikacja wyrzuci błąd, a test dokładnie wskaże, gdzie dokładnie się znajduje.

Przy pisaniu testów jednostkowych warto też zwrócić uwagę na Loggery. 

Jak dla mnie jest to jedna z tych kluczowych rzeczy. Jeśli testy nie pomagają lub są napisanie nie do końca tak, jak byśmy chcieli, to loggery są kolejną opcją pokazującą, gdzie w kodzie leży błąd.

Testy Integracyjne

Testy integracyjne to testy, które łaczą dwie warstwy aplikacji.

Może to być np: klient Http wraz z implementacją w serwisie.

Lub działający kontroller ze wstrzykniętym serwisem.

Może to być również spięcie bazy danych z logiką. 

Głównie chodzi o sprawdzenie oddziaływania pewnych warstw ze sobą.

Pierwszym testem integracyjnym jest uruchomienie testu w SpringBoocie za pomocą adnotacji @SpringBootTest.

Uruchamia się wtedy cały kontekst Springa wraz z jego konfiguracją. 

W porównaniu z testami jednostkowymi, to testy integracyjne mają sprawdzać, gdzie błąd pojawia się podczas spinania całej aplikacji.

<Wrzuć tu zdjęcie mema z bootcampu>

Mock i Mockito

Na początku miałem ogromny problem z rozumieniem po co testować mocki.

Na co komu atrapa konkretnej klasy? Przecież wtedy nie testuje tego co chcę. Oszukuje sam siebie?

Teraz opisałbym pewne porównanie.

W rzeczywistości mamy przedmiot jakim jest kubek z kawą. Kubek jest reprezentacją klasy, kawa jest wypełnionymi polami w środku, a czynność picia kawy jest jego metodą.

W takim razie po co testować atrabę kubka kawy?

Można przetestować samą czynność picia kawy bez kawy. Tak naprawdę tylko przechylajac kubek.

No dobra, ale co to ma na celu? Sprawdzenie czy kubek zachowuje się tak jak powinien. Nie interesuje nas czy ma w środku kawę, czy po nachyleniu kubka kawy poczujesz jej zapach.

Mowa tutaj o samej czynności podnoszenia kubka.

W bardziej programistyczny sposób możemy opisać działanie metody, tak jakbyśmy chcieli, aby się zachowała np: za pomocą getCoffee możemy zamockować, aby dawała konkretną kawę – ten warunek zostanie spełniony. Później wywołujemy tę metodę i sprawdzamy czy faktycznie dała kawę. 

Przeczytaj również inne artykuły dotyczące programowania