0Pricing
Kotlin Academy · Lekcja

Testowanie korutyn

Testuj funkcje suspend

Testowanie korutyn to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Dlaczego testowanie korutyn jest szczególne

Korutyny działają asynchronicznie i mogą używać opóźnień. Testy potrzebują kontrolowanego czasu oraz sposobu na oczekiwanie na zakończenie funkcji zawieszających.

Biblioteka kotlinx-coroutines-test zapewnia dokładnie te możliwości.

Dodawanie biblioteki testowej

Należy dodać artefakt testowy korutyn do zależności testowych.

dependencies {
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1")
}

runTest

runTest jest punktem wejścia. Uruchamia treść testu korutynowego i automatycznie czeka na zakończenie wszystkich korutyn potomnych.

import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Test

class FetchTest {
    @Test
    fun fetches() = runTest {
        // suspend calls allowed here
    }
}

Czas wirtualny

Wewnątrz runTest wywołania delay są pomijane dzięki użyciu czasu wirtualnego. Opóźnienie wynoszące 10 sekund kończy się natychmiast, przy zachowaniu kolejności operacji.

import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest

// runTest {
//     delay(10_000) // returns immediately
// }

Ręczne przesuwanie czasu

Harmonogram testów pozwala celowo przesuwać czas za pomocą advanceTimeBy oraz uruchamiać oczekujące zadania za pomocą runCurrent.

import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent

// runTest {
//     launch { delay(1000); println("done") }
//     advanceTimeBy(1000)
//     runCurrent()
// }

Dispatchery testowe

StandardTestDispatcher umieszcza korutyny w kolejce do momentu przesunięcia czasu. UnconfinedTestDispatcher uruchamia je natychmiast. Należy wybrać dispatcher zależnie od potrzebnej kontroli.

import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.UnconfinedTestDispatcher

val standard = StandardTestDispatcher()
val unconfined = UnconfinedTestDispatcher()

Wstrzykiwanie dispatchera

Kod produkcyjny powinien przyjmować dispatcher zamiast używać na stałe Dispatchers.IO. Testy mogą wtedy wstrzykiwać dispatcher testowy.

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class Service(private val io: CoroutineDispatcher = Dispatchers.IO) {
    suspend fun load(): String = withContext(io) { "data" }
}

Zastępowanie Dispatchers.Main

W kodzie przeznaczonym dla Androida należy zastąpić główny dispatcher za pomocą Dispatchers.setMain(testDispatcher), a następnie go zresetować.

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.test.setMain
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.StandardTestDispatcher

// Dispatchers.setMain(StandardTestDispatcher())
// ... test ...
// Dispatchers.resetMain()

Testowanie funkcji zawieszającej

Funkcję zawieszającą można wywołać i bezpośrednio sprawdzić wewnątrz runTest.

import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals

suspend fun compute(): Int { delay(1000); return 42 }

// @Test fun computes() = runTest {
//     assertEquals(42, compute())
// }

Testowanie Flow

Należy zbierać wartości emitowane przez Flow i wykonywać na nich asercje. Biblioteka Turbine szczególnie ułatwia testowanie przepływów.

import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals

// @Test fun emits() = runTest {
//     val values = flowOf(1, 2, 3).toList()
//     assertEquals(listOf(1, 2, 3), values)
// }

Uruchamialny fragment kodu korutynowego

Poza testami runBlocking łączy kod zawieszający ze zwykłą funkcją main. Ten przykład pokazuje testowaną funkcję zawieszającą.

import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.delay

suspend fun compute(): Int { delay(100); return 42 }

fun main() = runBlocking {
    println(compute())
}

Szybkie sprawdzenie

Funkcja zawieszająca wywołuje delay(5000). Dlaczego test używający runTest kończy się niemal natychmiast?

Podsumowanie

Można już niezawodnie testować korutyny:

  • runTest uruchamia kod zawieszający i czeka na korutyny potomne
  • Czas wirtualny pomija opóźnienia; w razie potrzeby można przesuwać go ręcznie
  • Należy wstrzykiwać dispatchery oraz używać setMain/resetMain
  • Przepływy można testować przez zbieranie wartości (lub za pomocą Turbine)

To kończy kurs testowania.

Często zadawane pytania

Czy lekcja „Testowanie korutyn” jest bezpłatna?

Tak — pełny tekst „Testowanie korutyn” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Testowanie korutyn”?

Testuj funkcje suspend Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Testowanie korutyn”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pisanie testów z JUnit5
  2. Asercje
  3. Mockowanie z MockK
  4. Testowanie korutyn
← Powrót do Kotlin Academy