डिवाइस के कॉन्फ़िगरेशन में सामान्य बदलाव होने पर, अपने ऐप्लिकेशन की जांच करने के लिए Espresso Device API का इस्तेमाल करें. जैसे, स्क्रीन का घूमना और खुलना. Espresso Device API, डिवाइस-लेवल की कार्रवाइयां करने के लिए सुझाया गया टूल है. इसका इस्तेमाल, Jetpack Compose की टेस्टिंग से जुड़े नियमों के साथ किया जा सकता है. अगर आपको Jetpack Compose के लिए यूज़र इंटरफ़ेस (यूआई) टेस्ट लिखने का अनुभव नहीं है, तो अपने कंपोज़ लेआउट की टेस्टिंग करना लेख पढ़ें.
Espresso Device API की मदद से, वर्चुअल डिवाइस पर कॉन्फ़िगरेशन में बदलाव किए जा सकते हैं. साथ ही, अपने टेस्ट को एक साथ लागू किया जा सकता है. इससे एक बार में सिर्फ़ एक यूज़र इंटरफ़ेस (यूआई) ऐक्शन या दावा होता है और आपके टेस्ट के नतीजे ज़्यादा भरोसेमंद होते हैं. अगर आपको Espresso का इस्तेमाल करके यूज़र इंटरफ़ेस (यूआई) टेस्ट लिखने का अनुभव नहीं है, तो इसका दस्तावेज़ देखें.
Espresso Device API का इस्तेमाल करने के लिए, आपके पास ये चीज़ें होनी चाहिए:
- Android Studio Iguana या इसके बाद का वर्शन
- Android Gradle प्लगिन 8.3 या इसके बाद का वर्शन
- Android Emulator 33.1.10 या इसके बाद का वर्शन
- Android का ऐसा वर्चुअल डिवाइस जिस पर एपीआई लेवल 24 या इसके बाद का वर्शन चलता हो
Espresso Device API के लिए अपना प्रोजेक्ट सेट अप करना
अपने प्रोजेक्ट को इस तरह से सेट अप करें कि वह Espresso Device API के साथ काम कर सके. इसके लिए, यह तरीका अपनाएं:
टेस्ट को टेस्ट के लिए डिवाइस पर निर्देश भेजने की अनुमति देने के लिए,
androidTestsource set में मेनिफ़ेस्ट फ़ाइल में ज़रूरी नेटवर्क अनुमतियां जोड़ें:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />अगर आपका टेस्ट, Android 17 (एपीआई लेवल 37) या इसके बाद के वर्शन को टारगेट करता है, तो आपको
ACCESS_LOCAL_NETWORKअनुमति भी देनी होगी:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />gradle.propertiesफ़ाइल मेंenableEmulatorControlएक्सपेरिमेंटल फ़्लैग चालू करें:android.experimental.androidTest.enableEmulatorControl=trueमॉड्यूल-लेवल की बिल्ड स्क्रिप्ट में
emulatorControlविकल्प चालू करें:Kotlin
testOptions { emulatorControl { enable = true } }
Groovy
testOptions { emulatorControl { enable = true } }
मॉड्यूल-लेवल की बिल्ड स्क्रिप्ट में, Espresso Device लाइब्रेरी को अपने प्रोजेक्ट में इंपोर्ट करें:
Kotlin
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0") }
Groovy
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
कॉन्फ़िगरेशन में किए गए सामान्य बदलावों के ख़िलाफ़ टेस्ट करना
Espresso Device API में स्क्रीन की दिशा और फ़ोल्ड किए जा सकने वाले डिवाइस की कई स्टेट होती हैं. इनका इस्तेमाल करके, डिवाइस कॉन्फ़िगरेशन में बदलाव किए जा सकते हैं. यहां दिए गए उदाहरणों में, डिवाइस की इन स्थितियों को ट्रिगर करने और Compose टेस्ट के नियमों का इस्तेमाल करके, यूज़र इंटरफ़ेस (यूआई) में हुए बदलावों की पुष्टि करने का तरीका बताया गया है.
स्क्रीन को घुमाने की सुविधा के ख़िलाफ़ टेस्ट करना
स्क्रीन रोटेशन की जांच करने के लिए, ScreenOrientationRule क्लास का इस्तेमाल करके, जांच के दौरान डिवाइस का ओरिएंटेशन तय किया जा सकता है.
यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि डिवाइस की स्क्रीन घूमने पर, आपके ऐप्लिकेशन पर क्या असर पड़ता है:
सबसे पहले, Compose टेस्ट का नियम तय करें. इसके बाद,
ScreenOrientationRuleक्लास का इस्तेमाल करके, डिवाइस को एक जैसी शुरुआती स्थिति में सेट करें. जैसे, पोर्ट्रेट मोड:import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertDoesNotExist import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.device.EspressoDevice.onDevice import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule import org.junit.Rule import org.junit.Test class MyConfigurationTest { // 1. Define the Compose test rule @get:Rule val composeTestRule = createComposeRule() // 2. Define the Espresso Device rule for a consistent starting state @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) }अगर आपका टेस्ट, Android 17 (एपीआई लेवल 37) या उसके बाद के वर्शन को टारगेट करता है, तो Espresso Device API के लिए
ACCESS_LOCAL_NETWORKअनुमति ज़रूरी है. आपको यह पक्का करना होगा किScreenOrientationRuleनियम लागू होने से पहले, यह अनुमति दे दी गई हो.GrantPermissionRuleनियम को पहले चलाने के लिए, JUnit केRuleChainका इस्तेमाल करें:import androidx.test.rule.GrantPermissionRule import org.junit.rules.RuleChain class MyConfigurationTest { val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK) val composeTestRule = createComposeRule() val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @get:Rule val chain = RuleChain .outerRule(grantPermissionRule) .around(composeTestRule) .around(screenOrientationRule) }ऐसा टेस्ट बनाएं जो टेस्ट के दौरान डिवाइस को लैंडस्केप ओरिएंटेशन पर सेट करता हो:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }स्क्रीन रोटेट होने के बाद,
composeTestRuleका इस्तेमाल करके देखें कि आपके कंपोज़ेबल, नई स्थिति के हिसाब से काम कर रहे हैं या नहीं.@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
स्क्रीन खुलने पर टेस्ट करना
यहां एक उदाहरण दिया गया है, जिसमें यह बताया गया है कि फ़ोल्ड किए जा सकने वाले डिवाइस पर ऐप्लिकेशन के खुले होने के दौरान स्क्रीन को अनफ़ोल्ड करने पर, ऐप्लिकेशन पर क्या असर पड़ता है. इसकी जांच कैसे करें:
सबसे पहले, डिवाइस को फ़ोल्ड करके
onDevice().setClosedMode()पर कॉल करके देखें. पक्का करें कि आपके कंपोज़ेबल, स्क्रीन की कम चौड़ाई के हिसाब से अडजस्ट हो जाएं.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }पूरी तरह से खुले हुए मोड पर जाने के लिए,
onDevice().setFlatMode()को कॉल करें. देखें कि कंपोज़ेबल, बड़ी साइज़ क्लास के हिसाब से अडजस्ट हो रहे हैं या नहीं.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
यह तय करना कि आपके टेस्ट के लिए किन डिवाइसों की ज़रूरत है
अगर फ़ोल्ड नहीं किए जा सकने वाले डिवाइस पर, फ़ोल्ड करने की कार्रवाइयां करने वाला टेस्ट चलाया जाता है, तो हो सकता है कि टेस्ट पूरा न हो. सिर्फ़ उन टेस्ट को लागू करने के लिए जो इस्तेमाल किए जा रहे डिवाइस के लिए काम के हैं, @RequiresDeviceMode एनोटेशन का इस्तेमाल करें. टेस्ट रनर, उन डिवाइसों पर अपने-आप टेस्ट नहीं चलाता जिन पर टेस्ट किए जा रहे कॉन्फ़िगरेशन काम नहीं करते. डिवाइस की ज़रूरी शर्तों से जुड़े नियम को हर टेस्ट या पूरी टेस्ट क्लास में जोड़ा जा सकता है.
उदाहरण के लिए, अगर आपको यह तय करना है कि टेस्ट सिर्फ़ उन डिवाइसों पर चलाया जाए जिनमें फ़्लैट कॉन्फ़िगरेशन के लिए अनफ़ोल्ड करने की सुविधा काम करती है, तो अपने टेस्ट में यह @RequiresDeviceMode कोड जोड़ें:
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}