Uygulamanızı Macrobenchmark'tan kontrol edin

Çoğu Android kullanıcı arayüzü testinin aksine Macrobenchmark testleri ayrı bir işlemde çalışır. görebilirsiniz. Bu işlem, uygulama işlemi ve DEX bayt kodundan makine koduna derleme.

Uygulamanızın durumunu UIAutomator kitaplığını veya başka araçları kullanarak değiştirebilirsiniz hedef uygulamayı test sürecinde kontrol edebilen mekanizmalar kullanmak anlamına gelir. Espresso veya ActivityScenario'i şunun için kullanamazsınız: Makrobenchmark'ı kullanma nedeni, uygulamayla paylaşılan bir süreçte çalışmayı beklemesidir.

Aşağıdaki örnekte, kaynak kimliğini veRecyclerView birkaç kez aşağı kaydırır:

Kotlin

@Test
fun scrollList() {
    benchmarkRule.measureRepeated(
        // ...
        setupBlock = {
            // Before starting to measure, navigate to the UI to be measured
            val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY")
            startActivityAndWait(intent)
        }
    ) {
        val recycler = device.findObject(By.res(packageName, "recycler"))
        // Set gesture margin to avoid triggering gesture navigation
        // with input events from automation.
        recycler.setGestureMargin(device.displayWidth / 5)

        // Scroll down several times
        repeat(3) { recycler.fling(Direction.DOWN) }
    }
}

Java

@Test
public void scrollList() {
    benchmarkRule.measureRepeated(
        // ...
        /* setupBlock */ scope -> {
            // Before measuring, navigate to the UI to be measured.
            val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY")
            scope.startActivityAndWait();
            return Unit.INSTANCE;
        },
        /* measureBlock */ scope -> {
            UiDevice device = scope.getDevice();
            UiObject2 recycler = device.findObject(By.res(scope.getPackageName(), "recycler"));

            // Set gesture margin to avoid triggering gesture navigation
            // with input events from automation.
            recycler.setGestureMargin(device.getDisplayWidth() / 5);

            // Fling the recycler several times.
            for (int i = 0; i < 3; i++) {
                recycler.fling(Direction.DOWN);
            }

            return Unit.INSTANCE;
        }
    );
}

Karşılaştırmanız için kullanıcı arayüzünü kaydırmanız gerekmez. Bunun yerine, örneğine bakalım. Ayrıca, kullanıcı arayüzü otomatikleştiricisi merak ediyor. Kareler oynatıldığı sürece performans metriklerini toplar. Jetpack Compose tarafından oluşturulan kareler de dahil olmak üzere görüntüleme sistemi tarafından üretilen.

Bazen uygulamanızın doğrudan alakalı olmayan kısımlarına dışarıdan erişilebilir. Bu, örneğin dahili etkinliklere erişmek olabilir. exported=false ile işaretli olan, bir Fragment öğesine giden veya hızlıca kaydırılanlar bir kısmı karşınıza çıkabilir. Karşılaştırmaların, bu metriklere manuel olarak bazı bölümleri kapsıyor.

Manuel olarak gezinmek için setupBlock{} içindeki kodu şunu içerecek şekilde değiştirin: istediğiniz efekt (ör. düğmeye dokunma veya kaydırma) sağlayın. measureBlock{} şunu içeriyor: yalnızca gerçekten karşılaştırmak istediğiniz kullanıcı arayüzü değişikliği:

Kotlin

@Test
fun nonExportedActivityScrollList() {
    benchmarkRule.measureRepeated(
        // ...
        setupBlock = setupBenchmark()
    ) {
        // ...
    }
}

private fun setupBenchmark(): MacrobenchmarkScope.() -> Unit = {
    // Before starting to measure, navigate to the UI to be measured
    startActivityAndWait()

    // click a button to launch the target activity.
    // While we use button text  here to find the button, you could also use
    // accessibility info or resourceId.
    val selector = By.text("RecyclerView")
    if (!device.wait(Until.hasObject(selector), 5_500)) {
        fail("Could not find resource in time")
    }
    val launchRecyclerActivity = device.findObject(selector)
    launchRecyclerActivity.click()

    // wait until the activity is shown
    device.wait(
        Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")),
        TimeUnit.SECONDS.toMillis(10)
    )
}

Java

@Test
public void scrollList() {
    benchmarkRule.measureRepeated(
        // ...
        /* setupBlock */ scope -> {
            // Before measuring, navigate to the default activity.
            scope.startActivityAndWait();

            // Click a button to launch the target activity.
            // While you use resourceId here to find the button, you can also
            // use accessibility info or button text content.
            UiObject2 launchRecyclerActivity = scope.getDevice().findObject(
                By.res(packageName, "launchRecyclerActivity")
            )
            launchRecyclerActivity.click();

            // Wait until activity is shown.
            scope.getDevice().wait(
                Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")),
                10000L
            )

            return Unit.INSTANCE;
        },
        /* measureBlock */ scope -> {
            // ...
        }
    );
}
ziyaret edin.