एस्प्रेसो आइडलिंग रिसॉर्स

आइडलिंग रिसॉर्स, एसिंक्रोनस कार्रवाई दिखाता है, जिसके नतीजों पर असर पड़ता है यूज़र इंटरफ़ेस (यूआई) टेस्ट में बाद की कार्रवाइयां शामिल हैं. आइडलिंग संसाधनों को इसके साथ पंजीकृत करके एस्प्रेसो, इन एसिंक्रोनस ऑपरेशन को ऐप्लिकेशन को टेस्ट करना.

यह पता लगाना कि संसाधन कब ज़रूरी हैं

Espresso में सिंक्रोनाइज़ेशन की क्षमताएं हैं. यह हालांकि, फ़्रेमवर्क की विशेषता सिर्फ़ उन कार्रवाइयों पर लागू होती है MessageQueue पर मौजूद मैसेज, जैसे कि इसकी सब-क्लास View, जो स्क्रीन पर अपना कॉन्टेंट बना रहा है.

ऐसा इसलिए, क्योंकि Espresso को किसी अन्य एसिंक्रोनस ऑपरेशन की जानकारी नहीं है. इसमें जो बैकग्राउंड थ्रेड पर चल रहे हैं, तो Espresso अपना डेटा सिंक नहीं कर सकता गारंटी दी जाती है. Espresso को अपने ऐप्लिकेशन की लंबे समय तक चलने वाले ऑपरेशन हैं, तो आपको हर एक को आइडलिंग संसाधन के रूप में रजिस्टर करना होगा.

अगर आप अपने ऐप्लिकेशन के नतीजों की जांच करते समय आइडलिंग संसाधनों का इस्तेमाल नहीं करते हैं काम करना है, तो हो सकता है कि आपको अपने सिस्टम को किसी एक अपने टेस्ट को बेहतर बनाने के लिए, विश्वसनीयता:

  • Thread.sleep() में कॉल जोड़े जा रहे हैं. आसानी से अपने कैलेंडर में जोड़ें. अपने टेस्ट में आर्टिफ़िशियल देरी जोड़ें. इससे आपके टेस्ट सुइट को ज़्यादा समय में पूरा करने के बाद भी, कभी-कभी जांच के नतीजों में, ज़्यादा धीमी रफ़्तार वाले डिवाइस. इसके अलावा, यह देरी भी बेहतर तरीके से काम करती है, क्योंकि आपका ऐप्लिकेशन भविष्य की रिलीज़ में एसिंक्रोनस काम को करने में ज़्यादा समय लगना चाहिए.
  • फिर से कोशिश करने वाले रैपर लागू करना. ये ऐसे रैपर का इस्तेमाल करते हैं जो लूप का इस्तेमाल करके बार-बार यह जांच करते हैं कि क्या आपका ऐप्लिकेशन तब तक एसिंक्रोनस काम कर रहा है, जब तक कि टाइम आउट नहीं हो जाता. भले ही आप अपने परीक्षणों में फिर से प्रयास करने की अधिकतम संख्या तय करते हैं, तो प्रत्येक बार किए जाने वाले प्रदर्शन की गणना करनी होगी. सिस्टम रिसॉर्स, खास तौर पर सीपीयू के लिए.
  • CountDownLatch के इन्सटेंस का इस्तेमाल करना, जो एक या ज़्यादा थ्रेड को एक खास ऑपरेशन होने तक इंतज़ार करने दें किसी दूसरे थ्रेड में एक्ज़ीक्यूट किया गया. इन ऑब्जेक्ट के लिए आपको टाइम आउट की अवधि; ऐसा न करने पर, आपका ऐप्लिकेशन हमेशा के लिए ब्लॉक किया जा सकता है. लैचे साथ ही, आपके कोड में गैर-ज़रूरी जटिलता को जोड़ दिया जाता है, जिससे रखरखाव और मुश्किल हो जाता है.

Espresso की मदद से इसके बजाय अपने ऐप्लिकेशन के एसिंक्रोनस काम को आइडलिंग संसाधनों के रूप में रजिस्टर करें.

इस्तेमाल के सामान्य उदाहरण

अपने टेस्ट में, नीचे दिए गए उदाहरणों से मिलते-जुलते काम करते समय, किसी आइडलिंग संसाधन का इस्तेमाल करें:

  • इंटरनेट या किसी लोकल डेटा सोर्स से डेटा लोड हो रहा है.
  • डेटाबेस और कॉलबैक के साथ कनेक्शन बनाना.
  • सेवाएं प्रबंधित करना, चाहे सिस्टम सेवा का इस्तेमाल किया जा रहा हो या IntentService.
  • मुश्किल कारोबारी लॉजिक करना, जैसे कि बिटमैप ट्रांसफ़ॉर्मेशन.

इन ऑपरेशन के दौरान आइडलिंग संसाधनों को रजिस्टर करना खास तौर पर ज़रूरी होता है यूज़र इंटरफ़ेस को अपडेट करने के बाद ही, उसकी पुष्टि की जा सकती है.

आइडलिंग रिसॉर्स को लागू करने का उदाहरण

नीचे दी गई सूची में, आईडीलिंग रिसॉर्स को लागू करने के कई उदाहरणों के बारे में बताया गया है जिन्हें अपने ऐप्लिकेशन में इंटिग्रेट किया जा सकता है:

CountingIdlingResource
सक्रिय टास्क का काउंटर बनाए रखता है. काउंटर शून्य होने पर, ऐसा माना जाता है कि संसाधन कुछ समय से इस्तेमाल में नहीं है. यह फ़ंक्शन करीब-करीब Semaphore. ज़्यादातर मामलों में, लागू करने का यह तरीका जो टेस्टिंग के दौरान आपके ऐप्लिकेशन के एसिंक्रोनस काम को मैनेज करने के लिए काफ़ी हो.
UriIdlingResource
इससे मिलता-जुलता CountingIdlingResource, लेकिन काउंटर मूल्य ऐसा माना जाता है कि संसाधन कुछ समय से इस्तेमाल में नहीं है. इंतज़ार का यह अतिरिक्त समय लगातार लगता है नेटवर्क अनुरोधों को शामिल किया जाता है, जहां आपकी थ्रेड में मौजूद ऐप्लिकेशन नया बना सकता है पिछले अनुरोध का जवाब मिलने के तुरंत बाद अनुरोध करें.
IdlingThreadPoolExecutor
ThreadPoolExecutor को अपनी पसंद के मुताबिक लागू करना जो बनाए गए थ्रेड में चल रहे टास्क की कुल संख्या को ट्रैक करता है पूल. यह क्लास CountingIdlingResource से ऐक्टिव टास्क के काउंटर का रखरखाव करने के लिए.
IdlingScheduledThreadPoolExecutor
इन्हें अपनी पसंद के मुताबिक लागू करना ScheduledThreadPoolExecutor. यह वही काम करता है और क्षमताओं को बढ़ाने के लिए, IdlingThreadPoolExecutor क्लास के साथ-साथ उन टास्क को भी ट्रैक कर सकता है जो आने वाले समय के लिए शेड्यूल किए गए हैं या को समय-समय पर एक्ज़ीक्यूट करने के लिए शेड्यूल किया जाता है.

अपना खुद का आइडलिंग संसाधन बनाएं

अपने ऐप्लिकेशन की जांच में आइडलिंग संसाधनों का इस्तेमाल करते समय, आपको ये चीज़ें देनी पड़ सकती हैं आपकी पसंद के मुताबिक रिसॉर्स मैनेजमेंट या लॉग इन करने की सुविधा मिलती है. ऐसे मामलों में, लागू करने की प्रक्रिया जो पिछले सेक्शन में दी गई है उससे शायद यह काफ़ी न हो. अगर ऐसा है, तो इन आइडलिंग रिसॉर्स में से किसी एक को लागू करें या अपने हिसाब से रिसॉर्स बनाएं.

अगर आप अपने खुद के आइडलिंग रिसॉर्स फ़ंक्शन को लागू करते हैं, तो नीचे दी गई सबसे सही ध्यान रखें, खास तौर पर पहले:

कुछ समय तक डिवाइस इस्तेमाल न किए जाने से जुड़ी जांच के अलावा, अन्य स्टेज पर ट्रांज़िशन शुरू करें.
जब आपका ऐप्लिकेशन इस्तेमाल न हो रहा हो, तब उसे कॉल करें onTransitionToIdle() लागू करने के किसी भी तरीके से isIdleNow(). इस तरह, एस्प्रेसो कोई दूसरी जानकारी नहीं देता. इस बात की जांच करना बेवजह नहीं है कि क्या दिया गया है आइडलिंग रिसॉर्स कुछ समय से इस्तेमाल में नहीं है.

नीचे दिया गया कोड स्निपेट इस सुझाव को दिखाता है:

Kotlin

fun isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

fun backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}

Java

public void isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

public void backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}
अगर आपको ज़रूरी संसाधनों की ज़रूरत हो, तो पहले उन्हें रजिस्टर करें.

आइडलिंग संसाधनों से जुड़े सिंक करने के फ़ायदे सिर्फ़ लागू होंगे के पहली बार आने के बाद जब Espresso ने उस isIdleNow() तरीका.

नीचे दी गई सूची में इस प्रॉपर्टी के कई उदाहरण दिए गए हैं:

  • अगर आप @Before के साथ बताए गए तरीके में कोई आइडलिंग संसाधन रजिस्टर करते हैं, तो आइडलिंग संसाधन हर टेस्ट की पहली लाइन में लागू होता है.
  • अगर आप टेस्ट में कोई आइडलिंग संसाधन रजिस्टर करते हैं, तो आईडीलिंग संसाधन एस्प्रेसो (कॉफ़ी) की सुविधा का इस्तेमाल करके की जाने वाली अगली कार्रवाई के दौरान लागू होगी. यह व्यवहार अब भी तब भी होता है जब अगली कार्रवाई आइडलिंग संसाधन को रजिस्टर करता है.
संसाधनों का इस्तेमाल करने के बाद, उनका रजिस्ट्रेशन रद्द करें.

सिस्टम के संसाधनों को बचाने के लिए, आपको बंद किए जा रहे संसाधनों का रजिस्ट्रेशन जल्द से जल्द रद्द करना होगा ऐसा इसलिए हो रहा है, क्योंकि अब आपको उनकी ज़रूरत नहीं है. उदाहरण के लिए, अगर आप एक आइडलिंग संसाधन रजिस्टर करते हैं तो @Before में इस संसाधन का रजिस्ट्रेशन रद्द करना बेहतर होता है. जोड़ें जो @After के साथ एनोटेट किया गया है.

आईडीलिंग संसाधनों को रजिस्टर करने और उनका रजिस्ट्रेशन रद्द करने के लिए, आईडीलिंग रजिस्ट्री का इस्तेमाल करें.

अपने ऐप्लिकेशन के आइडलिंग संसाधनों के लिए इस कंटेनर का इस्तेमाल करके, आप रजिस्टर कर सकते हैं और ज़रूरत के हिसाब से संसाधनों का रजिस्ट्रेशन रद्द करें और लगातार देखें व्यवहार.

आइडलिंग रिसॉर्स में, ऐप्लिकेशन की सिर्फ़ सामान्य स्थिति बनाए रखें.

उदाहरण के लिए, आप जिन संसाधनों को लागू और रजिस्टर करते हैं वे इसमें View ऑब्जेक्ट के रेफ़रंस शामिल हैं.

आइडलिंग संसाधनों को रजिस्टर करें

एस्प्रेसो एक कंटेनर क्लास देता है, जिसमें आप अपने ऐप्लिकेशन की आइडलिंग रख सकते हैं संसाधन. इस क्लास का नाम IdlingRegistry सेल्फ़-कंटेन्ड आर्टफ़ैक्ट जो आपके ऐप्लिकेशन के लिए बहुत कम काम करता है. क्लास साथ ही, आपको अपने ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाने के लिए, रखरखाव:

  • आइडलिंग संसाधनों के बजाय, IdlingRegistry का रेफ़रंस बनाएं जो आपके ऐप्लिकेशन के टेस्ट में शामिल हैं.
  • इस्तेमाल किए जाने वाले आइडलिंग रिसॉर्स को इकट्ठा करने में अंतर बनाए रखें बिल्ड के हर वैरिएंट के लिए तैयार हो.
  • अपने ऐप्लिकेशन की सेवाओं में, यूज़र इंटरफ़ेस (यूआई) के बजाय आइडलिंग रिसॉर्स तय करें जो उन सेवाओं का संदर्भ देते हैं.

अपने ऐप्लिकेशन में आइडलिंग रिसॉर्स इंटिग्रेट करें

हालांकि, किसी ऐप्लिकेशन में कई अलग-अलग तरीकों से ऑफ़लाइन संसाधन जोड़े जा सकते हैं, लेकिन हमारा सुझाव है कि पहले खास तौर पर, आपके ऐप्लिकेशन के लिए इनकैप्सुलेशन बनाए रखता है. हालांकि, यह अब भी अनुमति देता है का इस्तेमाल करें.

अपने ऐप्लिकेशन में आइडलिंग रिसॉर्स जोड़ते समय, हम खास तौर पर यह सुझाव देते हैं कि ऐप्लिकेशन में ही रिसॉर्स लॉजिक को इस्तेमाल करना और सिर्फ़ रजिस्ट्रेशन करना और रजिस्ट्रेशन से जुड़ी कार्रवाइयों की जानकारी शामिल है.

हालांकि, आप ऐसी असामान्य स्थिति बना देते हैं जहां सिर्फ़-जांच वाले इंटरफ़ेस का इस्तेमाल किया जाता है इस तरीके का इस्तेमाल करके प्रोडक्शन कोड बनाया जा सकता है. इससे ऐसे रिसॉर्स बनाए जा सकते हैं जिनमें जो आपके पास पहले से है, जो आपके ऐप्लिकेशन के APK के साइज़ और तरीके की संख्या को बनाए रखता है.

दूसरे तरीके

अगर आपको अपने ऐप्लिकेशन के प्रोडक्शन में रिसॉर्स लॉजिक का इस्तेमाल नहीं करना है इंटिग्रेशन की कई अन्य रणनीतियां भी हैं:

  • बिल्ड वैरिएंट बनाना, जैसे कि Gradle's प्रॉडक्ट फ़्लेवर में बदलाव करें और सिर्फ़ अपने ऐप्लिकेशन के डीबग बिल्ड में आइडलिंग संसाधनों का इस्तेमाल करें.
  • अपने ऐप्लिकेशन की आइडलिंग इंजेक्ट करने के लिए, Dagger जैसे डिपेंडेंसी इंजेक्शन फ़्रेमवर्क का इस्तेमाल करें आपके टेस्ट में संसाधन डिपेंडेंसी दिखाने वाला ग्राफ़. यदि आप डैगर 2 का उपयोग कर रहे हैं, तो इंजेक्शन किसी सबकॉम्पोनेंट से शुरू होना चाहिए.
  • अपने ऐप्लिकेशन की जांच में आइडलिंग रिसॉर्स को लागू करें और उपयोगकर्ताओं को को सिंक करने की ज़रूरत होती है. टेस्ट.

    चेतावनी: हालांकि, डिज़ाइन से जुड़ा यह फ़ैसला ऐसा लगता है आइडलिंग रिसॉर्स के लिए एक सेल्फ़-कंटेन्ड रेफ़रंस तैयार करता है. सबसे आसान ऐप्लिकेशन को छोड़कर बाकी सभी में एनकैप्सुलेशन.

अन्य संसाधन

Android परीक्षणों में Espresso का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, इन संसाधनों को देखें.

सैंपल

  • IdlingResourceSample: बैकग्राउंड जॉब के साथ सिंक करने की सुविधा.