Turbine Kotlin: Flow टेस्टिंग के लिए पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Turbine Kotlin: Flow टेस्टिंग के लिए पूरी गाइड

1. यह क्या है और क्यों ज़रूरी है

Turbine लाइब्रेरी Kotlin में कोरूटीन डेटा फ्लो (Flow) को टेस्ट करने का एक आधुनिक टूल है। Cash App द्वारा डेवलप की गई यह लाइब्रेरी, एसिंक्रोनस कोड के यूनिट टेस्ट लिखने की सबसे बड़ी समस्या को हल करती है: Flow से वैल्यू एमिट होने, एरर हैंडलिंग और फ्लो के पूरा होने की जांच करना। मैन्युअल रूप से एलिमेंट इकट्ठा करने वाले kotlinx-coroutines-test जैसे पारंपरिक तरीकों के विपरीत, Turbine एक डिक्लेरेटिव और आसान API प्रदान करता है जो टेस्ट को पढ़ने लायक और विश्वसनीय बनाता है।

Turbine की ज़रूरत क्यों है? मान लीजिए आप एक ViewModel लिख रहे हैं जो रिपॉजिटरी को सब्सक्राइब करता है और डेटा को UI-स्टेट में बदलता है। Turbine के बिना आपको मैन्युअल रूप से कलेक्टर बनाने, Job मैनेज करने और कोरूटीन को सिंक करने की ज़रूरत होगी। Turbine इस प्रक्रिया को ऑटोमेट करता है: यह एक वर्चुअल कोरूटीन बनाता है, सभी एमिशन को "टर्बाइन" में इकट्ठा करता है, और फिर आपको हर वैल्यू को क्रम से जांचने देता है, बीच के अनावश्यक स्टेट को इग्नोर करते हुए। यह BehaviourSubject-जैसे फ्लो को टेस्ट करने में विशेष रूप से उपयोगी है, जहां सिर्फ अंतिम स्टेट मायने रखता है।

लाइब्रेरी की मुख्य क्षमताओं में शामिल हैं: एमिट वैल्यू को सख्त क्रम में जांचना, skip() से बीच की वैल्यू को इग्नोर करना, awaitError() से एरर टेस्ट करना, awaitComplete() से फ्लो के पूरा होने की जांच करना, और Channel और StateFlow के साथ काम करना। Turbine किसी भी टेस्टिंग फ्रेमवर्क (JUnit, Kotest, Spek) के साथ इंटीग्रेट होता है और अतिरिक्त सेटअप की ज़रूरत नहीं है — बस डिपेंडेंसी जोड़ें और testScope का उपयोग करें।

2. इंस्टॉलेशन

अपने प्रोजेक्ट में Turbine का उपयोग करने के लिए, build.gradle.kts (या build.gradle) फ़ाइल में निम्नलिखित डिपेंडेंसी जोड़ें:

// build.gradle.kts
dependencies {
    // JVM प्रोजेक्ट के लिए
    testImplementation("app.cash.turbine:turbine:1.1.0")
    
    // अगर kotlinx-coroutines-test का उपयोग कर रहे हैं (सुझाव)
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
}

// Android प्रोजेक्ट के लिए (android ब्लॉक में)
android {
    testOptions {
        unitTests.isReturnDefaultValues = true
    }
}

अगर आप Maven का उपयोग कर रहे हैं:

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

न्यूनतम आवश्यकताएं: Kotlin 1.9+, kotlinx-coroutines 1.8+। यह लाइब्रेरी JVM, Android, JS और Native (Kotlin Multiplatform के ज़रिए) को सपोर्ट करती है।

3. तुरंत शुरुआत

आइए एक सरल उदाहरण देखें: तीन नंबर एमिट करने वाले Flow को टेस्ट करना।

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() अगली एमिशन का इंतज़ार करता है और उसे लौटाता है
            assertEquals(1, awaitItem())
            assertEquals(2, awaitItem())
            assertEquals(3, awaitItem())

            // awaitComplete() जांचता है कि फ्लो बिना एरर के पूरा हुआ
            awaitComplete()
        }
    }
}

इस टेस्ट को चलाएं — यह सफलतापूर्वक पास होगा। ध्यान दें: test एक suspend-फंक्शन है जो फ्लो कलेक्शन को एक अलग कोरूटीन में शुरू करता है। सभी awaitItem() कॉल अगले एलिमेंट आने तक मौजूदा कोरूटीन को ब्लॉक करते हैं। अगर फ्लो हमारी उम्मीद से पहले पूरा हो जाता है, तो टेस्ट एक स्पष्ट एरर मैसेज के साथ फेल हो जाएगा।

4. मुख्य तरीके/फंक्शन

अनुशंसाएँ