कंपोज़ की जांच, आपके यूज़र इंटरफ़ेस (यूआई) के साथ डिफ़ॉल्ट रूप से सिंक होती हैं. जब आप किसी
ComposeTestRule
का इस्तेमाल करके किए गए दावे या कार्रवाई से, टेस्ट सिंक हो जाता है
इसके लिए, यूआई ट्री के कुछ समय तक इस्तेमाल में न होने तक इंतज़ार करें.
आम तौर पर, आपको कुछ भी करने की ज़रूरत नहीं होती. हालांकि, कुछ किनारे हैं जिनके बारे में आपको पता होना चाहिए.
जब कोई टेस्ट सिंक हो जाता है, तो वर्चुअल घड़ी का इस्तेमाल करके आपके Compose ऐप्लिकेशन में समय आगे बढ़ जाता है. इसका मतलब है कि 'लिखें' टेस्ट रीयल टाइम में नहीं चल सकते, इसलिए वे इस टेस्ट को पास कर सकते हैं जितनी जल्दी हो सके.
हालांकि, अगर टेस्ट को सिंक करने वाले तरीकों का इस्तेमाल नहीं किया जाता है, तो इसमें बदलाव किया जाएगा और यूज़र इंटरफ़ेस (यूआई) रोका गया दिखेगा.
@Test
fun counterTest() {
val myCounter = mutableStateOf(0) // State that can cause recompositions.
var lastSeenValue = 0 // Used to track recompositions.
composeTestRule.setContent {
Text(myCounter.value.toString())
lastSeenValue = myCounter.value
}
myCounter.value = 1 // The state changes, but there is no recomposition.
// Fails because nothing triggered a recomposition.
assertTrue(lastSeenValue == 1)
// Passes because the assertion triggers recomposition.
composeTestRule.onNodeWithText("1").assertExists()
}
ध्यान दें कि यह ज़रूरी शर्त, सिर्फ़ Compose की हैरारकी पर लागू होती है, न कि ऐप्लिकेशन के बाकी हिस्से पर.
अपने-आप सिंक होने की सुविधा बंद करें
जब आप ComposeTestRule
के ज़रिए किसी दावे या कार्रवाई को कॉल करते हैं, जैसे कि
assertExists()
, आपका टेस्ट Compose के यूज़र इंटरफ़ेस (यूआई) के साथ सिंक हो गया है. कुछ मामलों में
हो सकता है कि आप यह सिंक्रोनाइज़ेशन बंद करना चाहें और खुद घड़ी को कंट्रोल करना चाहें. उदाहरण के लिए, किसी ऐनिमेशन के सटीक स्क्रीनशॉट लेने के लिए, समय को कंट्रोल किया जा सकता है. ऐसा उस समय किया जा सकता है, जब यूज़र इंटरफ़ेस (यूआई) में कोई गतिविधि चल रही हो. अपने-आप सिंक होने की सुविधा बंद करने के लिए,
mainClock
में autoAdvance
प्रॉपर्टी को false
पर सेट करें:
composeTestRule.mainClock.autoAdvance = false
आम तौर पर, आपको खुद ही सेशन को आगे बढ़ाने का मौका मिलेगा. advanceTimeByFrame()
का इस्तेमाल करके, वीडियो को एक फ़्रेम आगे बढ़ाया जा सकता है. इसके अलावा, advanceTimeBy()
का इस्तेमाल करके, वीडियो को किसी खास अवधि के लिए आगे बढ़ाया जा सकता है:
composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)
ऐसे संसाधन जो कुछ समय से इस्तेमाल में नहीं हैं
Compose, टेस्ट और यूज़र इंटरफ़ेस (यूआई) को सिंक कर सकता है, ताकि हर कार्रवाई और दावा, आइडल स्टेटस में किया जा सके. साथ ही, ज़रूरत के हिसाब से क्लॉक को इंतज़ार करने या आगे बढ़ाने की सुविधा मिल सके. हालांकि, कुछ एसिंक्रोनस ऑपरेशन जिनके परिणाम यूज़र इंटरफ़ेस (यूआई) स्थिति पर असर डालते हैं, उन्हें बैकग्राउंड में इस तरह का कॉन्टेंट इस्तेमाल किया जा सकता है, जबकि टेस्ट को इसकी जानकारी न हो.
टेस्ट में इस्तेमाल न होने वाले रिसॉर्स बनाएं और रजिस्टर करें, ताकि उन्हें टेस्ट में शामिल किया जा सके यह तय करते समय कि ऐप्लिकेशन व्यस्त है या इस्तेमाल में नहीं है. आपको ये नहीं करना है को तब तक कार्रवाई नहीं करनी होगी जब तक कि आपको अतिरिक्त आइडलिंग संसाधनों को पंजीकृत करने की आवश्यकता न हो, उदाहरण के लिए, अगर आप कोई ऐसा बैकग्राउंड जॉब चलाते हैं जो Espresso के साथ सिंक नहीं है या लिखें.
यह एपीआई, Espresso के आइडलिंग रिसॉर्स से काफ़ी मिलता-जुलता है. इससे यह पता चलता है कि जांचा जा रहा विषय, आइडल है या व्यस्त. रजिस्टर करने के लिए, जांच के लिए 'लिखें' बॉक्स इस्तेमाल करने का नियम
IdlingResource
को लागू करना.
composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)
मैन्युअल सिंक करना
कुछ मामलों में, आपको Compose के यूज़र इंटरफ़ेस (यूआई) को अपने टेस्ट के अन्य हिस्सों या टेस्ट किए जा रहे ऐप्लिकेशन के साथ सिंक करना पड़ता है.
waitForIdle()
फ़ंक्शन, Compose के खाली होने का इंतज़ार करता है. हालांकि, यह फ़ंक्शन autoAdvance
प्रॉपर्टी पर निर्भर करता है:
composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.
composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.
ध्यान दें कि दोनों स्थितियों में, waitForIdle()
लंबित ड्रॉ और लेआउट की इंतज़ार करता है
पास.
साथ ही, किसी खास शर्त के पूरा होने तक, इस घड़ी को आगे बढ़ाया जा सकता है
advanceTimeUntil()
.
composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }
ध्यान दें कि दी गई शर्त, उस स्थिति की जांच करनी चाहिए जिस पर इस घड़ी का असर पड़ सकता है. यह सिर्फ़ 'लिखें' स्थिति के साथ काम करता है.
शर्तों का इंतज़ार करें
ऐसी कोई भी शर्त जो बाहरी काम पर निर्भर करती है, जैसे कि डेटा लोड करना या Android का
मेज़र या ड्रॉ करना (मतलब, कंपोज़ की मदद से बाहरी सोर्स को मेज़र या ड्रॉ करना) है, तो
सामान्य कॉन्सेप्ट, जैसे कि waitUntil()
:
composeTestRule.waitUntil(timeoutMs) { condition }
इनमें से किसी भी waitUntil
सहायक का भी इस्तेमाल किया जा सकता है:
composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)
composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)
composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)
composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)
अतिरिक्त संसाधन
- Android पर ऐप्लिकेशन की जांच करना: Android की मुख्य जांच लैंडिंग पेज पर, टेस्टिंग से जुड़ी बुनियादी बातों और तकनीकों के बारे में ज़्यादा जानकारी मिलती है.
- जांच की बुनियादी बातें: ज़्यादा जानें Android ऐप्लिकेशन की टेस्टिंग के मुख्य सिद्धांतों के बारे में ज़्यादा जानें.
- लोकल टेस्ट: कुछ टेस्ट, अपने वर्कस्टेशन पर स्थानीय तौर पर चलाए जा सकते हैं.
- इंस्ट्रुमेंट्ड टेस्ट: यह अच्छा है इंस्ट्रुमेंटेड टेस्ट करने का अभ्यास भी किया. इसका मतलब है कि ये टेस्ट सीधे तौर पर डिवाइस पर चलते हैं.
- लगातार इंटिग्रेशन: लगातार इंटिग्रेशन की मदद से, टेस्ट को डिप्लॉयमेंट में इंटिग्रेट किया जा सकता है पाइपलाइन.
- अलग-अलग साइज़ की स्क्रीन आज़माएं: लोगों के लिए कई डिवाइस उपलब्ध हैं, तो आपको अलग-अलग स्क्रीन के लिए साइज़.
- Espresso: यह टूल, व्यू पर आधारित यूज़र इंटरफ़ेस (यूआई) के लिए है. हालांकि, Compose की जांच के कुछ पहलुओं के लिए, Espresso के बारे में जानकारी मददगार हो सकती है.