Класс AndroidJUnitRunner – это средство запуска тестов JUnit, которое позволяет запускать инструментированные тесты JUnit 4 на устройствах Android, в том числе с использованием фреймворков тестирования Espresso, UI Automator и Compose.
Он загружает тестовый пакет и тестируемое приложение на устройство, запускает тесты и сообщает об их результатах.
Этот инструмент поддерживает несколько распространенных задач тестирования, в том числе:
Как писать тесты JUnit
В следующем фрагменте кода показано, как написать инструментированный тест JUnit 4, чтобы проверить, правильно ли работает операция changeText в классе ChangeTextBehavior:
Kotlin
@RunWith(AndroidJUnit4::class) @LargeTest // Optional runner annotation class ChangeTextBehaviorTest { val stringToBeTyped = "Espresso" // ActivityTestRule accesses context through the runner @get:Rule val activityRule = ActivityTestRule(MainActivity::class.java) @Test fun changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()) onView(withId(R.id.changeTextBt)).perform(click()) // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))) } }
Java
@RunWith(AndroidJUnit4.class) @LargeTest // Optional runner annotation public class ChangeTextBehaviorTest { private static final String stringToBeTyped = "Espresso"; @Rule public ActivityTestRule<MainActivity>; activityRule = new ActivityTestRule<>;(MainActivity.class); @Test public void changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()); onView(withId(R.id.changeTextBt)).perform(click()); // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))); } }
Доступ к контексту приложения
При использовании AndroidJUnitRunner для запуска тестов вы можете получить доступ к контексту тестируемого приложения, вызвав статический метод ApplicationProvider.getApplicationContext(). Если вы создали собственный подкласс Application в приложении, этот метод возвращает контекст вашего подкласса.
Если вы разработчик инструментов, то можете получить доступ к низкоуровневым API тестирования с помощью класса InstrumentationRegistry. Этот класс включает объект Instrumentation, объект целевого приложения Context, объект тестового приложения Context и аргументы командной строки, переданные в тест.
Фильтровать тесты
В тестах JUnit 4.x для настройки выполнения тестов можно использовать аннотации. Эта функция сводит к минимуму необходимость добавления стандартного и условного кода в ваши тесты. Помимо стандартных аннотаций, поддерживаемых JUnit 4, средство запуска тестов также поддерживает аннотации, характерные для Android, в том числе следующие:
@RequiresDevice– указывает, что тест должен выполняться только на физических устройствах, а не на эмуляторах.@SdkSuppress– запрещает запуск теста на устройствах с уровнем API Android ниже указанного. Например, чтобы запретить выполнение тестов на всех уровнях API ниже 23, используйте аннотацию@SDKSuppress(minSdkVersion=23).@SmallTest,@MediumTestи@LargeTest– определяют, сколько времени должно занимать тестирование и, следовательно, как часто его можно проводить. Вы можете использовать эту аннотацию, чтобы отфильтровать тесты, которые нужно запустить, задав свойствоandroid.testInstrumentationRunnerArguments.size:
-Pandroid.testInstrumentationRunnerArguments.size=small
Тесты сегментов
Если вам нужно распараллелить выполнение тестов, распределяя их по нескольким серверам, чтобы ускорить работу, вы можете разделить их на группы, или сегменты. Программа запуска тестов позволяет разделить один набор тестов на несколько сегментов, чтобы вы могли легко запускать тесты, принадлежащие к одному сегменту, вместе как группу. Каждый сегмент идентифицируется по номеру индекса. При запуске тестов используйте параметр -e numShards, чтобы указать количество создаваемых сегментов, и параметр -e shardIndex, чтобы указать, какой сегмент нужно запустить.
Например, чтобы разделить набор тестов на 10 сегментов и запустить только тесты, сгруппированные во втором сегменте, используйте следующую команду adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Как использовать инструмент оркестрации тестов Android
Инструмент оркестрации тестов Android позволяет запускать каждый тест приложения в отдельном вызове Instrumentation. Если вы используете AndroidJUnitRunner версии 1.0 или выше, у вас есть доступ к инструменту оркестрации тестов Android.
Инструмент оркестрации тестов Android дает следующие преимущества:
- Минимальное общее состояние. Каждый тест выполняется в собственном экземпляре
Instrumentation. Поэтому, если ваши тесты используют общее состояние приложения, большая часть этого общего состояния удаляется из ЦП или памяти вашего устройства после каждого теста. Чтобы после каждого теста удалять все общее состояние из ЦП и памяти устройства, используйте флагclearPackageData. Пример приведен в разделе Включение с помощью Gradle. - Сбои изолированы. Даже если в одном тесте произойдет сбой, он затронет только его экземпляр
Instrumentation. Это означает, что другие тесты в вашем наборе по-прежнему выполняются, предоставляя полные результаты тестирования.
Из-за этого время выполнения тестов может увеличиться, поскольку Инструмент оркестрации тестов Android перезапускает приложение после каждого теста.
Инструмент оркестрации тестов Android предустановлен и в Android Studio, и в Firebase Test Lab, но в Android Studio его нужно включить.
Включение в Gradle
Чтобы включить Инструмент оркестрации тестов Android с помощью инструмента командной строки Gradle, выполните следующие действия:
- Шаг 1. Измените файл gradle. Добавьте в файл
build.gradleпроекта следующие строки:
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
}
dependencies {
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestUtil 'androidx.test:orchestrator:1.1.0'
}
- Шаг 2. Запустите инструмент оркестрации тестов Android, выполнив следующую команду:
./gradlew connectedCheck
Как включить функцию в Android Studio
Чтобы включить инструмент оркестрации тестов Android в Android Studio, добавьте в файл build.gradle приложения инструкции, приведенные в разделе Включение из Gradle.
Включить из командной строки
Чтобы использовать Инструмент оркестрации тестов Android в командной строке, выполните следующие команды в окне терминала:
DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)
FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
FORCE_QUERYABLE_OPTION="--force-queryable"
fi
# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator
# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk
# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.apk
# Replace "com.example.test" with the name of the package containing your tests.
# Add "-e clearPackageData true" to clear your app's data in between runs.
adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
androidx.test.orchestrator/.AndroidTestOrchestrator'
Как видно из синтаксиса команды, вы устанавливаете инструмент оркестрации тестов Android, а затем используете его напрямую.
adb shell pm list instrumentation
Использование разных наборов инструментов
Если вы используете другой тулчейн для тестирования приложения, вы все равно можете использовать инструмент оркестрации тестов Android, выполнив следующие действия:
- Добавьте необходимые пакеты в файл сборки приложения.
- Включите инструмент оркестрации тестов Android из командной строки.
Архитектура
APK-файл сервиса Orchestrator хранится в процессе, отдельном от тестового APK-файла и APK-файла тестируемого приложения.
Инструмент оркестрации тестов Android собирает тесты JUnit в начале выполнения набора тестов, но затем выполняет каждый тест отдельно в собственном экземпляре Instrumentation.
Дополнительная информация
Подробнее об использовании AndroidJUnitRunner см. в документации по API.
Дополнительные ресурсы
Дополнительную информацию об использовании AndroidJUnitRunner можно найти в следующих ресурсах.
Образцы
- AndroidJunitRunnerSample – примеры аннотаций, параметризованных тестов и создания набора тестов.