Сначала прочитайте статью Как тестировать приложение на сайте developer.android.com. Обратите внимание, что в тестировании платформы инструментальные тесты используются несколько иначе.
Таким образом, инструментальный тест предоставляет специальную среду выполнения, которая запускается с помощью команды am instrument. В этой среде целевой процесс приложения перезапускается и инициализируется с базовым контекстом приложения, а в виртуальной машине процесса приложения запускается поток инструментария. Ваш код начинает выполняться в этом потоке и получает экземпляр Instrumentation, который предоставляет доступ к контексту приложения и API для управления тестируемым процессом.
Основные понятия
- Инструментарий должен быть объявлен в пакете приложения с помощью тега
<instrumentation>, вложенного в тег<manifest>манифеста пакета приложения. - Манифест пакета приложения может технически содержать несколько тегов
<instrumentation>, хотя это не является распространенной практикой. - Каждый элемент
<instrumentation>должен содержать:- атрибут
android:name, который должен содержать название подклассаInstrumentation, включенного в тестовое приложение (обычно это используемый тест-раннер), например:android.support.test.runner.AndroidJUnitRunner. - атрибут
android:targetPackage. В качестве значения нужно указать пакет тестируемого приложения.
- атрибут
Список шагов
Ниже приведены распространенные назначения для изолированных тестов сервисов фреймворка.
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestestsЕсли вы добавляете новый модуль для компонента, ознакомьтесь с
Если вы добавляете тесты в одно из указанных выше мест, следуйте существующим правилам. Если вы настраиваете новый тестовый модуль, следуйте инструкциям по настройке
AndroidManifest.xmlиAndroid.mkв одном из указанных выше мест.Пример можно найти в файле frameworks/base/core/tests/coretests/. Обратите внимание, что эти строки устанавливают дополнительные приложения:
<option name="test-file-name" value="FrameworksCoreTests.apk" /> <option name="test-file-name" value="BstatsTestApp.apk" />Не забудьте пометить тест как
@SmallTest,@MediumTestили@LargeTest.Создайте тестовый модуль с помощью команды m, например:
m FrameworksCoreTestsЗапустите тесты:
Самое простое решение – использовать Atest следующим образом:
atest FrameworksCoreTestsДля более сложных тестов используйте Trade Federation тестовая программа:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTestsЕсли вы не используете Tradefed, установите и запустите тесты вручную:
- Установите сгенерированный APK-файл:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apkПроводите тестирование с разными вариантами:
все тесты в APK-файле;
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnerвсе тесты в определенном пакете Java;
adb shell am instrument -w -e package android.animation \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnerвсе тесты определенного класса;
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnerопределенный метод тестирования;
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
В тесте можно явно указать, пройден он или нет, с помощью API JUnit. Кроме того, функциональный сбой произойдет при любом необработанном исключении.
Чтобы передавать показатели эффективности, код теста может вызывать функцию Instrumentation#sendStatus, отправляющую список пар "ключ-значение". Важно отметить, что:
- показатели могут быть целыми числами или числами с плавающей запятой;
- все нечисловые значения будут отброшены;
- Тестовый APK-файл может содержать функциональные тесты или тесты показателей, но не оба типа одновременно.