Kotlin Academy · Oppitunti

Korreutiinien testaus

Testaa suspend-funktioita

Oppitunti 4/413 vaihetta

Korreutiinien testaus on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Miksi korutiinien testaaminen on erityistä?

Korutiinit suoritetaan asynkronisesti, ja ne voivat käyttää viiveitä. Testit tarvitsevat hallittua aikaa sekä tavan odottaa suspend-funktioiden valmistumista.

kotlinx-coroutines-test-kirjasto tarjoaa juuri nämä ominaisuudet.

Testikirjaston lisääminen

Lisätkää korutiinien testausartefakti testiriippuvuuksiinne.

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

runTest

runTest on lähtökohta. Se suorittaa korutiinitestin rungon ja odottaa automaattisesti kaikkien alikoruutiinien valmistumista.

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

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

Virtuaalinen aika

runTest-lohkon sisällä delay-kutsut ohitetaan käyttämällä virtuaalista aikaa. Kymmenen sekunnin viive valmistuu välittömästi, mutta suoritusjärjestys säilyy.

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

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

Ajan siirtäminen manuaalisesti

Testien ajastimen avulla voitte siirtää aikaa hallitusti käyttämällä advanceTimeBy-funktiota ja suorittaa odottavan työn runCurrent-funktiolla.

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

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

Testien dispatcherit

StandardTestDispatcher asettaa korutiinit jonoon, kunnes siirrätte aikaa eteenpäin. UnconfinedTestDispatcher suorittaa ne heti. Valitkaa dispatcher tarvitsemanne hallinnan mukaan.

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

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

Dispatcherin injektoiminen

Tuotantokoodin pitäisi ottaa dispatcher vastaan sen sijaan, että se määrittäisi Dispatchers.IO-dispatcherin kiinteästi. Testit voivat silloin injektoida test dispatcher -dispatcherinsa.

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" }
}

Dispatchers.Mainin korvaaminen

Android-tyylisessä koodissa vaihtakaa Main-dispatcher testikäyttöön komennolla Dispatchers.setMain(testDispatcher) ja palauttakaa se ennalleen sen jälkeen.

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()

Suspend-funktion testaaminen

Suspend-funktiota voi kutsua ja sen toiminnan voi tarkistaa suoraan runTest-lohkon sisällä.

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())
// }

Flow-virtojen testaaminen

Kerätkää Flow-virta ja tarkistakaa sen lähettämät arvot. Turbine-kirjasto tekee flow-virtojen testaamisesta erityisen sujuvaa.

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)
// }

Suoritettava korutiiniesimerkki

Testien ulkopuolella runBlocking yhdistää suspend-koodin tavalliseen main-funktioon. Tämä havainnollistaa testattavaa suspend-funktiota.

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

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

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

Pikatarkistus

Suspend-funktio kutsuu funktiota delay(5000). Miksi runTest-funktiota käyttävä testi valmistuu lähes välittömästi?

Kertaus

Osaatte testata korutiineja luotettavasti:

  • runTest suorittaa suspend-koodin ja odottaa alikoruutiinien valmistumista
  • Virtuaalinen aika ohittaa viiveet; siirtäkää aikaa manuaalisesti tarvittaessa
  • Injektoikaa dispatcherit ja käyttäkää setMain-/resetMain-funktioita
  • Testatkaa flow-virtoja keräämällä ne (tai käyttämällä Turbinea)

Testing-kurssi on nyt suoritettu.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Korreutiinien testaus” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Korreutiinien testaus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Korreutiinien testaus”?

Testaa suspend-funktioita Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Korreutiinien testaus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Testien kirjoittaminen JUnit5:llä
  2. Assertiot
  3. MockK-mallinnus
  4. Korreutiinien testaus
← Takaisin: Kotlin Academy