Mobile, QA

Kotlin – testowanie: frameworki, mockowanie, asercje. Przegląd możliwości w 2020 roku

kotlin testowanie

Poniżej przedstawiam przegląd dostępnych narzędzi do testowania w Kotlinie w 2020 roku. Patrzę przez swój pryzmat – programowania na Androida, ale informacje zawarte w artykule można wykorzystać w każdym projekcie, który jest pisany w Kotlinie.

Narzędzia możemy podzielić na trzy główne kategorie:

  1. Frameworki
  2. Mocki
  3. Asercje

1. Kotlin frameworki

JUnit4

Po prostu wystarczająco dobre do pracy. Bez żadnych fajnych funkcji. Ciągle domyślne narzędzie do testowania w świecie Androida. Przede wszystkim dlatego, że kolejna jego wersja (JUnit5) wymaga co najmniej Javy 8, która również nie jest domyślna, ponieważ wpłynęłoby to negatywnie na czas kompilacji.

JUnit5

To przyszłość! Bez problemu można mieć, w jednym projekcie, testy JUnit5 razem ze starymi testami w JUnit4. Również wszystkie pozostałe frameworki, wspomniane tutaj, będą wymagały JUnit5 do działania. Właściwie to JUnit5 jest wystarczający do osiągnięcia wszystkiego, czego potrzebujesz. Dostajesz coś, co znasz z JUnit4, plus możliwość korzystania ze wszystkich nowych funkcji. Osobiście nie potrzebuję nic więcej.

Najfajniejsze funkcje:

Zagnieżdżone testy – Pozwalają budować piękne hierarchie testów i grupować je tak jak chcesz. Na przykład możesz pogrupować testy zgodnie z zasadami BDD na GIVEN, WHEN, THEN:

assertAll – sprawdź wszystkie asercje zanim rzucisz błąd. Nie będziesz musiał powtarzać testu, żeby sprawdzić pozostałe warunki!

assertThrows – testuj rzucanie exception jak człowiek. Na końcu ze wszystkimi asercjami.

@ParameterizedTest – koniec pisania różnych scenariuszy testów metodą Copy&Paste. Poczuj moc parametrów, a dodatkowo wykorzystaj Kotlinowe data classy.

@DisplayName – w Kotlinie możesz używać zdań jako nazw, ale dzięki DisplayName możesz używać emoji! Tak, prawdopodobnie nigdy tego nie zrobisz, ale fajny bajer.

Dodatkowe informacje:

1. Żeby używać wszystkich tych błogosławieństw na Androidzie musisz dodać zewnętrzny plugin: https://github.com/mannodermaus/android-junit5.

2. JUnit5 nie używa znanych wcześniej @Rule, zamiast tego są rozszerzenia, ale przejście na nie jest bardzo proste:

Spek

Główną koncepcją Speka jest używanie zagnieżdżonych lambd. Dodatkowo promuje ona pisanie testów w stylu BDD, co jest oczywiście dobre, ale wcale ich nie potrzebujesz, żeby pisać tak testy.

Kotest

Bardzo podobne podejście do powyższego, ale Kotest daje Ci to samo i jeszcze dużo więcej!

Lista możliwych sposobów pisania testów jest długa:

2. Mockowanie

Mockito

Najpopularniejsze narzędzie do mockowania. Napisane w Javie, nic nowego, ale ciągle bardzo dobre i rozwijane narzędzie. Nawet dla projektów w Kotlinie. Dodatkowo dla Kotlina stworzono specjalną bibliotekę pomocniczą, która pozwala Ci zastąpić wywołania when, bardziej normalnym whenever:

https://github.com/nhaarman/mockito-kotlin

W gruncie rzeczy posiada wszystko czego potrzebujesz. Prawie. Nie daje pełnego wsparcie dla suspend functions. Będziesz mieć problem, gdy będziesz chciał manipulować osią czasu w zwrotce mockowanej funkcji.

Istnieje otwarty PR na obsługę supsend answers:

https://github.com/nhaarman/mockito-kotlin/pull/357

Na tę chwilę, gdy używasz Coroutines w swoim projekcie, łatwiej będzie Ci używać MockK.

MockK

Również bardzo dobre narzędzie do mockowanie, ale przede wszystkim napisane całkowicie w Kotlinie.

MockK ma dwie główne zalety w porównaniu do Mockito:

  1. Wspiera suspend functions
  2. Działa z Kotlin Multiplatform

W związku z tym wybieram MockK jako moje podstawowe narzędzie w każdym nowym projekcie.

3. Asercje

Tutaj lista potencjalnych narzędzi jest bardzo długa. Przykłady wykorzystania oddadzą więcej niż 1000 słów, bo tu głównie chodzi o składnie:

Kotest – tak, ci sami ludzie, co tworzą framework, mają oddzielną bibliotekę do asercji. To najbardziej popularna biblioteka do asercji:

Kluent – bardzo podobne narzędzie do poprzedniego, drugie pod względem popularności:

Strikt

Atrium

HamKrest

Expekt

AssertK

W tej grupie miałem największy problem z wyborem czegoś dla siebie. Osobiście czuję, że nie potrzebuję niczego więcej, niż to co daje JUnit w swoim pakiecie. Gdybym musiał wybrać, pewnie zdecydowałbym się na Kotest, ponieważ ładnie wygląda i jest najbardziej popularny. Popularność daje większą pewność, że będzie utrzymywany.

W mojej skromnej opinii to tylko kwestia gustu, którą bibliotekę chciałbyś wybrać.

Podsumowanie

Mam nadzieję, że pomogłem wam zrobić szybki przegląd możliwości wykorzystania narzędzi do testowania w Kotlinie. Ja używam JUnit5 i MockK bez dodatkowych bibliotek do asercji. Podziel się w komentarzu, czego używasz w swoim projekcie? Czego chciałbyś spróbować? Pamiętaj, że to testy i tutaj możesz zaszaleć z wykorzystanymi bibliotekami!


Zdjęcie główne artykułu pochodzi z unsplash.com.

Android Developer z zamiłowaniem do biznesu i zarządzania

Chce tworzyć wspaniałe produkty w szeroko pojętym obszarze mobile. Telefony komórkowe to obecnie zdalne piloty naszego życia, róbmy je dobrze! Zawsze na pierwszym miejscu stawia użytkownika – zarówno ostatecznego użytkownika aplikacji, jak i tego, który w przyszłości będzie przeglądał kod. Fanatyk czystej architektury, wyznawca SOLID, fanboy Kotlin’a.

Podobne artykuły