अपने ऐप्लिकेशन की गतिविधियों की जांच करें

गतिविधियां, आपके ऐप्लिकेशन में उपयोगकर्ता के हर इंटरैक्शन के लिए कंटेनर के तौर पर काम करती हैं. इसलिए, यह जांच करना ज़रूरी है कि डिवाइस-लेवल के इवेंट के दौरान, आपके ऐप्लिकेशन की गतिविधियां कैसे काम करती हैं. जैसे:

  • डिवाइस पर मौजूद फ़ोन ऐप्लिकेशन जैसे किसी दूसरे ऐप्लिकेशन की वजह से, आपके ऐप्लिकेशन की गतिविधि में रुकावट आती है.
  • सिस्टम आपकी गतिविधि को बंद करके फिर से शुरू करता है.
  • उपयोगकर्ता आपकी गतिविधि को नई विंडो में रखता है. जैसे, पिक्चर में पिक्चर (पीआईपी) या मल्टी-विंडो.

खास तौर पर, यह पक्का करना ज़रूरी है कि आपकी गतिविधि, गतिविधि के लाइफ़साइकल में बताए गए इवेंट के जवाब में सही तरीके से काम करे.

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

किसी गतिविधि की स्थिति को कंट्रोल करना

ऐप्लिकेशन की गतिविधियों की जांच करने का एक अहम पहलू यह है कि ऐप्लिकेशन की गतिविधियों को खास स्थितियों में रखा जाए. अपने टेस्ट के "दिया गया" हिस्से को तय करने के लिए, ActivityScenario के इंस्टेंस का इस्तेमाल करें. यह AndroidX Test लाइब्रेरी का हिस्सा है. इस क्लास का इस्तेमाल करके, अपनी गतिविधि को ऐसे स्टेटस में रखा जा सकता है जो डिवाइस-लेवल के इवेंट को सिम्युलेट करते हैं.

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

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

कोई गतिविधि बनाना

जांच के लिए गतिविधि बनाने के लिए, यहां दिए गए स्निपेट में दिखाया गया कोड जोड़ें:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

गतिविधि बनाने के बाद, ActivityScenario गतिविधि को RESUMED स्थिति में बदल देता है. इस स्थिति से पता चलता है कि आपकी गतिविधि चल रही है और उपयोगकर्ताओं को दिख रही है. इस स्थिति में, Espresso UI टेस्ट का इस्तेमाल करके, अपनी गतिविधि के View एलिमेंट से इंटरैक्ट किया जा सकता है.

Google का सुझाव है कि टेस्ट पूरा होने पर, गतिविधि के लिए close को कॉल करें. इससे जुड़े संसाधन मिट जाते हैं और आपके टेस्ट की स्थिरता बेहतर होती है. ActivityScenario, Closeable को लागू करता है, ताकि use एक्सटेंशन या Java प्रोग्रामिंग भाषा में try-with-resources को लागू किया जा सके. इससे गतिविधि अपने-आप बंद हो जाती है.

इसके अलावा, हर टेस्ट से पहले और टेस्ट के खत्म होने पर, ActivityScenarioRule को अपने-आप कॉल करने के लिए ActivityScenario.launch और ActivityScenario.close का इस्तेमाल किया जा सकता है. यहां दिए गए उदाहरण में, किसी नियम को तय करने और उससे किसी परिदृश्य का इंस्टेंस पाने का तरीका बताया गया है:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

गतिविधि को नई स्थिति में ले जाना

गतिविधि को किसी दूसरी स्थिति में ले जाने के लिए, जैसे कि CREATED या STARTED, moveToState() को कॉल करें. इस कार्रवाई से, ऐसी स्थिति का पता चलता है जब आपकी गतिविधि को किसी दूसरे ऐप्लिकेशन या सिस्टम की कार्रवाई की वजह से रोक दिया जाता है या कुछ समय के लिए रोक दिया जाता है.

moveToState() के इस्तेमाल का एक उदाहरण, यहां दिए गए कोड स्निपेट में दिखाया गया है:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

मौजूदा गतिविधि की स्थिति का पता लगाना

टेस्ट की जा रही किसी गतिविधि की मौजूदा स्थिति का पता लगाने के लिए, अपने ActivityScenario ऑब्जेक्ट में मौजूद state फ़ील्ड की वैल्यू पाएं. अगर गतिविधि किसी दूसरी गतिविधि पर रीडायरेक्ट होती है या अपने-आप खत्म हो जाती है, तो टेस्ट की जा रही गतिविधि की स्थिति की जांच करने के लिए यह खास तौर पर मददगार होता है. इसे कोड के इस स्निपेट में दिखाया गया है:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

गतिविधि को फिर से बनाएं

जब किसी डिवाइस में संसाधन कम होते हैं, तो सिस्टम किसी गतिविधि को बंद कर सकता है. ऐसे में, जब उपयोगकर्ता आपके ऐप्लिकेशन पर वापस आता है, तो आपके ऐप्लिकेशन को उस गतिविधि को फिर से बनाना होगा. इन स्थितियों को सिम्युलेट करने के लिए, recreate() को कॉल करें:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

ActivityScenario क्लास, गतिविधि की सेव की गई इंस्टेंस की स्थिति और @NonConfigurationInstance का इस्तेमाल करके एनोटेट किए गए किसी भी ऑब्जेक्ट को बनाए रखती है. ये ऑब्जेक्ट, टेस्ट की जा रही गतिविधि के नए इंस्टेंस में लोड होते हैं.

गतिविधि के नतीजे वापस पाना

पूरी हो चुकी गतिविधि से जुड़ा नतीजा कोड या डेटा पाने के लिए, अपने ActivityScenario ऑब्जेक्ट में मौजूद result फ़ील्ड की वैल्यू पाएं. इसे यहां दिए गए कोड स्निपेट में दिखाया गया है:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

गतिविधि में कार्रवाइयों को ट्रिगर करना

ActivityScenario में मौजूद सभी तरीके, कॉल को ब्लॉक करते हैं. इसलिए, एपीआई को इन्हें इंस्ट्रुमेंटेशन थ्रेड में चलाने की ज़रूरत होती है.

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

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

हालांकि, अगर आपको गतिविधि पर ही किसी तरीके को कॉल करना है, तो ActivityAction को लागू करके ऐसा सुरक्षित तरीके से किया जा सकता है:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}