Меняем работу с RecyclerView в Espresso-тестах

Продолжаем нашу серию расшифровок выступлений спикеров на VK Tech Talks | QA, состоявшемся 9 сентября 2019 года. Сегодня мы рассмотрим доклад Алексея Тюрина, занимающегося автоматизацией тестирования, на тему «Меняем работу с RecyclerView в Espresso-тестах».

Меняем работу с RecyclerView в Espresso-тестах, image #1

О чем пойдет речь в докладе:

  1. UI-тест на Espresso и как его улучшить.
  2. Проблема RecyclerView.
  3. Что получаем в итоге?

Вводная часть для тех, кто не писал на Espresso. Разберём простой пример.

Меняем работу с RecyclerView в Espresso-тестах, image #2

Скелет типичного теста на Espresso:

Меняем работу с RecyclerView в Espresso-тестах, image #3
Меняем работу с RecyclerView в Espresso-тестах, image #4
1 of 2

Но это была разминка. Реальный тест на Espresso выглядит примерно вот так:

Меняем работу с RecyclerView в Espresso-тестах, image #5

В целом, какие проблемы у такого теста?

  1. Тяжело читаемый тест.
  2. Изменение локаторов элементов.
  3. Изменение пользовательского сценария.

Что мы сделали?

Первоначально мы хотели улучшить синтаксис Espresso. В Kotlin есть extension-функции.

Меняем работу с RecyclerView в Espresso-тестах, image #6
Меняем работу с RecyclerView в Espresso-тестах, image #7
Меняем работу с RecyclerView в Espresso-тестах, image #8
1 of 3

Да, тесты стало приятнее читать, но глобально проблема не решена.

Меняем работу с RecyclerView в Espresso-тестах, image #9

Мы пошли дальше. Что же такое Matcher<View>? — это описание элемента на экране, что идеально ложится в паттерн PageObject.

Меняем работу с RecyclerView в Espresso-тестах, image #10
Меняем работу с RecyclerView в Espresso-тестах, image #11

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

Меняем работу с RecyclerView в Espresso-тестах, image #12

Далее мы применили ещё один паттерн — Steps. Все логические действия пользователя заворачиваем в отдельные функции.

Меняем работу с RecyclerView в Espresso-тестах, image #13

Мы молодцы, всё работает, решили проблемы.

Далее мы смотрим на RecyclerView. Это не укладывается в нашу концепцию. Далее разберёмся почему.

Меняем работу с RecyclerView в Espresso-тестах, image #14

Рассмотрим понятия, которые будут использоваться далее:

Меняем работу с RecyclerView в Espresso-тестах, image #15
Меняем работу с RecyclerView в Espresso-тестах, image #16
Меняем работу с RecyclerView в Espresso-тестах, image #17
Меняем работу с RecyclerView в Espresso-тестах, image #18
Меняем работу с RecyclerView в Espresso-тестах, image #19
1 of 5

Скелет RecycleView:

Меняем работу с RecyclerView в Espresso-тестах, image #20

Нам всё же хочется сократить синтаксис.

Меняем работу с RecyclerView в Espresso-тестах, image #21

Далее мы заглянем «под капот» Espresso. Сфокусируйтесь, это будет тяжелая часть.

Разберёмся по-порядку, что принимает метод actionOnItem.

Меняем работу с RecyclerView в Espresso-тестах, image #22
Меняем работу с RecyclerView в Espresso-тестах, image #23
Меняем работу с RecyclerView в Espresso-тестах, image #24
Меняем работу с RecyclerView в Espresso-тестах, image #25
Меняем работу с RecyclerView в Espresso-тестах, image #26
Меняем работу с RecyclerView в Espresso-тестах, image #27
Меняем работу с RecyclerView в Espresso-тестах, image #28
1 of 7

Проваливаемся чуть глубже.

Меняем работу с RecyclerView в Espresso-тестах, image #29

Подведём промежуточный итог. Так как это работает?

  1. Поиск позиции совпадающих элементов внутри RecyclerView.
  2. Получение view, который находится по найденной позиции.
  3. Выполнение переданного действия на найденный view.

Давайте попробуем изменить эту логику. Мы создали новый класс RecyclerViewMatсher.

Меняем работу с RecyclerView в Espresso-тестах, image #30
Меняем работу с RecyclerView в Espresso-тестах, image #31
Меняем работу с RecyclerView в Espresso-тестах, image #32
1 of 3

Посмотрим, как это реализуется внутри. Espresso мониторит динамические иерархии элементов в Android. Когда вы вызываете проверку или поиск элемента, метод matchesSafely работает над каждым элементов в иерархии.

Меняем работу с RecyclerView в Espresso-тестах, image #33
Меняем работу с RecyclerView в Espresso-тестах, image #34

Что мы только что реализовали? Теперь мы спокойно можем вызывать такие действия и они будут работать. Просто так работать с этим неудобно, но мы можем добавить на наши страницы вот такие методы getListItem и getListItemChild.

Так дело не пойдёт. Идём дальше.

Меняем работу с RecyclerView в Espresso-тестах, image #35
Меняем работу с RecyclerView в Espresso-тестах, image #36
1 of 2

Давайте подумаем, что же мы можем с этим сделать. Создаём новый класс RecyclerViewItem для работы с отдельным Item в RecyclerView.
Init вызывается, когда вы создаёте инстанцию какого-либо класса.

Меняем работу с RecyclerView в Espresso-тестах, image #37

С этим понятно. Как же теперь пользоваться этим?

Меняем работу с RecyclerView в Espresso-тестах, image #38
Меняем работу с RecyclerView в Espresso-тестах, image #39
Меняем работу с RecyclerView в Espresso-тестах, image #40
Меняем работу с RecyclerView в Espresso-тестах, image #41
1 of 4

Идём дальше. У нас есть метод friendItemCheck и advancedSendMessageWithSteps.

Меняем работу с RecyclerView в Espresso-тестах, image #42

Чего мы добились за всё это время?

Меняем работу с RecyclerView в Espresso-тестах, image #43

У нас имеется библиотека с открытым кодом, которую вы можете легко подключить:

Меняем работу с RecyclerView в Espresso-тестах, image #44

Схема подключения:

Меняем работу с RecyclerView в Espresso-тестах, image #45

И ещё полезные ссылки:

1) Библиотека c Espresso DSL и RecyclerViewItem: github.com/alex-tiurin/espresso-page-object

2) Примеры кода: github.com/alex-tiurin/espresso-guide

Меняем работу с RecyclerView в Espresso-тестах, image #46

На этом доклад Алексея подходит к концу. Полную версию его выступления можно посмотреть ниже:

Меняем работу с RecyclerView в Espresso-тестах, image #47

The Brown Room — независимое интернет-издание про социальные сети и современные технологии.

Автор: Сергей Котов
Корректор: Арсений Метелев
Изображения, код и слайды: Алексей Тюрин / VK Tech

257 views·4 shares