Site icon AppTractor

Интеграционное тестирование на Android: практическое руководство с Hilt, Compose и Room

В статье рассказывается о важности интеграционного тестирования для Android-приложений, которое часто недооценивают в пользу юнит-тестов. Автор приводит пример собственного проекта DogBreed App, чтобы показать, как интеграционные тесты позволяют убедиться, что вся архитектура приложения — экраны, ViewModel, репозитории и источники данных — корректно взаимодействуют между собой. Особое внимание уделяется способу реализации: приложение построено на Kotlin, Jetpack Compose и Hilt, с чистой архитектурой и делением на три слоя (UI, доменный и слой данных). Для интеграционного теста используются фейковые реализации сервисов и вспомогательная, база данных в памяти Room, что позволяет менять стандартные зависимости на тестовые внутрь DI-фреймворка — в примере через Hilt и аннотацию @TestInstallIn.

Автор поясняет, что интеграционные тесты запускают приложение почти так же, как в проде, но вместо реального обращения к API или базе работают с заранее прописанными моками ответов и базой, позволяя точно контролировать окружение. Это даёт возможность проверять не только взаимодействие юнитов, но и поведение приложения с точки зрения реального пользователя. Приведен сценарий тестирования: запуск приложения, получение списка пород, переход к деталям породы, добавление в избранное, возвращение назад и повторная проверка состояния. Для тестирования негативных сценариев (например, сбоя API) вводится флаг ошибки, который меняет логику выдачи данных.

В статье подчеркиваются технические детали: использование Hilt для замены зависимостей, настройка двух test rule — один для инициализации DI, другой для запуска активити. Для упрощения и читабельности тестов предлагается использовать паттерн «робот», который абстрагирует рутинные UI-действия (клики, проверки, ввод текста) в отдельные классы и делает тесты лаконичными и поддерживаемыми. Автор отмечает, что интеграционные тесты обнаруживают реальные баги, которые юнит-тесты не поймают: неправильное сохранение состояния между экранами, сбои из-за отсутствующих аргументов навигации, рассинхрон UI с базой данных.

В завершении упоминаются сложности интеграционных тестов — они выполняются дольше, требуют сложной настройки фейковых зависимостей, иногда увеличивают стоимость CI/CD, а также могут стать нестабильными и сложными при плохой изоляции. Несмотря на это, интеграционные тесты существенно повышают надежность приложения и уверенность разработчика в его стабильности.

Exit mobile version