Espresso как основа
Kaspresso основан на фреймворке Espresso от Google (если вы не знакомы с Espresso, подробности можно найти в официальной документации). Espresso позволяет вам работать с элементами вашего приложения нативно и методом белого ящика (тестирование белого ящика). Найти нужный элемент на экране можно с помощью matcher-ов, а затем выполнить с ними различные действия или проверки.
Использование только фреймворка Espresso недостаточно
У этого фреймворка есть несколько недостатков, и невозможно покрыть все потребности в автотестировании Android только с помощью Espresso из-за отсутствия определенных фич.
Что мы хотим:
- Хорошая читабельность. У Espresso с этим проблема из-за огромной иерархии matcher-ов. Когда у нас много matcher-ов, код становится трудно читаемым. Плохая читаемость означает сложность в дальнейшей поддержке теста.
- Высокая стабильность. Espresso плохо работает с интерфейсами, элементы которых отображаются асинхронно. Можно настроить Idling, но это все равно не решит всех проблем.
- Логирование. После прохождения теста с Espresso у вас нет пошаговой последовательности выполненных действий.
- Скриншоты. Мы также хотим иметь несколько скриншотов в отчетах о прохождении теста.
- Работа с ОС Android. В некоторых случаях нам нужно взаимодействовать с устройством, системными окнами и ОС Android. В этом случае функционала Espresso будет недостаточно. Вам понадобится UiAutomator.
- Архитектура кода. Мы хотим иметь чистую архитектуру не только в основном коде, но и в наших тестах, возможность повторного использования кода, перемещение некоторых блоков в абстракции. Иметь единый стиль кода для всех разработчиков.
Как Kaspresso решает все эти проблемы?
Читаемость
Kaspresso основан на Kakao - Android фреймворке для автотестов пользовательского интерфейса. Он основан на Espresso. Kakao предоставляет простой Kotlin DSL. Это делает тесты более читабельными. Вам больше не нужно использовать длинные конструкции с matcher-ами для поиска элементов на экране для взаимодействия из теста. Результат вызова метода Espresso onView()
кэшируется. Затем вы можете обратиться к необходимому элементу как к свойству по ссылке.
Kakao также предоставляет реализацию паттерна Page object с объектом Screen
. Вы можете описать все элементы интерфейса, с которыми будет взаимодействовать ваш тест, в одном месте (в одном объекте Screen).
Стабильность
Kaspresso обернул некоторые вызовы Espresso в более стабильную реализацию. Например, метод flakySafely().
Логирование
Kaspresso обернул некоторые вызовы Espresso не только для большей стабильности. Мы также внедрили перехватчик, который печатает больше отладочных сообщений в логи.
Работа с ОС Android
Мы создали интерфейс Device
как фасад для всех интерфейсов, с которыми можно работать. UiAutomator может помочь вам только в некоторых случаях, но чаще вам нужна возможность выполнять различные команды (adb, shell). Например, с помощью команды adb emu
вы можете эмулировать различные действия или события.
Тесты Espresso запускаются непосредственно на устройстве Android, поэтому нам нужен какой-то внешний сервер для отправки команд. В Kaspresso вы можете использовать AdbServer.
Архитектура кода
Используя описанную выше реализацию паттерна Page object, вы можете сделать свой код в тестовых файлах более читабельным, удобным для дальнейшей поддержки, повторно используемым и понятным. Kaspresso также предоставляет различные методы и абстракции для улучшения архитектуры (такие как step
, Scenario
, тестовые разделы и многое другое).