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:
runTesturuchamia 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
- Pisanie testów z JUnit5
- Asercje
- Mockowanie z MockK
- Testowanie korutyn