Kiểm soát ứng dụng của bạn từ Macrobenchmark

Khác với hầu hết các hoạt động kiểm thử giao diện người dùng Android, việc kiểm thử Macrobenchmark chạy trong một quy trình riêng biệt với ứng dụng. Đây là điều cần thiết để cho phép những hoạt động như dừng quy trình ứng dụng và biên dịch từ mã byte DEX sang mã máy.

Bạn có thể điều khiển trạng thái của ứng dụng bằng cách sử dụng thư viện UIAutomator hoặc các cơ chế có thể kiểm soát ứng dụng đích từ quá trình kiểm thử. Để hiển thị các phần tử Compose cho UI Automator, hãy sử dụng Modifier.testTag.

Ví dụ sau đây sử dụng LazyColumn với testTag:

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

Bài kiểm thử này dùng testTag để tìm LazyColumn và hất nó:

@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)
            }
        }
    }
}

Quá trình đo điểm chuẩn của bạn không bắt buộc phải cuộn giao diện người dùng. Thay vào đó, quá trình này có thể chạy ảnh động hoặc dùng phương thức khác. Quá trình này cũng không cần phải sử dụng UI Automator Nó thu thập các chỉ số hiệu suất miễn là các khung hình đang được tạo.

Đôi khi, bạn có thể muốn đo điểm chuẩn một màn hình cụ thể không xuất hiện ngay khi ứng dụng khởi động, chẳng hạn như màn hình chi tiết hoặc trang thanh toán nằm sâu trong biểu đồ Điều hướng Jetpack.

Vì Macrobenchmark chạy ngoài quy trình, nên bạn không thể tương tác trực tiếp với NavController để hoán đổi màn hình. Thay vào đó, điểm chuẩn của bạn phải mô phỏng một người dùng di chuyển đến phần đó của ứng dụng.

Sử dụng setupBlock để xử lý các bước chuẩn bị, chẳng hạn như nhấp vào một quy trình giới thiệu hoặc nút trình đơn. Bằng cách này, measureBlock của bạn chỉ ghi lại các chỉ số hiệu suất của màn hình mục tiêu.

@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)
        }
    }
}

Tài nguyên khác

Để biết thêm thông tin về quy trình kiểm thử, hãy xem các tài nguyên sau.

Tài liệu

Xem nội dung