Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रणाली >> Android

Proto DataStore के लिए टेस्टिंग में महारत हासिल करें: एक व्यावहारिक मार्गदर्शिका

पिछले एक लेख में, मैंने वर्णन किया था कि आप अपने एप्लिकेशन में Proto DataStore का उपयोग कैसे कर सकते हैं। मैंने वह लेख Proto DataStore का उपयोग करने में अपने अनुभव के हिस्से के रूप में लिखा था, अपने एक एप्लिकेशन में।

उसके बाद, मैं देखना चाहता था कि उस एप्लिकेशन में प्राप्त ज्ञान का उपयोग करके Proto DataStore के लिए टेस्ट लिखना कैसा होगा।

ऑनलाइन मार्गदर्शन खोजने से ज्यादा राहत नहीं मिली, इसलिए मैंने उन लोगों के लिए अपना ज्ञान साझा करने का फैसला किया जो इसकी तलाश में हो सकते हैं। सबसे खराब स्थिति में, यह मेरी संतानों के लिए होगा।

मेरी खोज में, मुझे यह लेख मिला, लेकिन यह ज्यादातर Preferences DataStore के टेस्टिंग पर केंद्रित है न कि Proto DataStore पर। यह बताता है कि:

"हालांकि, ध्यान रखें कि आप इस सामग्री का उपयोग Proto DataStore टेस्टिंग सेटअप करने के लिए कर सकते हैं, क्योंकि यह Preferences के समान होगा।"

लेकिन इसका पालन करने पर, मैंने पाया कि डिपेंडेंसी के अलावा, यहां कई समानताएं नहीं हैं और आपको अपने Proto DataStore को टेस्ट करने के लिए अलग लॉजिक पेश करने की आवश्यकता है।

चीजों को सेट करना

अपने एप्लिकेशन के build.gradle फाइल में, निम्नलिखित डिपेंडेंसी जोड़ें:

dependencies { ///..... androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" } 

$compose_version वह वेरिएबल है जिसे आपने अपने प्रोजेक्ट लेवल build.gradle फाइल में परिभाषित किया है।

फिर, अपने androidTest डायरेक्टरी पर जाएं और एक नई फाइल बनाएं। आमतौर पर, आपके पास एक रिपॉजिटरी क्लास होगी जो आपके Proto DataStore के साथ इंटरैक्ट करती है, इसलिए आप इस फाइल का नाम YourRepositoryClassNameTest रख सकते हैं। हम MyRepositoryTest नाम का उपयोग करेंगे।

इससे पहले कि हम Proto DataStore का टेस्ट करना शुरू करें, हमें इसे इंस्टेंटिएट करने की आवश्यकता है। यदि आप इस पर कोई दस्तावेज़ीकरण खोजने के लिए ऑनलाइन जाते हैं, तो यह थोड़ा विरल है।

Proto DataStore को इंस्टेंटिएट करना ग्लोबल Context के साथ इस तरह किया जाता है (जब टेस्टिंग परिदृश्य में उपयोग नहीं किया जाता है):

private val Context.myDataStore: DataStore<MyItem> by dataStore( fileName = DATA_STORE_FILE_NAME, serializer = MyItemSerializer ) 

खैर, आप इसे टेस्ट क्लास के अंदर नहीं कर सकते, क्योंकि, जबकि आप उपरोक्त कोड को कॉपी-पेस्ट कर सकते हैं, आप DataStore ऑब्जेक्ट तक पहुंच नहीं पाएंगे। आप एप्लिकेशन कॉन्टेक्स्ट इस तरह प्राप्त कर सकते हैं:

ApplicationProvider.getApplicationContext() 

लेकिन हमारा myDataStore ऑब्जेक्ट इसके माध्यम से उपलब्ध नहीं होगा।

तो, हम क्या कर सकते हैं?

ऊपर लिंक किए गए लेख में, PreferenceDataStoreFactory.create मेथड का उपयोग करके Preference DataStore बनाने का एक उदाहरण है।

fun create( corruptionHandler: ReplaceFileCorruptionHandler<Preferences>? = null, migrations: List<DataMigration<Preferences>> = listOf(), scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), produceFile: () -> File): DataStore<Preferences> 

लेकिन चूंकि हम Preference DataStore का उपयोग नहीं कर रहे हैं, यह हमारे लिए काम नहीं करेगा। जो काम करेगा वह है DataStoreFactory.create मेथड का उपयोग करना जैसे यह:

fun <T : Any?> create( serializer: Serializer<T>, corruptionHandler: ReplaceFileCorruptionHandler<T>? = null, migrations: List<DataMigration<T>> = listOf(), scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), produceFile: () -> File): DataStore<T> 

इस मेथड के लिए कई तर्क हैं (और कुछ के डिफ़ॉल्ट मान हैं), लेकिन हमें उन सभी को पास करने की आवश्यकता नहीं है। हम पास करेंगे:

  • हमारा सीरियलाइज़र क्लास
  • हमारे Proto DataStore के लिए फाइल बनाने के लिए एक लैम्ब्डा मेथड
dataStore = DataStoreFactory.create( produceFile = { testContext.dataStoreFile(TEST_DATA_STORE_FILE_NAME) }, serializer = MyItemSerializer ) 

हम testContext प्राप्त करते हैं:

private val testContext: Context = ApplicationProvider.getApplicationContext() 

अपने Proto DataStore को सफलतापूर्वक बनाने के बाद, हम इसके लिए कुछ टेस्ट लिखने पर आगे बढ़ सकते हैं। ध्यान रखें कि आपके पास एक रिपॉजिटरी क्लास है जो Proto DataStore के इंस्टेंस को डिपेंडेंसी के रूप में प्राप्त करती है, इसलिए Proto DataStore बनाने के बाद, हमें अपनी रिपॉजिटरी क्लास का एक इंस्टेंस बनाने की आवश्यकता है।

 private val repository = MyRepository(datastore) 

पहले, आइए अपने प्रारंभिक Proto DataStore स्टेट की जांच करने के लिए एक टेस्ट बनाएं। Proto DataStore स्वयं एक फ्लो उजागर करता है जिसका हम उपयोग कर सकते हैं।

@OptIn(ExperimentalCoroutinesApi::class) @Test fun repository_testFetchInitialState() { runTest { testScope.launch { val dataStoreObject = repository.myFlow.first() // यहां जो भी हम अपने से असर्ट करना चाहते हैं डालें // Proto DataStore. I.E. एक फ्लैग जिसका प्रारंभिक मान false है assert(dataStoreObject.myFlag == false) } } } 

☝️ आपने इसे पहले देखा होगा, लेकिन हम यहां एक OptIn एनोटेशन का उपयोग कर रहे हैं। ऐसा इसलिए है क्योंकि (वर्तमान में) जिन API का हम उपयोग कर रहे हैं वे प्रयोगात्मक हैं और जब हम उनका उपयोग करते हैं तो उन्हें चिह्नित किया जाना चाहिए।

चूंकि हम अपने DataStore के फ्लो को एक्सेस कर रहे हैं, हमें इसे अपने testScope में लपेटने की आवश्यकता है। TestScope इसे करके बनाया जाता है:

@OptIn(ExperimentalCoroutinesApi::class) private val dispatcher = TestCoroutineDispatcher() @OptIn(ExperimentalCoroutinesApi::class) private val testScope = TestCoroutineScope(dispatcher) 

इसे चलाएं और अपने पहले Proto DataStore टेस्ट का आनंद लें।

यह लगभग दो सेकंड के लिए मजेदार था।

आइए कुछ और सार्थक करते हैं।

कल्पना करें कि हमारे Proto DataStore में इसके अंदर ऑब्जेक्ट्स की एक सूची है और हम इसमें एक आइटम जोड़ने पर इसकी स्थिति का टेस्ट करना चाहते हैं।

@OptIn(ExperimentalCoroutinesApi::class) @Test fun repository_testAdditionOfItem() { runTest { testScope.launch { //1 val item: MyItem = MyItem.newBuilder().setItemId(UUID.randomUUID().toString()) .setItemDescription(TEST_ITEM_DESCRIPTION).build() //2 repository.updateItem(item) //3 val items = repository.myFlow.first().itemsList assert(items.size == 1) //4 assert(items[0].itemDescription.equals(TEST_ITEM_DESCRIPTION)) } } } 
  1. हम प्रोटोबफ से उजागर API का उपयोग करके एक टेस्ट आइटम बनाते हैं
  2. हम MyRepository क्लास पर उजागर एक मेथड का उपयोग करके इस आइटम को Proto DataStore में जोड़ते हैं
  3. हम Proto DataStore द्वारा उजागर फ्लो से आइटम्स की सूची लेते हैं
  4. हम सुनिश्चित करते हैं कि Proto DataStore में मिला आइटम पहले बनाए गए आइटम से मेल खाता है

आपके DataStore में एक लीक है

यदि आप ऊपर दिए गए टेस्ट को एक साथ चलाने की कोशिश करते हैं, तो आपको रनटाइम के दौरान जल्द ही एक त्रुटि प्राप्त होगी:

उसी फाइल के लिए कई DataStores सक्रिय हैं: /data/user/0/com.example.app/files/datastore/dataStore_filename.pb. आपको या तो अपने DataStore को सिंगलटन के रूप में बनाए रखना चाहिए या पुष्टि करनी चाहिए कि उसी फाइल पर कोई दो DataStore सक्रिय नहीं हैं (यह पुष्टि करके कि स्कोप रद्द कर दिया गया है)।

खैर, यह समस्याग्रस्त है। हमने अपनी टेस्ट क्लास में केवल एक DataStore इंस्टेंस बनाया था।

क्या हो रहा है?

क्योंकि हम अपने DataStore को बनाने के लिए प्रॉपर्टी डेलीगेट का उपयोग नहीं कर रहे हैं (मतलब Context.datastore), यह सुनिश्चित नहीं होता है कि जब भी हम इसे एक्सेस करते हैं तो हमारा DataStore ऑब्जेक्ट एक सिंगलटन है।

इस परिदृश्य को दरकिनार करने के लिए, मैंने पाया है कि एक दृष्टिकोण प्रत्येक टेस्ट केस के लिए DataStore को हटाना और पुनः बनाना है। DataStore को हटाने के लिए, हम यह कर सकते हैं:

@After fun cleanup() { File(testContext.filesDir, "datastore").deleteRecursively() } 

और हर टेस्ट से पहले, हम इसे पुनः बनाते हैं:

@Before fun setup() { dataStore = DataStoreFactory.create( produceFile = { testContext.dataStoreFile(TEST_DATA_STORE_FILE_NAME) }, serializer = MyItemSerializer ) } 

पूरा उदाहरण देखने के लिए, आप यहां जा सकते हैं।

इस लेख में, मैं दिखाना चाहता था कि Proto DataStore का टेस्ट कैसे किया जा सकता है इसकी रूपरेखा।

जबकि मैंने दो टेस्ट केस को कवर किया, आपके DataStore और आपके द्वारा वहां कॉन्फ़िगर किए गए प्रकारों के आधार पर, अधिक टेस्ट केस और परिदृश्य लिखने के लिए हो सकते हैं। बिल्डिंग ब्लॉक्स वहां हैं, आपको बस इसे अपनी आवश्यकताओं के अनुरूप ढालना है।

मुफ्त में कोड करना सीखें। freeCodeCamp का ओपन सोर्स पाठ्यक्रम 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद कर चुका है। शुरू करें

  1. विंडोज 10 में गुम डिफ़ॉल्ट ऐप्स को ठीक करें विंडोज 10 में गुम डिफ़ॉल्ट ऐप्स को ठीक करें

    अधिकांश भाग के लिए, विंडोज 10 इसकी रिलीज के बाद से काफी सफल रहा है। इसका मतलब यह नहीं है कि इसकी समस्याओं का हिस्सा नहीं रहा है, हालांकि। अब जब हमें रेडमंड से साल में दो बार बड़े अपडेट मिल रहे हैं, तो ऐसा लगता है कि रास्ते में अपरिहार्य गड़बड़ियां होंगी। मैंने हाल ही में एक क्लाइंट के लिए एक विंडोज

  1. विंडोज 11 और 10 में डिफ़ॉल्ट ड्रैग-एंड-ड्रॉप फाइल एक्शन कैसे बदलें विंडोज 11 और 10 में डिफ़ॉल्ट ड्रैग-एंड-ड्रॉप फाइल एक्शन कैसे बदलें

    कई उपयोगकर्ता अक्सर बाएं माउस बटन को दबाकर विंडोज 11 के फाइल एक्सप्लोरर ऐप के भीतर फाइलों को ड्रैग और ड्रॉप करते हैं। जब आप किसी फाइल को अलग हार्ड ड्राइव स्थान पर खींचते हैं, तो डिफ़ॉल्ट कार्रवाई फाइल को स्थानांतरित करना है। हालांकि, किसी फाइल को अलग ड्राइव पर फ़ोल्डर में खींचने से यह कॉपी हो जाएगी।

  1. माउस का उपयोग करके CMD/पावरशेल या किसी भी विंडो को स्केल अप या डाउन कैसे करें माउस का उपयोग करके CMD/पावरशेल या किसी भी विंडो को स्केल अप या डाउन कैसे करें

    क्या आपने कभी पावरशेल या CMD को स्केल अप और डाउन करने की आवश्यकता महसूस की है? शायद नहीं, लेकिन कुछ लोगों ने। आप देखते हैं, यह उस प्रकार का कार्य नहीं है जो बहुत सारे विंडोज 10 उपयोगकर्ता कभी करने के बारे में सोचेंगे, लेकिन निश्चिंत रहें, यह संभव है। अब, कई कारण हैं कि कोई यह क्रिया क्यों करना चाहेग