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

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

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

Для получения информации об общей структуре Atest обратитесь к Руководству разработчика Atest .

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

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

Настройка вашей среды

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

Установить переменную среды

Установите test_suite для Soong или LOCAL_COMPATIBILITY_SUITE для Make, следуя правилам сценария сборки упаковки .

Запустите envsetup.sh

Из корня проверки исходного кода Android запустите:

source build/envsetup.sh

Беги lunch

Запустите команду lunch , чтобы вызвать меню поддерживаемых устройств. Найдите устройство и выполните эту команду.

Например, если у вас подключено устройство ARM, выполните следующую команду:

lunch aosp_arm64-eng

Это устанавливает различные переменные среды, необходимые для запуска Atest, и добавляет команду Atest в ваш $PATH .

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

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

atest test-to-run [optional-arguments]

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

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

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

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

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

Запускаем из Android repo-root :

atest cts/tests/video

Запускаем из Android repo-root/cts/tests/video :

    atest .

Запустите тестовый класс

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

Из repo-root Android:

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

Запустите интеграционный тест

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

    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 поддерживает запуск определенных методов внутри тестового класса. Несмотря на то, что необходимо построить весь модуль, это сокращает время, необходимое для запуска тестов. Чтобы запустить определенные методы, идентифицируйте класс, используя любой из способов, поддерживаемых для идентификации класса (модуль: класс, путь к файлу и т. д.), и добавьте имя метода:

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 (32-разрядная версия ARM) и arm64-v8a (64-разрядная версия ARM).

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

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 .

Запустите тесты postsubmit в файлах 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 --include-subdirs 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

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