- Знакомство с дополнительными библиотеками Espresso.
- Espresso — это фреймворк для автоматизированного тестирования пользовательского интерфейса в приложениях для Android. Он предоставляет удобные инструменты для взаимодействия с элементами UI, что позволяет быстро и эффективно писать тесты.
- Espresso - имеет доступ к исходному коду и позволяет производить тесты по принципу белого ящика. Это означает, что тестировщики могут проверять внутренние состояния приложения, а не только его внешний вид.
- Проверяем исходящие 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
}
- Дожидаемся выполнения методов с использованием Idling Resources.
- Idling Resources в Espresso — это механизм для управления асинхронными операциями в тестах Android. Они позволяют сообщать тестовому фреймворку о том, когда приложение занято (например, выполняет сетевые запросы) и когда готово к взаимодействию.
- В процессе выполнения тестов приложения могут использовать асинхронные операции, такие как сетевые запросы или анимации. Используя Idling Resources, мы можем указать Espresso, когда приложение активно работает и когда возможно безопасное взаимодействие с интерфейсом. Это позволяет избежать ситуации, когда тесты выполняются до завершения операций, что может привести к ошибкам.
- Реализуем собственные 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 отображается
- Собирать отчет и исправлять ошибки.
- Создание отчетов о выполнении тестов позволит анализировать результаты и выявлять проблемные области приложения.
- Уметь исправлять ошибки по результатам тестирования — важная часть процесса разработки, которая способствует повышению качества приложения и улучшению пользовательского опыта.
-
Склонирован и запущен тестовый проект в Android Studio.
-
Добавлены необходимые зависимости в файл
/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'
- При возникновении проблем с запуском приложения был разрешен конфликт в структуре проекта (Project Structure) путем обновления следующих версий. Обновления были необходимы для обеспечения совместимости и стабильной работы приложения:
Android Gradle Plugin Version 8.5.2
Gradle Version 8.7
-
Запущен режим записи Record Espresso Test в Android Studio, который автоматически записывает действия пользователя для создания тестов. Создан тестовый класс
IntentImplicitTest
, и код теста был отредактирован. -
В тестовый класс
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 репозитория.
- В тестовом классе
IntentExplicitTest
перед нажатием на элемент кнопки с именем buttonSetting добавлен запуск проверки интентов с помощьюIntents.init();
.
- В конце кода так же указано завершение проверки с помощью
Intents.release();
. - Запущен тест, нажав кнопку запуска возле метода теста, успешно завершен, произведен экспорт отчета теста в HTML-файл, отчёт добавлен в Issues репозитория.
- В файл
/app/build.gradle
в блокdependencies
добавлена зависимость Idling Resources из библиотеки Espresso, которая помогает имитировать работу со счетчиками и избегать использованияThread.sleep()
. Она позволяет тестам дожидаться завершения асинхронных операций, что делает их более стабильными и предсказуемыми.
implementation 'androidx.test.espresso:espresso-idling-resources:3.4.0'
- В директории проекта
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();
}
}
}
- В классе
GalleryFragment
расположенный по пути/src/main/java/...
были добавлены следующие строки кода в методfakeLoadData()
.
EspressoIdlingResources.increment();
- Данная строка отвечает за увеличение счетчика IdlingResource на 1. Это позволяет тестам на Espresso узнать, что происходит асинхронная операция, и они должны ожидать завершения этой загрузки. Это улучшает синхронизацию между UI и тестами.recyclerView.setAdapter(new GalleryAdapter(itemList));
- Здесь устанавливается адаптер для recyclerView, который отображает список загруженных элементов. После завершения загрузки данных адаптер наполняет recyclerView необходимыми данными, улучшая пользовательский интерфейс и взаимодействие с ним.EspressoIdlingResources.decrement();
- Эта строка уменьшает счетчик IdlingResource, указывая на завершение асинхронной операции загрузки данных. Это сообщает тестам на Espresso, что они могут продолжать выполняться, так как задача завершена.
Таким образом, добавление этих строк кода не только способствует корректной работе тестов, но и динамически обновляет содержимое recyclerView по мере завершения загрузки данных. Это позволяет улучшить общий пользовательский опыт, обеспечивая плавное взаимодействие с приложением.
-
В проект был добавлен класс
CustomViewMatcher
, размещенный по путиsrc/androidTest/java/...
, который ищет элементы в пользовательском интерфейсе. Он не только проверяет соответствие количества элементов, но и предоставляет детализированное описание ошибки, что значительно упрощает отладку при несоответствии ожидаемого и фактического размеров списка. -
Также в проект был добавлен класс
CustomViewAssertions
, который размещён по тому же пути. Этот класс предоставляет кастомные проверки, которые подтверждают правильность работы элементов пользовательского интерфейса. Он гарантирует, что ожидаемые элементы действительно присутствуют и правильно функционируют, что улучшает надёжность и точность автоматизированных тестов. -
Реализован автоматизированный тест под названием
IdlingResourcesTest
, предназначенный для проверки функциональности открытия галереи и наличия элемента с числом 7, который успешно прошел. Произведен экспорт отчета теста в HTML-файл, отчёт добавлен в Issues репозитория.