Учебники

Espresso Testing Framework — Архитектура

В этой главе мы узнаем об условиях фреймворка эспрессо, о том, как написать простой тестовый эспрессо, и о полном рабочем процессе или архитектуре фреймворка эспрессо.

обзор

Espresso предоставляет большое количество классов для тестирования пользовательского интерфейса и взаимодействия с пользователем приложения для Android. Они могут быть сгруппированы в пять категорий, как указано ниже —

Юнит бегун

Платформа тестирования Android предоставляет средство запуска AndroidJUnitRunner для запуска тестовых случаев эспрессо, написанных в тестовых примерах стиля JUnit3 и JUnit4. Он специфичен для приложений Android и прозрачно обрабатывает загрузку тестовых наборов для эспрессо и тестируемого приложения как в реальном устройстве, так и в эмуляторе, выполняет тестовые наборы и сообщает о результатах тестовых примеров. Чтобы использовать AndroidJUnitRunner в тестовом примере, нам нужно аннотировать тестовый класс с помощью аннотации @RunWith, а затем передать аргумент AndroidJUnitRunner, как указано ниже:

@RunWith(AndroidJUnit4.class)
   public class ExampleInstrumentedTest {
}

Юнит правила

Платформа тестирования Android предоставляет правило ActivityTestRule для запуска активности Android перед выполнением тестовых случаев. Он запускает действие перед каждым методом, аннотированным @ Test` и @Before. Он прервет действие после метода, помеченного @After. Пример кода выглядит следующим образом:

@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

Здесь MainActivity — это действие, которое должно быть запущено перед запуском тестового примера и уничтожено после запуска конкретного тестового примера.

ViewMatchers

Espresso предоставляет большое количество классов сопоставления представлений (в пакете androidx.test.espresso.matcher.ViewMatchers ) для сопоставления и поиска элементов / представлений пользовательского интерфейса в иерархии представлений экрана активности Android. Метод Espresso onView принимает единственный аргумент типа Matcher (View matchers), находит соответствующее представление пользовательского интерфейса и возвращает соответствующий объект ViewInteraction . Объект ViewInteraction, возвращаемый методом onView, может в дальнейшем использоваться для вызова таких действий, как щелчок по сопоставленному представлению, или может использоваться для утверждения сопоставленного представления. Пример кода для поиска представления с текстом «Hello World!» Выглядит следующим образом:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));

Здесь withText — это средство сопоставления, которое можно использовать для сопоставления представления пользовательского интерфейса, имеющего текст «Hello World!»

ViewActions

Espresso предоставляет большое количество классов действий представления (в androidx.test.espresso.action.ViewActions), чтобы вызывать различные действия в выбранном / согласованном представлении. Как только onView сопоставляет и возвращает объект ViewInteraction , любое действие может быть вызвано путем вызова метода « execute» объекта ViewInteraction и передачи его с соответствующими действиями представления. Пример кода для выбора подходящего вида выглядит следующим образом:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));
viewInteraction.perform(click());

Здесь будет выполнено действие щелчка соответствующего вида.

ViewAssertions

Аналогично представлениям соответствия и действиям представления, Espresso предоставляет большое количество утверждений представления (в пакете androidx.test.espresso.assertion.ViewAssertions ), чтобы утверждать, что согласованное представление — то, что мы ожидали. Как только onView совпадает и возвращает объект ViewInteraction , любое утверждение может быть проверено с использованием метода проверки ViewInteraction , передав его с правильным утверждением представления. Пример кода, чтобы утверждать, что согласованное представление выглядит следующим образом:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));
viewInteraction.check(matches(withId(R.id.text_view)));

Здесь совпадения принимают сопоставление вида и возвращают утверждение представления, что можно проверить методом проверки ViewInteraction .

Рабочий процесс Espresso Testing Framework

Давайте разберемся, как работает фреймворк для эспрессо и как он предоставляет возможности для любого пользовательского взаимодействия простым и гибким способом. Рабочий процесс теста эспрессо, как описано ниже,

  • Как мы узнали ранее, Android JUnit Runner, AndroidJUnit4 будет запускать тестовые случаи Android. Тестовые наборы для эспрессо должны быть помечены @RunWith (AndroidJUnut.class) . Во-первых, AndroidJUnit4 подготовит среду для запуска тестовых случаев. Он запускает подключенное устройство Android или эмулятор, устанавливает приложение и проверяет, находится ли тестируемое приложение в состоянии готовности. Он запустит тестовые случаи и сообщит о результатах.

  • Эспрессо требуется по крайней мере одно правило JUnit типа ActivityTestRule, чтобы указать действие. Android JUnit runner запустит действие, которое будет запущено с помощью ActivityTestRule .

  • В каждом тестовом примере требуется как минимум один вызов метода onView или onDate (используется для поиска представлений на основе данных, таких как AdapterView ) для сопоставления и поиска нужного представления. onView или onData возвращает объект ViewInteraction .

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

  • Действие можно вызвать с помощью метода execute объекта ViewInteraction , передав любое из доступных действий просмотра.

  • Утверждение может быть вызвано с помощью метода check объекта ViewInteraction , передав любое из доступных утверждений представления.

Как мы узнали ранее, Android JUnit Runner, AndroidJUnit4 будет запускать тестовые случаи Android. Тестовые наборы для эспрессо должны быть помечены @RunWith (AndroidJUnut.class) . Во-первых, AndroidJUnit4 подготовит среду для запуска тестовых случаев. Он запускает подключенное устройство Android или эмулятор, устанавливает приложение и проверяет, находится ли тестируемое приложение в состоянии готовности. Он запустит тестовые случаи и сообщит о результатах.

Эспрессо требуется по крайней мере одно правило JUnit типа ActivityTestRule, чтобы указать действие. Android JUnit runner запустит действие, которое будет запущено с помощью ActivityTestRule .

В каждом тестовом примере требуется как минимум один вызов метода onView или onDate (используется для поиска представлений на основе данных, таких как AdapterView ) для сопоставления и поиска нужного представления. onView или onData возвращает объект ViewInteraction .

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

Действие можно вызвать с помощью метода execute объекта ViewInteraction , передав любое из доступных действий просмотра.

Утверждение может быть вызвано с помощью метода check объекта ViewInteraction , передав любое из доступных утверждений представления.

Диаграмма представления рабочего процесса выглядит следующим образом:

WorkFlow

Пример — просмотр утверждения

Давайте напишем простой тестовый пример, чтобы найти текстовое представление с текстом «Hello World!» В нашем приложении «HelloWorldApp», а затем подтвердить его с помощью утверждения представления. Полный код выглядит следующим образом:

package com.tutorialspoint.espressosamples.helloworldapp;

import android.content.Context;
import androidx.test.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.withText;;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static org.junit.Assert.*;
/**
   * Instrumented test, which will execute on an Android device.
   *
   * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
   @Rule
   public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
   @Test
   public void view_isCorrect() {
      onView(withText("Hello World!")).check(matches(isDisplayed()));
   }
   @Test
   public void useAppContext() {
      // Context of the app under test.
      Context appContext = InstrumentationRegistry.getTargetContext();
      assertEquals("com.tutorialspoint.espressosamples.helloworldapp", appContext.getPackageName());
   }
}

Здесь мы использовали сопоставители с текстовым представлением, чтобы найти текстовое представление, содержащее текст «Hello World!» И соответствующее утверждение представления, чтобы утверждать, что текстовое представление отображается правильно. После запуска тестового примера в Android Studio он запустит тестовый отчет и сообщит об успешном завершении, как показано ниже.

view_isПравильный тестовый пример

Прецедент