Создание микротестов без Gradle

На этой странице описывается настройка системы сборки, отличной от Gradle, при использовании библиотеки Microbenchmark.

Хотя библиотека Microbenchmark включает плагин Gradle для непосредственной интеграции с плагином Android Gradle, вы также можете использовать его в других системах сборки, таких как Bazel или Buck .

Инструментарий

Используйте AndroidBenchmarkRunner или его подкласс в качестве средства запуска инструментов, указав его в блоке инструментов манифеста теста:

<manifest
    package="com.example.library.test" ...>

    <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" />
    ...
</manifest>

Чтобы получить точные измерения, тесты не должны быть отлаживаемыми . Если вы неправильно установите флаг отладки, библиотека выдаст ошибку, а не сообщит о неверных результатах. Возможно, вам придется переключить этот параметр во время локальных запусков для использования с профилировщиками Android Studio, для которых требуется debuggable=true .

Вы можете создавать микробенчмарки для запуска двумя способами: в составе APK с самоинструментом или с помощью одного тестового APK, инструментирующего другой APK.

Самоинструментируемые APK-файлы

При использовании APK с самоинструментированием (вывод Gradle для каталога androidTest из com.android.library ) вы должны отключить отладку в манифесте Android отдельного APK:

<manifest
    package="com.example.library.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.library.test"/>

    <application android:debuggable="false"/>
</manifest>

APK-файл приложения, оснащенный тестовым APK

Если ваша сборка выводит два APK — APK приложения и тестовый APK, как выходные данные Gradle для каталога androidTest из пакета com.android.app — вы должны установить для APK приложения значение debuggable=false . Флаг отладки тестового APK игнорируется ОС Android.

<!-- Test manifest. -->
<manifest
    package="com.example.android.app.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.android.app"/>
    <!-- This debuggable is ignored by the OS. -->
</manifest>

<!-- App being tested. -->
<manifest
    package="com.example.android.app" ...>

    <application android:debuggable="false"/>
</manifest>

Android Studio и Gradle не поддерживают микробенчмаркинг APK-модуля приложения. Это связано со сложностью поддержки дополнительного каталога тестирования, который зависит от неотлаживаемого, оптимизированного или минимизированного варианта APK, но без минификации, разбивающей вызовы из тестов в код приложения.

Сборник

Мы рекомендуем скомпилировать APK-файл микробенчмарка перед запуском тестов, используя следующую команду:

adb shell cmd package compile -f -m speed com.example.benchmark

Минификация и оптимизация

Мы рекомендуем использовать минификацию и оптимизацию для ваших тестов, чтобы получить производительность, близкую к релизной. Пример кода см. в примере проекта Benchmark .

Покрытие кода

Мы рекомендуем запускать тесты с отключенным покрытием и без использования каких-либо библиотек или DEX с помощью таких инструментов, как JaCoCo.

По этой причине мы рекомендуем вам изолировать тесты в качестве исходного набора от других инструментальных тестов и собирать их отдельно с зависимостями от выпуска. Это позволяет избежать необходимости создавать тесты более одного раза, как с покрытием, так и без него.

Отладочные варианты библиотек, от которых зависит ваш тест, особенно те, которые созданы локально, могут быть созданы с включенным покрытием.

Запустите свои тесты

Вы можете запускать тесты из командной строки и указывать классы для запуска, как показано в следующем примере:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Чтобы настроить библиотеку Microbenchmark во время выполнения без Gradle, см. раздел Аргументы инструментария Microbenchmark .

{% дословно %} {% дословно %} {% дословно %} {% дословно %}