Turbine für Kotlin: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Turbine für Kotlin: Vollständige Anleitung zum Testen von Flow

1. Was ist Turbine und warum wird es benötigt?

Die Bibliothek Turbine ist ein modernes Werkzeug zum Testen von Coroutine-Datenströmen (Flow) in Kotlin. Entwickelt von Cash App, löst Turbine eines der schmerzhaftesten Probleme beim Schreiben von Unit-Tests für asynchronen Code: die komplexe Überprüfung von Emissionen aus einem Flow, die Fehlerbehandlung und die Überprüfung des Stream-Abschlusses. Im Gegensatz zu Standardansätzen wie der manuellen Sammlung von Elementen mit kotlinx-coroutines-test bietet Turbine eine deklarative und intuitive API, die Tests lesbar und zuverlässig macht.

Warum Turbine? Stellen Sie sich vor, Sie schreiben eine ViewModel, die ein Repository abonniert und Daten in einen UI-Status umwandelt. Ohne Turbine müssten Sie manuell Collectors erstellen, Jobs verwalten und Coroutinen synchronisieren. Turbine automatisiert diesen Prozess: Es erstellt eine virtuelle Coroutine, sammelt alle Emissionen in einer "Turbine" (daher der Name) und ermöglicht es Ihnen, jeden Wert der Reihe nach zu überprüfen, während unwichtige Zwischenzustände ignoriert werden. Dies ist besonders nützlich beim Testen von BehaviourSubject-ähnlichen Streams, bei denen nur der Endzustand zählt.

Zu den Hauptfunktionen der Bibliothek gehören: Überprüfung emittierter Werte in strenger Reihenfolge, Ignorieren von Zwischenwerten mit skip(), Testen von Fehlern mit awaitError(), Überprüfung des Stream-Abschlusses mit awaitComplete() sowie die Arbeit mit Kanälen (Channel) und StateFlow. Turbine integriert sich in jedes Test-Framework (JUnit, Kotest, Spek) und erfordert keine zusätzliche Konfiguration – fügen Sie einfach die Abhängigkeit hinzu und verwenden Sie testScope.

2. Installation

Um Turbine in Ihrem Projekt zu verwenden, fügen Sie die folgende Abhängigkeit in Ihre build.gradle.kts (oder build.gradle) Datei ein:

// build.gradle.kts
dependencies {
    // Für JVM-Projekte
    testImplementation("app.cash.turbine:turbine:1.1.0")
    
    // Wenn Sie kotlinx-coroutines-test verwenden (empfohlen)
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
}

// Für Android-Projekte (im android-Block)
android {
    testOptions {
        unitTests.isReturnDefaultValues = true
    }
}

Für Maven:

<dependency>
    <groupId>app.cash.turbine</groupId>
    <artifactId>turbine</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>

Mindestanforderungen: Kotlin 1.9+, kotlinx-coroutines 1.8+. Die Bibliothek unterstützt JVM, Android, JS und Native (über Kotlin Multiplatform).

3. Schnellstart

Betrachten wir ein einfaches Beispiel: Testen eines Flow, der drei Zahlen emittiert.

import app.cash.turbine.test
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.Test

class SimpleTurbineTest {

    @Test
    fun `test flow emits three values`() = runTest {
        val flow = flowOf(1, 2, 3)

        flow.test {
            // awaitItem() wartet auf die nächste Emission und gibt sie zurück
            assertEquals(1, awaitItem())
            assertEquals(2, awaitItem())
            assertEquals(3, awaitItem())

            // awaitComplete() prüft, ob der Stream fehlerfrei abgeschlossen wurde
            awaitComplete()
        }
    }
}

Führen Sie diesen Test aus – er wird erfolgreich sein. Beachten Sie: test ist eine suspend-Funktion, die das Sammeln des Streams in einer separaten Coroutine startet. Alle Aufrufe von awaitItem() blockieren die aktuelle Coroutine, bis das nächste Element erscheint. Wenn der Stream früher endet als erwartet, schlägt der Test mit einer verständlichen Fehlermeldung fehl.

4. Hauptmethoden/Funktionen/

Empfehlungen