AndroidJUnitRunner

Класс AndroidJUnitRunner — это средство запуска тестов JUnit , которое позволяет запускать инструментированные тесты JUnit 4 на устройствах Android, в том числе использующие платформы тестирования Espresso , UI Automator и Compose .

Средство выполнения тестов загружает тестовый пакет и тестируемое приложение на устройство, запускает тесты и сообщает о результатах тестов.

Этот инструмент запуска тестов поддерживает несколько распространенных задач тестирования, в том числе следующие:

Написание тестов JUnit

В следующем фрагменте кода показано, как можно написать инструментированный тест JUnit 4 для проверки правильности работы changeText в классе ChangeTextBehavior :

Котлин

@RunWith(AndroidJUnit4::class) // Only needed when mixing JUnit 3 and 4 tests
@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)))
 }
}

Ява

@RunWith(AndroidJUnit4.class) // Only needed when mixing JUnit 3 and 4 tests
@LargeTest // Optional runner annotation
public class ChangeTextBehaviorTest {

    private static final String stringToBeTyped = "Espresso";

    @Rule
    public ActivityTestRuleM<ainActivity;> 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 : запрещает запуск теста на более низком уровне Android API, чем заданный. Например, чтобы запретить запуск тестов на всех уровнях 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 Test Orchestrator

Android Test Orchestrator позволяет запускать каждый тест вашего приложения в рамках собственного вызова Instrumentation . При использовании AndroidJUnitRunner версии 1.0 или выше у вас есть доступ к Android Test Orchestrator.

Android Test Orchestrator предлагает следующие преимущества для вашей среды тестирования:

  • Минимальное общее состояние: каждый тест выполняется в своем собственном экземпляре Instrumentation . Таким образом, если ваши тесты совместно используют состояние приложения, большая часть этого общего состояния удаляется из процессора или памяти вашего устройства после каждого теста. Чтобы удалить все общее состояние из процессора и памяти вашего устройства после каждого теста, используйте флаг clearPackageData . Пример см. в разделе «Включение из Gradle» .
  • Сбои изолированы: даже если один тест дает сбой, он уничтожает только собственный экземпляр Instrumentation . Это означает, что другие тесты в вашем наборе по-прежнему выполняются, предоставляя полные результаты тестов.

Эта изоляция приводит к возможному увеличению времени выполнения теста, поскольку Android Test Orchestrator перезапускает приложение после каждого теста.

И в Android Studio, и в Firebase Test Lab предустановлен Android Test Orchestrator, однако вам необходимо включить эту функцию в Android Studio .

Включить из Gradle

Чтобы включить Android Test Orchestrator с помощью инструмента командной строки 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 Test Orchestrator, выполнив следующую команду:
./gradlew connectedCheck

Включить из Android Studio

Чтобы включить Android Test Orchestrator в Android Studio, добавьте инструкции, показанные в разделе «Включение из Gradle», в файл build.gradle вашего приложения.

Включить из командной строки

Чтобы использовать Android Test Orchestrator в командной строке, выполните следующие команды в окне терминала:

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 Test Orchestrator, а затем используете его напрямую.

adb shell pm list instrumentation

Использование разных наборов инструментов

Если вы используете другую цепочку инструментов для тестирования своего приложения, вы все равно можете использовать Android Test Orchestrator, выполнив следующие шаги:

  1. Включите необходимые пакеты в файл сборки вашего приложения.
  2. Включите Android Test Orchestrator из командной строки .

Архитектура

APK-файл службы Orchestrator хранится в процессе, отдельном от тестового APK и APK тестируемого приложения:

Оркестратор позволяет управлять тестами JUnit.
Рис. 1. Структура APK Android Test Orchestration.

Android Test Orchestrator собирает тесты JUnit в начале выполнения набора тестов, но затем выполняет каждый тест отдельно в своем собственном экземпляре Instrumentation .

Дополнительная информация

Дополнительные сведения об использовании AndroidJUnitRunner см. в справочнике по API .

Дополнительные ресурсы

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

Образцы

  • AndroidJunitRunnerSample : демонстрирует аннотации тестов, параметризованные тесты и создание набора тестов.