Kaspresso: Среда Автоматизированного Тестирования, Которую Вы Так Долго Ждали

Любой, кто проводил или проводит автотесты для Android, знает, какая это боль.

Вы настолько устаете от объема задач и проблем, что даже отпуск не помогает. Люди даже увольняются из-за автоматизированных тестов.

Боль, страдания и мучения неизбежно приводят к появлению чего-то нового и прекрасного.

Мы постарались собрать воедино все ошибки, на которые приходилось наступать, объединили усилия с ребятами из Авито и HH и создали то, что сделает ваши отношения с автотестами несравненно лучше и плодотворнее.

Встретиться: Каспрессо — среда автоматизированного тестирования, которую вы так долго ждали!

Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали

Сразу отмечу, что в Интернете есть два достаточно качественных видеоролика, посвященных Каспрессо И Адбсервер (дополнительный к Kaspresso, но в то же время сильный и независимый проект): 1. Дмитрий Мовчан, Евгений Мацюк - Как начать писать автотесты и не сойти с ума 2. Егор Курников — Единственное, что нужно для UI-тестирования В них подробно описана история создания библиотек: как мы переходили от решения одной проблемы к решению другой и что получилось в итоге.

Я очень рекомендую это.

Поэтому в этой статье я расскажу только об основных положениях и особенностях, чтобы вы могли быстрее понять, что представляет собой этот фреймворк и какие проблемы он решает. А суть и подробности можно посмотреть в видео и документации.



Зачем нам вообще нужен собственный фреймворк?

Каждый разработчик, приступающий к написанию автотестов, неизбежно задается следующими вопросами:
  1. Как начать писать автотесты?
  2. Какие инструменты выбрать?
  3. Что делать, если у вас нет подходящего инструмента?
  4. Каковы лучшие практики?
Добавьте ко всему этому тот факт, что каждая команда пытается решить эти вопросы по-своему.

В результате на них нет однозначного ответа, негде посмотреть, что правильно.

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

Между тем, автоматизация тестирования преследует хорошие цели.

Это позволяет вам всегда иметь зеленый мастер-файл, готовый к выпуску.

Это означает, что вы можете быстро развернуть релиз.

Единственная проблема – найти ответы на поставленные выше вопросы.

Но они практически одинаковы для всех команд. Так почему бы не автоматизировать их решение?

Чего мы хотим от фреймворка?

Давайте немного расширим наши ожидания от фреймворка.



Хорошая читаемость

По умолчанию в Android нам доступна только библиотека Espresso. Еще есть, конечно, Appium + Cucumber, который теоретически позволяет писать тесты сразу на двух платформах.

Но сообщество уверенно движется к первому инструменту.

Не буду описывать все плюсы и минусы вышеперечисленных библиотек: информации об этом очень много в Интернете.

Вот, например, одна из относительно недавних ссылок: Аппиум против Эспрессо.

Что выбрать и как использовать? Итак, Эспрессо.

Неплохой инструмент, но его API немного вывернуто наизнанку.

Взгляните на простой код:

  
  
  
  
  
  
   

@Test fun espressoTest() { onView(allOf(allOf(withId(R.id.espresso), isDescendantOfA(withId(R.id.coffee_variates))), isDescendantOfA(withId(R.id.content)))) .

check(matches(withEffectiveVisibility(View.VISIBLE))) }

Чтобы это понять, нужно подумать, не так ли? Боги Таиланда и Австралии подарили нам библиотеку Какао , что позволяет вам сразу понять, что происходит в вашем тесте.

Вот тот же код, но с Kakao:

@Test fun kakaoTest() { mainScreen { myView.isVisible() } }

Намного лучше.

Но теперь представьте, что вы автоматизировали весь тестовый пример.

Каким будет код?

@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { MainScreen() { homeButton.click() } HomeScreen() { title { isVisible() hasAnyText() } } } }

Основная проблема в том, что когда вы смотрите на этот тест, трудно связать его с автоматизированным вами тест-кейсом.

Можно, конечно, добавить логи или что-то в этом роде.

Или введите dsl, что сразу преобразит внешний вид ваших тестов:

@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { step(“1. Open Home screen”) { MainScreen() { homeButton.click() } } step(“2. Check Home title”) { HomeScreen() { title { isVisible() hasAnyText() } } } } }

Согласитесь, это выглядит совершенно иначе.



Стабильность

Любая библиотека для ui-тестов проваливается.

Одно и то же действие можно успешно выполнить 50 раз, а на 51-й по неизвестной причине выполнить его не удастся.

И на 52-м заходе снова все в порядке.

И такое «отслаивание» может серьезно подпортить вам нервы.

Мы подумали, а почему бы не попробовать перехватить все действия Kakao-Espresso и добавить дополнительное поведение, направленное на обработку таких случайных ошибок.

Именно так оно и родилось версия 2.1 библиотеки Какао , что позволяет вам встраиваться во все вызовы Espresso. Дополнительно мы создали собственные перехватчики, с помощью которых можно изменить поведение на точке вызова или, например, просто залогиниться.

Более того, эти перехватчики настраиваемы, поэтому вы можете настроить их под свои нужды.

Подробнее лучше прочитать в док .

В частности, в рамках борьбы с нестабильными тестами — если какие-то ваши действия выдают исключение, то Kaspresso попытается:

  • Продолжайте прокручивать.

    Возможно, ваш взгляд просто не виден на экране.

  • Удалить системный диалог, который мог появиться черт знает откуда.

  • Повторите прерванный вызов в течение двух секунд.
Этими действиями мы полностью решаем проблему с нестабильными тестами!

Ведение журнала

Одна из основных проблем, сопровождающих автотесты, — отсутствие четкого логирования, которого особенно не хватает в случае провала теста.

Сидишь и думаешь, что и как сюда попало.

Благодаря вышеописанному перехвату нам удалось построить достаточно обширную систему логирования.

Давайте посмотрим на пример:

Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали

По умолчанию Kaspresso протоколирует все ваши действия, выделяет каждый шаг теста, отображает время выполнения и т. д.

Полный Adb в тестах Espresso

Изначально adb недоступен в тестах Espresso. Да оболочка adb , но функций гораздо меньше, чем в полной АБР .

Но в нем столько всего того, что может нам пригодиться в тестах.

Мы создали отдельную библиотеку Адбсервер , который вернет полноценный АБР ! В приведенных выше видео подробно рассказывается о том, как мы боролись и через что прошли ради него ( один раз И два ).



Работа с ОС Android

Специфика тестов в «Лаборатории Касперского» такова, что нам приходится много работать с ОС Android: задавать некоторые настройки, загружать файлы в систему и т. д. Все это побудило нас стандартизировать всю нашу работу с системой, создав набор понятных интерфейсов, доступных через единую точку входа — класс Устройство .

Что это за интерфейсы и что они делают? В качестве иллюстрации приведу пару слайдов из презентации Егора:

Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали

Документация - Здесь .

Под капотом он использует в основном AdbServer и UiAutomator. Но! Если вас вдруг не устроит реализация какого-то интерфейса, вы можете указать свою реализацию через Конфигуратор.



Скриншот для DocLoc (документация и локализация)

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

Ведь очень сложно сделать правильный перевод, не видя, где и как используется конкретная строка.

Поэтому хотелось бы иметь возможность делать скриншоты быстро и на всех языках сразу.

Включая скриншоты системных диалогов.

Вам также могут понадобиться скриншоты на устаревших экранах без глобального рефакторинга.

Kaspresso позволяет вам делать все это «из коробки».

Подробнее читайте в документация .



Архитектура и лучшие практики

Одной из ключевых целей Kaspresso было создание DSL, который помог бы вам выбрать правильную архитектуру тестов и правильное их написание.

На эту тему сломано много копий, потому что подобных правил вы, к сожалению, нигде не найдете.

Максимум, что можно найти, это статьи о Объект страницы .

Поэтому мы не пожалели сил и осветили эти вопросы в документация , И в видео раз И видео второе .

Кроме того, Саша Блинов написал отличную статья о Kotlin DSL и элегантных тестах .

DSL, описанные в этой статье, предоставлены Kaspresso. Еще в Мобиусе мы предложили вариант, как ускорить отдачу автотестов и быстро интегрировать их в PullRequest, минуя неизбежные проблемы с инфраструктурой.

Рассказываем об этом подробнее Здесь .



Как подключить и настроить Каспрессо, если у вас уже много тестов

Главная прелесть в том, что если у вас уже написано много тестов на Kakao и вы хотите реализовать Kaspresso, то вам не нужно ничего переписывать! Просто унаследуйте свои тестовые классы от специального класса TestCase. Вот и все! Был:

@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { .

} }

Стал:

@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase() { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { .

} }

А если вам не нравится наследование, используйте аналогичный класс ТестРуле .

Как мы уже упоминали, Kaspresso — очень гибкая и настраиваемая платформа.

Все настройки доступны через одноименный класс Каспрессо .

По умолчанию используется настройка по умолчанию.

Если вы хотите что-то настроить, это будет выглядеть примерно так:

@RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase( Kaspresso.Builder.default().

apply { viewBehaviorInterceptors.add(MyInterceptor()) flakySafetyParams.timeoutMs = 1_000 } ) { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { .

} }

То есть через конструктор Прецедент доступный Каспрессо.

Строитель , где вы устанавливаете все необходимые вам настройки.

Подробнее о конфигураторе написано в документация .



Ближайшие планы

В самое ближайшее время мы планируем добавить следующее:

Отображение шагов теста в Allure (привет ребятам из HeadHunter)

Через специальный перехватчик готовим данные для Марафон .

Это позволяет нам видеть отчеты Allure следующего характера:

Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали

Подробности в PR#4 P.S. PR уже есть в версии 1.0.1, сейчас мы готовим соответствующий PR в Марафон .

ПСС.

Есть идея к каждому шагу прикрепить конкретный кусок лога, а к «упавшему» шагу добавить скриншот.

Тестирование сценариев обновления

Часто возникает необходимость проверить корректность обновления приложения.

Да, часть проверок можно перенести в юнит-тесты.

Но нам хотелось бы быть спокойными за все приложение в целом.

К сожалению, на чистом Espresso это сделать невозможно, так как если мы переустановим тестируемый apk, то тест завершится неудачно.

Можно как-то попробовать использовать какие-то хитрости с раннером, но мне сложно представить, как будут выглядеть такие улучшения и насколько они будут стабильными.

Поэтому в Kaspresso мы готовим решение этой проблемы на базе UiAutomator. Однако вверху у вас будет торчать все тот же знакомый dsl, чрезвычайно похожий на Kakao и с такой же поддержкой перехвата.



Полезные ссылки

Каспрессо Адбсервер Чат , в котором мы всегда будем рады ответить на все ваши вопросы

Благодарности

Особая благодарность всем, кто принял участие в разработке проекта.

Это было очень сложно, но чертовски круто!

Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Kaspresso: среда автоматизированного тестирования, которую вы так долго ждали



Вместо заключения

Мы верим, что Kaspresso и AdbServer сделают вашу жизнь лучше.

Будем рады вашим отзывам, рекомендациям, запросам и Pull Requests! И не забудьте поставить звезду, пожалуйста! P.S. И в самом конце небольшой опрос =) В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Есть ли в вашей команде автотесты? 25,26% Да, используем Espresso 24 15,79% Да, используем Appium и подобные кросс-решения 15 8,42% Да, но дополнительно создаем что-то свое поверх существующих решений (или вместо них??) 8 31,58% Нет, но в планах 30 18.95 % Нет, Бог миловал 18 Проголосовали 95 пользователей.

21 пользователь воздержался.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Вы бы начали использовать Kaspresso прямо сейчас? 10 77 пользователей.

24 пользователя воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Будет ли вам полезен Мастер-класс по автотестам вообще и Каспрессо в частности 62,5% Да (не забудьте добавиться в чат для получения дополнительной информации) 40 28,13% Нет 18 9,38% Могу сделать это сам 6 Проголосовали 64 пользователя.

26 пользователей воздержались.

Теги: #Android #Разработка Android #Разработка мобильных приложений #java #Kotlin #espresso #uiautomator #automation #kakao

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.