Skip to content

2.6 «Espresso. Продвинутая автоматизация тестирования Android»

Notifications You must be signed in to change notification settings

levvolkov/Espresso-advanced-automation

Repository files navigation

Домашнее задание к занятию «2.6. Espresso»

Цели

  1. Знакомство с дополнительными библиотеками Espresso.
  • Espresso — это фреймворк для автоматизированного тестирования пользовательского интерфейса в приложениях для Android. Он предоставляет удобные инструменты для взаимодействия с элементами UI, что позволяет быстро и эффективно писать тесты.
  • Espresso - имеет доступ к исходному коду и позволяет производить тесты по принципу белого ящика. Это означает, что тестировщики могут проверять внутренние состояния приложения, а не только его внешний вид.
  1. Проверяем исходящие Intents приложения.
  • Intent (намерение) — это объект, который используется для запроса выполнения действия другим компонентом приложения. С его помощью можно запускать Activity, инициировать Service, передавать данные между приложениями. Существует два типа Intents: явные (Explicit), указывающие конкретный компонент для выполнения, и неявные (Implicit), которые позволяют системе определить, какой компонент должен обработать запрос, основываясь на передаваемых действиях.
  • При тестировании можно убедиться, что запускаемые Activity и намерения передают правильные данные, а также что они вызывают нужные компоненты.
   @Test
   public void testName() {
      …
      Intents.init()
      item.perform(click()); // Для срабатывания Intent
      intended(hasData(“https://some.ru”)); // Проверка Intent
      Intents.release(); // Для “очистки” записей Intents
   }
  1. Дожидаемся выполнения методов с использованием Idling Resources.
  • Idling Resources в Espresso — это механизм для управления асинхронными операциями в тестах Android. Они позволяют сообщать тестовому фреймворку о том, когда приложение занято (например, выполняет сетевые запросы) и когда готово к взаимодействию.
  • В процессе выполнения тестов приложения могут использовать асинхронные операции, такие как сетевые запросы или анимации. Используя Idling Resources, мы можем указать Espresso, когда приложение активно работает и когда возможно безопасное взаимодействие с интерфейсом. Это позволяет избежать ситуации, когда тесты выполняются до завершения операций, что может привести к ошибкам.
  1. Реализуем собственные ViewMatcher и ViewAssertions.
  • ViewMatcher используется для поиска UI-элементов в приложении, основываясь на их характеристиках. Основные встроенные матчеры:
    • withId(int id): находит элемент по идентификатору.
    • withText(String text): находит элемент по тексту.
    • withContentDescription(String contentDesc): находит элемент по описанию содержимого.
  • ViewAssertions — это интерфейс, который используется для проверки состояния View после его нахождения. Это позволяет убедиться, что UI-элементы находятся в ожидаемом состоянии.
  • В коде использование ViewAssertions обычно реализуется через цепочку методов check() и matches(). Они позволяют проверять состояние различных элементов интерфейса и подтверждать, что приложение работает так, как ожидается.
   onView(withId(R.id.my_id)).check(matches(isDisplayed())); // Проверяем, что элемент с ID my_id отображается на экране
   onView(withId(R.id.title)).check(matches(withText("Setting"))); // Проверяем, что TextView отображает текст "Setting"
   onView(withContentDescription("More Options")).check(matches(isDisplayed())); // Проверяем, что кнопка с описанием содержимого "More Options отображается
  1. Собирать отчет и исправлять ошибки.
  • Создание отчетов о выполнении тестов позволит анализировать результаты и выявлять проблемные области приложения.
  • Уметь исправлять ошибки по результатам тестирования — важная часть процесса разработки, которая способствует повышению качества приложения и улучшению пользовательского опыта.

Сделано:

Задание 1. Реализация теста на проверку Intent

  1. Склонирован и запущен тестовый проект в Android Studio.

  2. Добавлены необходимые зависимости в файл /app/build.gradle в блок dependencies {:

    implementation 'androidx.test.espresso:espresso-intents:3.6.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test:rules:1.4.0'
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
  1. При возникновении проблем с запуском приложения был разрешен конфликт в структуре проекта (Project Structure) путем обновления следующих версий. Обновления были необходимы для обеспечения совместимости и стабильной работы приложения:
   Android Gradle Plugin Version 8.5.2
   Gradle Version 8.7
  1. Запущен режим записи Record Espresso Test в Android Studio, который автоматически записывает действия пользователя для создания тестов. Создан тестовый класс IntentImplicitTest, и код теста был отредактирован.

  2. В тестовый класс IntentImplicitTest добавлена аннотация @Rule, которая сочетает в себе правило тестирования (TestRule) в контексте библиотеки JUnit. Это позволяет управлять состоянием интентов во всех тестах данного класса.

   @Rule 
    public IntentsTestRule intentsTestRule =
            new IntentsTestRule(MainActivity.class);
  • Вынесен текст кода в отдельную переменную, что улучшит читаемость кода и облегчит его поддержку. Если нужно будет изменить текст в будущем, это можно сделать это в одном месте, а не искать его по всему коду.
   private static final String moreOption = "More options";
   private static final String settingUrl = "https://google.com";

Использование private static final String обеспечит неизменяемость значения, что повысит безопасность кода и уменьшит вероятность ошибок, связанных с изменением текста в разных местах.

  • Добавлена проверка, которая анализирует, когда определенное действие производится в приложении (например, нажатие кнопки). Важно, чтобы интент инициировал правильные данные и действие. Это необходимо для обеспечения корректной работы приложения и его интеграции с другими компонентами или приложениями.
   intended(hasData(settingUrl));
   intended(hasAction(Intent.ACTION_VIEW));
  • Запущен тест, нажав кнопку запуска возле метода теста, успешно завершен, произведен экспорт отчета теста в HTML-файл, отчёт добавлен в Issues репозитория.
  1. В тестовом классе IntentExplicitTest перед нажатием на элемент кнопки с именем buttonSetting добавлен запуск проверки интентов с помощью Intents.init();.
  • В конце кода так же указано завершение проверки с помощьюIntents.release();.
  • Запущен тест, нажав кнопку запуска возле метода теста, успешно завершен, произведен экспорт отчета теста в HTML-файл, отчёт добавлен в Issues репозитория.

Задание 2. Реализация теста с использованием Idling Resources

  1. В файл /app/build.gradle в блок dependencies добавлена зависимость Idling Resources из библиотеки Espresso, которая помогает имитировать работу со счетчиками и избегать использования Thread.sleep(). Она позволяет тестам дожидаться завершения асинхронных операций, что делает их более стабильными и предсказуемыми.
   implementation 'androidx.test.espresso:espresso-idling-resources:3.4.0'
  1. В директории проекта src/main/java добавлен класс EspressoIdlingResources, предназначенный для управления состоянием идлинга в тестах с использованием библиотеки Espresso. Он синхронизирует тесты с асинхронными задачами (сетевые запросы, операции с базой данных) с помощью методов для увеличения и уменьшения счётчика идлинга. Это обеспечивает надёжное ожидание завершения фоновых операций и улучшает точность отслеживания состояния приложения во время тестов
   package ru.kkuzmichev.simpleappforespresso;

   import androidx.test.espresso.idling.CountingIdlingResource;

   public class EspressoIdlingResources {
       private static final String RESOURCE = "GLOBAL"; //Tag
       public static CountingIdlingResource idlingResource = new CountingIdlingResource(RESOURCE);

       public static void increment() { idlingResource.increment(); }

       public static void decrement() {
           if(!idlingResource.isIdleNow()) {
               idlingResource.decrement();
           }
       }
   }
  1. В классе GalleryFragment расположенный по пути /src/main/java/... были добавлены следующие строки кода в метод fakeLoadData().
  • EspressoIdlingResources.increment(); - Данная строка отвечает за увеличение счетчика IdlingResource на 1. Это позволяет тестам на Espresso узнать, что происходит асинхронная операция, и они должны ожидать завершения этой загрузки. Это улучшает синхронизацию между UI и тестами.
  • recyclerView.setAdapter(new GalleryAdapter(itemList)); - Здесь устанавливается адаптер для recyclerView, который отображает список загруженных элементов. После завершения загрузки данных адаптер наполняет recyclerView необходимыми данными, улучшая пользовательский интерфейс и взаимодействие с ним.
  • EspressoIdlingResources.decrement(); - Эта строка уменьшает счетчик IdlingResource, указывая на завершение асинхронной операции загрузки данных. Это сообщает тестам на Espresso, что они могут продолжать выполняться, так как задача завершена.

Таким образом, добавление этих строк кода не только способствует корректной работе тестов, но и динамически обновляет содержимое recyclerView по мере завершения загрузки данных. Это позволяет улучшить общий пользовательский опыт, обеспечивая плавное взаимодействие с приложением.

  1. В проект был добавлен класс CustomViewMatcher, размещенный по пути src/androidTest/java/..., который ищет элементы в пользовательском интерфейсе. Он не только проверяет соответствие количества элементов, но и предоставляет детализированное описание ошибки, что значительно упрощает отладку при несоответствии ожидаемого и фактического размеров списка.

  2. Также в проект был добавлен класс CustomViewAssertions, который размещён по тому же пути. Этот класс предоставляет кастомные проверки, которые подтверждают правильность работы элементов пользовательского интерфейса. Он гарантирует, что ожидаемые элементы действительно присутствуют и правильно функционируют, что улучшает надёжность и точность автоматизированных тестов.

  3. Реализован автоматизированный тест под названием IdlingResourcesTest, предназначенный для проверки функциональности открытия галереи и наличия элемента с числом 7, который успешно прошел. Произведен экспорт отчета теста в HTML-файл, отчёт добавлен в Issues репозитория.

About

2.6 «Espresso. Продвинутая автоматизация тестирования Android»

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published