Kotlin wcale nie schodzi na dalszy plan, a na dzisiaj przygotowałem materiał na temat testów jednostkowych, które służą weryfikowaniu poprawności instrukcji i obliczania wyników przez funkcje. Zapraszam serdecznie jeśli chcecie wiedzieć jak przy pomocy biblioteki "JUnit" w języku Kotlin, zaprogramować test jednostkowy!

"JUNIT" W JĘZYKU KOTLIN JAKO JEDNA Z FORM WYKONYWANIA TESTÓW JEDNOSTKOWYCH

Wyjaśnijmy sobie na początek po co jest test jednostkowy. Test jednostkowy polega na sprawdzeniu poprawności działania funkcji lub klasy przy użyciu tzw. "asercji" – formy zdaniowej zwracającej prawdę lub fałsz, która przerywa działanie programu i zgłasza wyjątek w przypadku wartości fałszywej. Sama w sobie przybiera najczęściej postać funkcji, ale może być także słowem kluczowym jak w Javie (słowo "assert").

ZNOWU "GRADLE" POTRZEBNY!

Po raz kolejny należy utworzyć projekt z wbudowanym narzędziem do automatyzacji kompilacji i dołączania bibliotek, "Gradle". Cały proces tworzenia takiego projektu od zera w programie "IntelliJIDEA", został przedstawiony w artykule dotyczącym asynchronicznego wykonywania kodu. Nie będę się powtarzać.

DODANIE "ZALEŻNOŚCI" DO "BUILD.GRADLE"

Po utworzeniu projektu z "Gradle", kierujemy się do pliku "build.gradle", znajdujemy blok opatrzony nazwą "dependencies" i podajemy wszystkie następujące wpisy:

implementation 'junit:junit:4.13.2'
implementation 'org.junit.jupiter:junit-jupiter:5.8.2'

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
test { useJUnitPlatform() }

Wszystko gotowe, aby iść dalej.

PRZYKŁAD Z WYKORZYSTANIEM "JUNIT"

Ponieważ Kotlin kompiluje się między innymi do kodu bajtowego wirtualnej maszyny Javy, nie ma przeszkód żebyśmy skorzystali z popularnej biblioteki do wykonywania testów w języku Java, "JUnit". W pierwszej kolejności, utwórzmy sobie bardzo prostą klasę przechowującą metodę kalkulującą procent z dzielenia dwóch liczb całkowitych z zakresu 0-100:

import kotlin.math.roundToInt

class PercentConverter
{
	fun percentageFromZeroToOneHundred(a : Int, b : Int) : Int
	{
		val percent = a.toDouble() / b.toDouble()

		return (percent*100).roundToInt()
	}
}

Zanim przejdziemy do istoty sprawy, dwa importy będą potrzebne:

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*

Oprócz klasy, implementujemy jeszcze jedną dodatkową klasę, która posłuży nam do testów naszej klasy właściwej. Na tej części się bardziej skoncentrujemy:

class PercentConverterTest
{
	@Test
	fun shouldReturnCorrectPercentages()
	{
		val pc = PercentConverter()

		assertEquals(25, pc.percentageFromZeroToOneHundred(1, 4))
		assertEquals(13, pc.percentageFromZeroToOneHundred(1, 8))
		assertEquals(10, pc.percentageFromZeroToOneHundred(1, 10))
	}
}

Kapka wyjaśnień, tradycyjnie.

ADNOTACJA DLA TESTÓW FUNKCJI

Pierwsza ważna rzecz. Do funkcji, które traktujemy jako testy, należy dodać stosowną adnotację "@Test". To jest oznaczenie funkcji istniejącej tylko dla przeprowadzania testów. W stosunku do klas nie musimy jej stosować (a nawet nie możemy!).

ASERCJA

"assertEquals" to jeden ze sposobów przeprowadzania weryfikacji poprawności aktualnie posiadanych danych. W przypadku "JUnit" w języku Kotlin jest to funkcja zwracająca wartość logiczną, w której wprowadza się dwa parametry jako wartość oczekiwana i wartość aktualna. Podczas działania testu, gdy zwróci ona fałsz, cały program zostaje przerwany a funkcja zgłasza wyjątek wraz z zasygnalizowaniem gdzie konkretnie doszło do sprzeczności. IDE jeszcze dodatkowo informuje jaka wartość jest po jednej i po drugiej stronie celem porównania.

URUCHAMIANIE TESTU

Aby uruchomić test, bądź serię testów funkcji, wystarczy znaleźć obok kodu źródłowego ikonę zielonej strzałki i kliknąć ją. Jeśli interesuje nas sprawdzenie tylko jednej z funkcji, naciskamy strzałkę umieszczoną obok nagłówka funkcji. Jeśli chcemy sprawdzić wszystko, naciskamy strzałkę obok nagłówka klasy (jeśli funkcje mające podlegać testowaniu są umieszczone wewnątrz klasy jako metody).

Uruchamianie testu jednostkowego w "IntelliJIDEA"

W "IntelliJIDEA", można łatwo uruchomić test jednostkowy funkcji bądź całej klasy, klikając zieloną strzałkę na prawo od numeracji wierszy.

"JUnit" oferuje wiele, wiele więcej, aczkolwiek artykuł miał na celu tylko powierzchowne zaprezentowanie istoty pojęcia "test jednostkowy" oraz to, że "JUnit" w języku Kotlin także może działać bezproblemowo, mimo tego że "siedzibą" tejże biblioteki jest nadal język Java.

Adnotacja "@Test" w języku Kotlin

Adnotacja "@Test" jest informacją dla kompilatora, że funkcja jaka się znajduje poniżej to funkcja przeznaczona do testów.


Wszystko, taki mały przykład. To nie jest jedyne rozwiązanie jakim można się posłużyć do wykonywania testów jednostkowych. Można też skorzystać z "Kotest" będącego popularnym narzędziem do testowania kodu napisanego w języku Kotlin. Chciałem na ten temat wstępnie napisać, ale IDE robiło mi duże problemy z prawidłowym odczytem importowanej biblioteki.

PODOBNE ARTYKUŁY