برنامه خود را از Macrobenchmark کنترل کنید

برخلاف اکثر تست‌های رابط کاربری اندروید، تست‌های 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)
        }
    }
}

این تست از testTag برای یافتن LazyColumn و پرتاب آن استفاده می‌کند:

@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 خود، محک بزنید.

از آنجا که 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)
        }
    }
}

منابع اضافی

برای اطلاعات بیشتر در مورد آزمایش، به منابع زیر مراجعه کنید.

مستندات

محتوا را مشاهده می‌کند

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}