Korreutiinien testaus
Testaa suspend-funktioita
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:
runTestsuorittaa 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.
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
- Testien kirjoittaminen JUnit5:llä
- Assertiot
- MockK-mallinnus
- Korreutiinien testaus