Тесты на базе Instrumentation

Сначала прочитайте статью Как тестировать приложение на сайте developer.android.com. Обратите внимание, что в тестировании платформы инструментальные тесты используются несколько иначе.

Таким образом, инструментальный тест предоставляет специальную среду выполнения, которая запускается с помощью команды am instrument. В этой среде целевой процесс приложения перезапускается и инициализируется с базовым контекстом приложения, а в виртуальной машине процесса приложения запускается поток инструментария. Ваш код начинает выполняться в этом потоке и получает экземпляр Instrumentation, который предоставляет доступ к контексту приложения и API для управления тестируемым процессом.

Основные понятия

  • Инструментарий должен быть объявлен в пакете приложения с помощью тега <instrumentation>, вложенного в тег <manifest> манифеста пакета приложения.
  • Манифест пакета приложения может технически содержать несколько тегов <instrumentation>, хотя это не является распространенной практикой.
  • Каждый элемент <instrumentation> должен содержать:
    • атрибут android:name, который должен содержать название подкласса Instrumentation, включенного в тестовое приложение (обычно это используемый тест-раннер), например:android.support.test.runner.AndroidJUnitRunner.
    • атрибут android:targetPackage. В качестве значения нужно указать пакет тестируемого приложения.

Список шагов

  1. Ниже приведены распространенные назначения для изолированных тестов сервисов фреймворка.

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

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

  2. Если вы добавляете тесты в одно из указанных выше мест, следуйте существующим правилам. Если вы настраиваете новый тестовый модуль, следуйте инструкциям по настройке AndroidManifest.xml и Android.mk в одном из указанных выше мест.

  3. Пример можно найти в файле frameworks/base/core/tests/coretests/. Обратите внимание, что эти строки устанавливают дополнительные приложения:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. Не забудьте пометить тест как @SmallTest, @MediumTest или @LargeTest.

  5. Создайте тестовый модуль с помощью команды m, например:

    m FrameworksCoreTests
    
  6. Запустите тесты:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Если вы не используете Tradefed, установите и запустите тесты вручную:

    1. Установите сгенерированный APK-файл:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Проводите тестирование с разными вариантами:

      1. все тесты в APK-файле;

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. все тесты в определенном пакете Java;

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. все тесты определенного класса;

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. определенный метод тестирования;

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

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

Чтобы передавать показатели эффективности, код теста может вызывать функцию Instrumentation#sendStatus, отправляющую список пар "ключ-значение". Важно отметить, что:

  1. показатели могут быть целыми числами или числами с плавающей запятой;
  2. все нечисловые значения будут отброшены;
  3. Тестовый APK-файл может содержать функциональные тесты или тесты показателей, но не оба типа одновременно.