मैक्रोबेंचमार्क से अपने ऐप्लिकेशन को कंट्रोल करें

ज़्यादातर Android यूज़र इंटरफ़ेस (यूआई) टेस्ट के उलट, Macrobenchmark टेस्ट, ऐप्लिकेशन से अलग प्रोसेस में चलते हैं. ऐसा करना ज़रूरी है, ताकि ऐप्लिकेशन की प्रोसेस को रोका जा सके और DEX बाइटकोड से मशीन कोड में कंपाइल किया जा सके.

अपने ऐप्लिकेशन की स्थिति को कंट्रोल करने के लिए, UIAutomator लाइब्रेरी या अन्य तरीकों का इस्तेमाल किया जा सकता है. इनकी मदद से, टेस्ट प्रोसेस से टारगेट ऐप्लिकेशन को कंट्रोल किया जा सकता है. Compose एलिमेंट को UI Automator के लिए उपलब्ध कराने के लिए, Modifier.testTag का इस्तेमाल करें.

यहां दिए गए उदाहरण में, LazyColumn के साथ testTag का इस्तेमाल किया गया है:

@Composable
fun ProductListScreen() {
    LazyColumn(
        modifier = Modifier
            .fillMaxSize()
            .testTag("my_lazy_column")    ) {
        items(100) { index ->
            ProductItem(index)
        }
    }
}

टेस्ट, LazyColumn को ढूंढने और उसे फ़्लिंग करने के लिए, testTag का इस्तेमाल करता है:

@Test
fun scrollList() {
    benchmarkRule.measureRepeated(
        packageName = "com.example.myapp",
        metrics = listOf(FrameTimingMetric()),
        iterations = 5,
        setupBlock = {
            uiAutomator {
                pressHome()
                startApp("com.example.myapp")
            }
        }
    ) {
        uiAutomator {
            // Find the Composable using its testTag mapped as a viewIdResourceName
            val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }

            // Fling the Compose list down
            repeat(3) {
                lazyColumn.fling(Direction.DOWN)
            }
        }
    }
}

ज़रूरी नहीं है कि आपका बेंचमार्क, यूज़र इंटरफ़ेस (यूआई) को स्क्रोल करे. इसके बजाय, यह कोई ऐनिमेशन चला सकता है. जैसे: इसके लिए, खास तौर पर UI Automator का इस्तेमाल करना भी ज़रूरी नहीं है. जब तक फ़्रेम जनरेट होते रहेंगे, तब तक यह परफ़ॉर्मेंस मेट्रिक इकट्ठा करता रहेगा.

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

Macrobenchmark, आउट-ऑफ़-प्रोसेस में चलता है. इसलिए, स्क्रीन बदलने के लिए, NavController से सीधे इंटरैक्ट नहीं किया जा सकता. इसके बजाय, आपके बेंचमार्क को ऐप्लिकेशन के उस हिस्से पर नेविगेट करने वाले उपयोगकर्ता की गतिविधि को सिम्युलेट करना होगा.

setupBlock का इस्तेमाल करके, तैयारी के चरणों को हैंडल करें. जैसे, ऑनबोर्डिंग फ़्लो या मेन्यू बटन पर क्लिक करना. इस तरह, आपका measureBlock सिर्फ़ टारगेट स्क्रीन की परफ़ॉर्मेंस मेट्रिक कैप्चर करता है.

@Test
fun deepScreenScrollList() {
    benchmarkRule.measureRepeated(
        packageName = "com.example.myapp",
        metrics = listOf(FrameTimingMetric()),
        iterations = 5,
        setupBlock = {
            uiAutomator {
                // 1. Start the app on the home screen
                startApp("com.example.myapp")

                // 2. Navigate to the internal screen by clicking a Compose component
                // (e.g., a card that opens the target list view)
                val settingsButton = onElement { viewIdResourceName == "go_to_list_button" }
                settingsButton.click()

                // 3. Wait until the target screen settles and is fully rendered
                waitForStableInActiveWindow()
            }
        }
    ) {
        uiAutomator {
            // The actual benchmark measurement starts here on the target screen
            val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }
            lazyColumn.fling(Direction.DOWN)
        }
    }
}

अन्य संसाधन

टेस्टिंग के बारे में ज़्यादा जानने के लिए, ये संसाधन देखें.

दस्तावेज़

Views कॉन्टेंट