Запуск тестов (Атест)

Atest — это инструмент командной строки, позволяющий пользователям создавать, устанавливать и запускать тесты Android локально, что значительно ускоряет повторные запуски тестов без необходимости знания параметров командной строки Trade Federation Test Harvest . На этой странице объясняется, как использовать Atest для запуска тестов Android.

Общую информацию о написании тестов для Android см. в разделе Тестирование платформы Android .

Информацию об общей структуре Atest см. в Руководстве разработчика Atest .

Информацию о запуске тестов в файлах TEST_MAPPING через Atest см. в разделе Запуск тестов в файлах TEST_MAPPING .

Чтобы добавить функцию в Atest, следуйте рабочему процессу разработчика Atest .

Настройте свою среду

Чтобы настроить среду Atest, следуйте инструкциям в разделах Настройка среды , Выбор цели и Сборка кода .

Базовое использование

Команды Atest имеют следующий вид:

atest test-to-run [optional-arguments]

Необязательные аргументы

В следующей таблице перечислены наиболее часто используемые аргументы. Полный список доступен через atest --help .

Вариант Длинный опцион Описание
-b --build Создает тестовые цели. (по умолчанию)
-i --install Устанавливает тестовые артефакты (APK) на устройство. (по умолчанию)
-t --test Запускает тесты. (по умолчанию)
-s --serial Запускает тесты на указанном устройстве. Одновременно можно тестировать только одно устройство.
-d --disable-teardown Отключает возможность демонтажа и очистки теста.
--dry-run Пробный запуск Atest без фактического построения, установки или запуска тестов.
-m --rebuild-module-info Принудительно перестраивает файл module-info.json .
-w --wait-for-debugger Ожидает завершения работы отладчика перед выполнением.
-v --verbose Отображает журнал уровня DEBUG.
--iterations Циклически выполняет тесты до тех пор, пока не будет достигнуто максимальное количество итераций (по умолчанию 10).
--rerun-until-failure [COUNT=10] Повторно запускает все тесты до тех пор, пока не произойдет сбой или не будет достигнуто максимальное количество итераций (по умолчанию 10).
--retry-any-failure [COUNT=10] Повторно запускает неудачные тесты до тех пор, пока они не будут пройдены или не будет достигнуто максимальное количество итераций (по умолчанию 10).
--start-avd Автоматически создает AVD и запускает тесты на виртуальном устройстве.
--acloud-create Создает AVD с помощью команды acloud .
--[CUSTOM_ARGS] Задает пользовательские аргументы для исполнителей тестов.
-a --all-abi Запускает тесты для всех доступных архитектур устройств.
--host Запускает тест полностью на хосте без устройства.
Примечание: запуск теста хоста, требующего устройства с --host , завершится неудачей.
--history Показывает результаты теста в хронологическом порядке.
--latest-result Распечатывает последний результат теста.

Дополнительную информацию о -b , -i и -t смотрите в разделе Укажите шаги: сборка, установка или запуск .

Укажите тесты

Для запуска тестов укажите один или несколько тестов, используя один из следующих идентификаторов:

  • Имя модуля
  • Модуль:Класс
  • Имя класса
  • Интеграционный тест Tradefed
  • Путь к файлу
  • Имя пакета

Разделяйте ссылки на несколько тестов пробелами, например:

atest test-identifier-1 test-identifier-2

Имя модуля

Чтобы запустить весь тестовый модуль, используйте его имя. Введите имя, указанное в переменных LOCAL_MODULE или LOCAL_PACKAGE_NAME в файле Android.mk или Android.bp для этого теста.

Примеры:

atest FrameworksServicesTests
atest CtsVideoTestCases

Модуль:Класс

Чтобы запустить один класс внутри модуля, используйте Module:Class . Module — то же самое, что описано в разделе «Имя модуля» . Class — это имя тестового класса в файле .java , которое может быть как полным именем класса, так и базовым именем.

Примеры:

atest CtsVideoTestCases:VideoEncoderDecoderTest
atest FrameworksServicesTests:ScreenDecorWindowTests
atest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests

Имя класса

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

Примеры:

atest ScreenDecorWindowTests
atest VideoEncoderDecoderTest

Интеграционный тест Tradefed

Для запуска тестов, интегрированных непосредственно в TradeFed (не являющихся модулями), введите имя, как оно указано в выводе команды tradefed.sh list configs . Например:

Чтобы запустить тест reboot.xml :

atest example/reboot

Чтобы запустить тест native-benchmark.xml :

atest native-benchmark

Путь к файлу

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

Запустить модуль

В следующих примерах показаны два способа запуска модуля CtsVideoTestCases с использованием пути к файлу.

Запустить из Android repo-root :

atest cts/tests/video

Запустить из repo-root/cts/tests/video :

    atest .

Провести тестовый класс

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

Из repo-root Android:

    atest cts/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java

Провести интеграционный тест

В следующем примере показано, как запустить интеграционный тест, используя путь к файлу из Android repo-root :

    atest tools/tradefederation/contrib/res/config/example/reboot.xml

Имя пакета

Atest поддерживает поиск тестов по названию пакета.

Примеры:

    atest com.android.server.wm
    atest com.android.uibench.janktests

Укажите шаги: сборка, установка или запуск

Используйте параметры -b , -i и -t чтобы указать, какие шаги нужно выполнить. Если параметр не указан, будут выполнены все шаги.

  • Только цели сборки: atest -b test-to-run
  • Запускать только тесты: atest -t test-to-run
  • Установите apk и запустите тесты: atest -it test-to-run
  • Собрать и запустить, но не устанавливать: atest -bt test-to-run

Atest может принудительно пропустить этап очистки или демонтажа. Многие тесты, например, CTS, очищают устройство после выполнения, поэтому попытка повторного запуска теста с -t без параметра --disable-teardown завершится ошибкой. Используйте -d перед опцией -t , чтобы пропустить этап очистки и проводить итеративное тестирование.

atest -d test-to-run
atest -t test-to-run

Выполнение определенных методов

Atest поддерживает запуск определённых методов в тестовом классе. Хотя требуется сборка всего модуля, это сокращает время выполнения тестов. Чтобы запустить определённые методы, укажите класс любым из поддерживаемых способов (Module:Class, путь к файлу и т. д.) и добавьте имя метода:

atest reference-to-class#method1

При указании нескольких методов разделяйте их запятыми:

atest reference-to-class#method1,method2,method3

Примеры:

atest com.android.server.wm.ScreenDecorWindowTests#testMultipleDecors
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval

В следующих двух примерах показаны предпочтительные способы запуска одного метода, testFlagChange . Эти примеры предпочтительнее, чем использование только имени класса, поскольку указание модуля или расположения файла Java позволяет Atest гораздо быстрее находить тест.

Использование модуля:класса:

atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange

Из repo-root Android:

atest frameworks/base/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java#testFlagChange

Несколько методов могут быть запущены из разных классов и модулей:

atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval ScreenDecorWindowTests#testMultipleDecors

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

Чтобы запустить несколько классов, разделяйте их пробелами, как и при запуске нескольких тестов. Atest эффективно собирает и запускает классы, поэтому указание подмножества классов в модуле повышает производительность по сравнению с запуском всего модуля.

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

atest FrameworksServicesTests:ScreenDecorWindowTests FrameworksServicesTests:DimmerTests

Чтобы запустить два класса в разных модулях:

atest FrameworksServicesTests:ScreenDecorWindowTests CtsVideoTestCases:VideoEncoderDecoderTest

Запустить исполняемые файлы GTest

Atest может запускать исполняемые файлы GTest. Используйте -a для запуска этих тестов на всех доступных архитектурах устройств, в данном примере это armeabi-v7a (ARM 32-бит) и arm64-v8a (ARM 64-бит).

Пример входного теста:

atest -a libinput_tests inputflinger_tests

Чтобы выбрать конкретный двоичный файл GTest для запуска, используйте двоеточие (:) для указания имени теста и хэштег (#) для дальнейшего указания отдельного метода.

Например, для следующего определения теста:

TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents)

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

atest inputflinger_tests:InputDispatcherTest

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

atest inputflinger_tests:InputDispatcherTest#InjectInputEvent_ValidatesKeyEvents

Запуск тестов в TEST_MAPPING

Atest может запускать тесты в файлах TEST_MAPPING .

Выполнять предварительные тесты неявно

Запустите предварительные тесты в файлах TEST_MAPPING в текущем и родительском каталогах:

atest

Запустите предварительные тесты в файлах TEST_MAPPING в /path/to/project и его родительских каталогах:

atest --test-mapping /path/to/project

Запустить указанную тестовую группу

Доступны следующие тестовые группы: presubmit (по умолчанию), postsubmit , mainline-presubmit и all .

Запустите тесты после отправки в файлах TEST_MAPPING в текущем и родительском каталогах:

atest :postsubmit

Запустить тесты из всех групп в файлах TEST_MAPPING:

atest :all

Запустите тесты после отправки в файлах TEST_MAPPING в /path/to/project и его родительских каталогах:

atest --test-mapping /path/to/project:postsubmit

Запустите основные тесты в файлах TEST_MAPPING в /path/to/project и его родительских каталогах:

atest --test-mapping /path/to/project:mainline-presubmit

Запуск тестов в подкаталогах

По умолчанию Atest ищет тесты только в файлах TEST_MAPPING (от текущего или заданного каталога до его родительских каталогов). Если вы также хотите запустить тесты в файлах TEST_MAPPING в подкаталогах, используйте --include-subdirs , чтобы Atest включил и эти тесты:

atest --include-subdirs /path/to/project

Выполнять тесты в итерациях

Запускайте тесты в итеративном режиме, передав аргумент --iterations . Независимо от того, пройден ли тест или нет, Atest будет повторять его до достижения максимального количества итераций.

Примеры:

По умолчанию Atest выполняет 10 итераций. Количество итераций должно быть положительным целым числом.

atest test-to-run --iterations
atest test-to-run --iterations 5

Следующие подходы облегчают обнаружение ненадежных тестов:

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

  • Остановитесь, если произойдет сбой или итерация достигнет 10-го (по умолчанию) раунда.
    atest test-to-run --rerun-until-failure
    
  • Остановитесь, если произойдет сбой или итерация достигнет 100-го раунда.
    atest test-to-run --rerun-until-failure 100
    

Подход 2: Запускать только неудачные тесты до тех пор, пока они не будут пройдены или не будет достигнуто максимальное количество итераций.

  • Предположим, что test-to-run задействовано несколько тестовых случаев, и один из них не пройден. Запустите только не пройденный тест 10 раз (по умолчанию) или до тех пор, пока тест не будет пройден.
    atest test-to-run --retry-any-failure
    
  • Остановите выполнение неудавшегося теста, когда он пройдет успешно или достигнет 100-го раунда.
    atest test-to-run --retry-any-failure 100
    

Проведение тестов на AVD

Atest может запускать тесты на только что созданном AVD. Запустите acloud create , чтобы создать AVD и собрать артефакты, а затем используйте следующие примеры для запуска тестов.

Запустите AVD и проведите на нем тесты:

acloud create --local-instance --local-image && atest test-to-run

Запустите AVD в рамках тестового прогона:

atest test-to-run --acloud-create "--local-instance --local-image"

Для получения более подробной информации выполните acloud create --help .

Передать параметры модулю

Atest может передавать параметры тестовым модулям. Чтобы добавить параметры командной строки TradeFed в тестовый запуск, используйте следующую структуру и убедитесь, что ваши пользовательские аргументы соответствуют формату параметров командной строки TradeFed.

atest test-to-run -- [CUSTOM_ARGS]

Передайте параметры тестового модуля целевым подготовителям или исполнителям тестов, определенным в файле конфигурации теста:

atest test-to-run -- --module-arg module-name:option-name:option-value
atest GtsPermissionTestCases -- --module-arg GtsPermissionTestCases:ignore-business-logic-failure:true

Передать параметры типу или классу бегуна:

atest test-to-run -- --test-arg test-class:option-name:option-value
atest CtsVideoTestCases -- --test-arg com.android.tradefed.testtype.JarHosttest:collect-tests-only:true

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