Тестирование из командной строки

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

Инструменты командной строки и задачи Gradle, описанные на этой странице, не зависят от набора инструментов интерфейса. Если вы хотите написать тесты интерфейса для Compose, ознакомьтесь со статьей Как тестировать макеты Compose. После того как вы напишете тесты, следуйте инструкциям в этом руководстве, чтобы запустить их из терминала или удаленной среды непрерывной интеграции.

Если вы создаете приложение с помощью системы сборки Gradle, плагин Android Gradle позволяет запускать тесты из проекта Gradle с помощью командной строки. Для более точного контроля вы можете запустить тесты через оболочку Android Debug Bridge (adb). Это может быть полезно при тестировании в среде непрерывной интеграции.

Чтобы узнать, как запускать автоматизированные инструментальные тесты из командной строки с помощью виртуальных устройств под управлением Gradle, прочитайте статью Масштабирование тестов с помощью устройств под управлением Gradle.

Как запускать тесты с помощью Gradle

Плагин Android Gradle позволяет запускать тесты из проекта Gradle с помощью командной строки.

В таблице ниже показано, как запускать тесты с помощью Gradle.

Таблица 1. Разные способы запуска тестов с помощью Gradle

Тип модульного тестирования Команда для выполнения Место проведения тестирования
Локальное модульное тестирование Запустите задачу test:

./gradlew test
Файлы результатов тестирования HTML:
path_to_your_project/module_name/build/reports/tests/ каталог.

XML-файлы с результатами тестирования:
path_to_your_project/module_name/build/test-results/ directory.

Инструментированное модульное тестирование Выполните задачу connectedAndroidTest:

./gradlew connectedAndroidTest
Файлы результатов тестирования HTML:
path_to_your_project/module_name/build/reports/androidTests/connected/ каталог.

XML-файлы с результатами тестирования:
path_to_your_project/module_name/build/outputs/androidTest-results/connected/ directory.

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

./gradlew cAT

Вы также можете запустить задачи Gradle check и connectedCheck. Эти задачи запускают локальные или инструментальные тесты, но включают другие проверки, добавленные другими плагинами Gradle.

Как запустить тесты для модуля

Задачи test и connectedAndroidTest выполняют тестирование каждого модуля в вашем проекте. Чтобы запустить тесты для определенного модуля, добавьте перед задачей test или connectedAndroidTest название модуля и двоеточие (:). Например, следующая команда запускает инструментальные тесты только для модуля mylibrary:

./gradlew mylibrary:connectedAndroidTest

Как запустить тесты для варианта сборки

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

  • Для локальных модульных тестов:
    ./gradlew testVariantNameUnitTest
  • Для инструментальных тестов:
    ./gradlew connectedVariantNameAndroidTest

Запуск определенных методов или классов тестирования

При запуске локального модульного тестирования Gradle позволяет выбирать определенные тесты с помощью флага --tests. Например, следующая команда запускает только тесты sampleTestMethod для указанного варианта сборки. Чтобы узнать больше о том, как использовать флаг --tests, ознакомьтесь с документацией Gradle по фильтрации тестов.


./gradlew testVariantNameUnitTest --tests '*.sampleTestMethod'

Как запускать тесты с помощью adb

При запуске тестов из командной строки с помощью Android Debug Bridge (adb) доступно больше вариантов выбора тестов, чем при использовании любого другого метода. Вы можете выбрать отдельные методы тестирования, отфильтровать тесты по специальной аннотации или задать параметры тестирования. Поскольку тестовый запуск полностью контролируется из командной строки, вы можете настраивать тестирование с помощью сценариев командной оболочки различными способами.

Чтобы запустить тест из командной строки, выполните команду adb shell. На устройстве или в эмуляторе откроется командная строка. В этой оболочке можно взаимодействовать с менеджером действий с помощью команды am и использовать ее подкоманду instrument для запуска тестов.

Чтобы сэкономить время, вы можете запустить оболочку adb, вызвать am instrument и указать флаги командной строки в одной строке ввода. Оболочка открывается на устройстве или эмуляторе, запускает тесты, выводит результаты и возвращается к командной строке на компьютере.

Чтобы запустить тест с помощью am instrument:

  1. Скомпилируйте или перекомпилируйте основное приложение и тестовый пакет.
  2. Установите тестовый пакет и основные файлы пакета Android (APK) на текущее устройство Android или эмулятор.
  3. В командной строке введите:

    adb shell am instrument -w <test_package_name>/<runner_class>

    где <test_package_name> – название пакета Android вашего тестового приложения, а <runner_class> – название используемого вами класса Android Test Runner. Название пакета Android – это значение атрибута package элемента manifest в файле манифеста тестового пакета (AndroidManifest.xml).

    Класс Android Test Runner обычно выглядит так: AndroidJUnitRunner.

    adb shell am instrument -w com.android.example/androidx.test.runner.AndroidJUnitRunner

Результаты тестирования появятся в STDOUT.

Флаги am instrument

Чтобы посмотреть список всех параметров, которые можно использовать с командой am instrument, выполните команду adb shell am help. Некоторые важные флаги описаны в таблице ниже.

Таблица 2. am instrument важных пометок

Флаг Значение Описание
-w (нет) Заставляет am instrument ждать завершения инструментирования, прежде чем завершить работу. Это позволит оставить оболочку открытой до завершения тестов. Этот параметр необходим для просмотра результатов тестирования.
-r (нет) Выводит результаты в необработанном формате. Используйте этот флаг, если хотите собирать данные об эффективности, чтобы они не форматировались как результаты тестирования. Этот флаг предназначен для использования с флагом -e perf true (описан в разделе Параметры инструмента am).
-e <test_options> Предоставляет параметры тестирования в виде пар "ключ-значение". Инструмент am instrument передает их указанному классу инструментовки с помощью метода onCreate(). Вы можете указать несколько элементов -e <test_options>. Ключи и значения описаны в разделе Параметры am instrument. Эти пары "ключ-значение" можно использовать только с AndroidJUnitRunner. При использовании с другими классами они не будут работать.
--no-hidden-api-checks (нет) Отключает ограничения на использование скрытых API. Подробнее о том, что такое скрытые API и как они могут повлиять на ваше приложение, читайте в статье Ограничения на интерфейсы, не относящиеся к SDK.

Список инструментов

Инструмент am instrument передает параметры тестирования в AndroidJUnitRunner или InstrumentationTestRunner в виде пар "ключ-значение" с помощью флага -e. Синтаксис:

-e <key> <value>

Некоторые ключи могут принимать несколько значений. Несколько значений можно указать в виде списка, разделенного запятыми. Например, в этом вызове AndroidJUnitRunner для ключа package указано несколько значений:

adb shell am instrument -w -e package com.android.test.package1,com.android.test.package2 \
> com.android.test/androidx.test.runner.AndroidJUnitRunner

В таблице ниже перечислены пары "ключ-значение", которые можно использовать с инструментом тестирования.

Таблица 3. Пары "ключ-значение" флага -e для использования с исполнителем тестов

Ключ Значение Описание
package <Java_package_name> Полное название пакета Java для одного из пакетов в тестовом приложении. Будет выполнен любой класс тестового сценария, использующий это название пакета. Обратите внимание, что это не название пакета Android. Тестовый пакет имеет одно название пакета Android, но может содержать несколько пакетов Java.
class <class_name> Полное имя класса Java для одного из классов тестовых сценариев. Будет выполнен только этот класс тестовых случаев.
<class_name>#method name Полное имя класса тестового сценария и один из его методов. Выполняется только этот метод. Обратите внимание на символ решетки (#) между названием класса и названием метода.
size [small | medium | large] Запускает метод тестирования, аннотированный по размеру. Аннотации: @SmallTest, @MediumTest и @LargeTest.
debug true Запускает тесты в режиме отладки.
log true Загружает и регистрирует все указанные тесты, но не запускает их. Информация о тесте появится в STDOUT. Используйте этот фильтр, чтобы проверить сочетания других фильтров и спецификаций тестирования.
emma true Выполняет анализ покрытия кода EMMA и записывает выходные данные в /data/<app_package>/coverage.ec на устройстве. Чтобы переопределить местоположение файла, используйте ключ coverageFile, описанный в следующей записи.

Примечание. Для этого варианта требуется сборка тестового приложения с инструментами EMMA, которую можно создать с помощью цели coverage.

coverageFile <filename> Переопределяет местоположение файла покрытия EMMA на устройстве, заданное по умолчанию. Укажите значение в виде пути и имени файла в формате UNIX. Название файла по умолчанию описано в записи для ключа emma.

При использовании флага -e учитывайте следующее:

  • am instrument вызывает onCreate(Bundle) с Bundle, содержащим пары "ключ-значение".
  • Ключ package имеет приоритет над ключом class. Если вы укажете пакет, а затем отдельно укажете класс в этом пакете, Android выполнит все тесты в пакете и проигнорирует ключ класса.
  • Ключи func и unit являются взаимоисключающими.

Примеры использования

В разделах ниже приведены примеры использования am instrument для тестирования. Они имеют следующую структуру:

  • Название пакета Android тестового пакета – com.android.demo.app.tests.
  • Два класса инструментальных тестов:
    • TestClass1, в котором содержится метод тестирования testMethod1.
    • TestClass2, который содержит методы тестирования testMethod2 и testMethod3.
  • Тестирование выполняет AndroidJUnitRunner.

Запустите весь пакет тестов.

Чтобы запустить все тестовые классы в тестовом пакете, введите:

adb shell am instrument -w com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Как запустить все тесты в классе тестового случая

Чтобы запустить все тесты в классе TestClass1, введите:

adb shell am instrument -w  \
> -e class com.android.demo.app.tests.TestClass1 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Выберите подгруппу тестов

Чтобы запустить все тесты в классе TestClass1 и методе testMethod3 в TestClass2, введите:

adb shell am instrument -w \
> -e class com.android.demo.app.tests.TestClass1,com.android.demo.app.tests.TestClass2#testMethod3 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Другие примеры использования можно найти в AndroidJUnitRunner справочной документации по API.

Как посмотреть унифицированные отчеты о тестировании

Плагин Android Gradle предоставляет унифицированные задачи тестирования, которые генерируют HTML-панели, объединяющие результаты модульных и инструментальных тестов.

Требования

  • Плагин Android Gradle версии 9.5.0-alpha05 или более поздней.

Чтобы запустить все наборы тестов, выполните одну из следующих задач:

Область действия отчета Команда Описание Местоположение ошибки
Текущий модуль ./gradlew :module_name:testAllSuites --continue Создает единый отчет о тестировании для текущего модуля, объединяя результаты модульного и инструментального тестирования. path_to_your_project/module_name/build/reports/testAllSuites/test-report/
Текущий модуль и зависимости ./gradlew :module_name:testAllSuitesWithDependencies --continue Создает единый отчет о тестировании для текущего модуля и его зависимостей библиотеки, объединяя результаты модульного и инструментального тестирования. path_to_your_project/module_name/build/reports/testAllSuitesWithDependencies/test-report/