androidTest
. См. рис. 14.1 и сопровождающий его
текст.
Этот тест может показаться простым, но он очень пригодится потом, когда
разработчик выполнит рефакторинг, даже не подозревая, что при этом был за
-
тронут класс или метод. Тем не менее совершенно понятно, что полезность
таких простых тестов имеет свой предел. Даже для такого простого метода, как
Maths.multiply
, может возникнуть масса ситуаций, приводящих к интересным
результатам.
Статическая типизация в Java значительно снижает вероятность появления
ошибок – поскольку оба параметра имеют тип
int
, нам не придется беспоко
-
иться о значениях
null
или значениях, не умещающихся в 32-разрядные числа
со знаком.
В соответствии с рекомендациями по тестированию для Android модульные
тесты также называют «маленькими тестами», и они должны составлять по
-
рядка 70 % от общего объема тестов.
Выше в пирамиде тестирования находятся средние и большие тесты. Сред
-
ние тесты обычно совпадают с так называемыми интеграционными теста
-
ми – тестами, проверяющими работу нескольких логических блоков, классов
или методов. В соответствии с рекомендациями по тестированию для Android
средние тесты должны составлять порядка 20 % от общего объема тестов. Сред
-
ний, или интеграционный, тест может проверить правильность использования
учетных данных при входе в приложение, например: правильную обработку
пустых строк, соответствие их ожидаемым шаблонам, таким как адреса элект-
ронной почты. Если пользовательские данные хранятся локально на устрой
-
стве, интеграционный тест может проверить успешность аутентификации,
а в случае использования удаленной аутентификации – успешную отправку
HTTP-запроса, а также сам запрос на наличие в нем соответствующих заголов
-
ков, тела, шифрования и целевого адреса.
Некоторые интеграционные тесты могут быть инструментированными.
Инст рументированный тест – это тест, который выполняется на реальном
216
Тестирование
устройстве или в эмуляторе, получает события ввода, использует системные
часы и рисует пиксели на экране.
Библиотека Robolectric (
http://robolectric.org/
) очень популярна среди раз
-
работчиков Android и прекрасно подходит для реализации интеграционных
тестов. На конференции Google I/O 2018 была представлена новая версия Ro
-
bolectric 4 в комплексе с фреймворком тестирования AndroidX, заменившим
большую часть библиотек Robolectric. Многие детали интеграции этих инстру
-
ментов скрыты от пользователя и не должны вызывать нарушений в работе
существующего тестового кода. Чтобы получить более полное представление
об AndroidX и Robolectic, их интеграции и как извлечь максимальную выгоду
из каждого инструмента в конкретных условиях, мы советуем обратиться к до
-
кументации для разработчиков AndroidX Test (
h
ttps://oreil.ly/Wnp8A
).
Мы рекомендуем использовать Robolectric 4 и обязательно ознакомиться
с документацией к этой версии. Robolectric и AndroidX избавляют от необхо
-
димости писать массу шаблонного кода, предлагая свои фиктивные классы
фреймворка Android, эмуляцию жизненного цикла
Ac ti vi ty
и дополнительные
возможности, такие как система
Shadows
, которая позволяет легко смоделиро
-
вать любой существующий класс и переопределить логику его работы. Напри
-
мер, можно создать класс
ShadowThread
, который просто запускается в основном
потоке при вызове
start
вместо запуска нового потока выполнения, или
Shad
owThreadPoolExecutor
, который немедленно запускает свою очередь, синхронно
и последовательно, помогая тем самым значительно уменьшить сложность
тес тирования асинхронных приложений.
Для реализации интеграционных тестов с использованием AndroidX и Ro
-
bolectric необходимо знакомство с некоторыми дополнительными библиоте
-
ками. Далее мы покажем несколько примеров, но полное обсуждение приемов
тестирования выходит за рамки этой главы. Обязательно загляните в докумен
-
тацию для разработчиков Android (
https://oreil.
ly/EpCMX
), если у вас появится
желание глубже изучить подходы к тестированию в Android.
И наконец, на самой вершине пирамиды находятся большие, или сквозные,
тесты. Обычно все сквозные тесты являются инструментированными и могут
охватывать целые «процессы». Например, представьте приложение с функци
-
ей создания открытки, которая позволяет захватить изображение с использо
-
ванием камеры устройства, добавить в изображение различные графические
элементы, преобразовать результат в поток данных, выгрузить его на сервер,
где пользователь должен пройти аутентификацию, и сохранить изображение
на сервере, чтобы потом пользователь смог получить его или поделиться с дру
-
гими. Сквозной тест может запустить описанный процесс и проверить появле
-
ние изображения на сервере и его доступность для других.
Инструментированное тестирование
иногда называют «тестированием
пользовательского интерфейса», но на самом деле интеграционные тесты,
выполняемые вне инструментальной среды, тоже можно было бы назвать ин
-
струментированными. Как бы то ни было, при создании инструментирован
-
ных тестов часто полезно прибегнуть к помощи Espresso. Библиотека Espresso
предлагает цепочечный синтаксис и функциональную парадигму. Она может
имитировать щелчки и прокрутку, а также ввод текста и даже позволяет фикси
-
ровать пользовательский ввод и сравнивать фактический вывод с ожидаемым.
Android
217
Чтобы узнать больше о тестировании пользовательского интерфейса с исполь
-
зованием Espresso, загляните в документацию (
https://oreil.
ly/ziFOJ
).
Далее вы узнаете, как писать и выполнять модульные и интеграционные
тесты .
Создав новый проект в Android Studio, вы сразу же сможете найти каталоги
для тестов. Для этого можно использовать представление Android с раскрыва
-
ющимся списком каталогов проекта.
Откройте модуль приложения (обычно он имеет имя app), затем подкаталог
java. Внутри него вы найдете как минимум три каталога: каталог с основным
исходным кодом и с именем, совпадающим с именем вашего пакета (напри
-
мер, my.site.appname), и два каталога с тем же именем, но с дополнительными
метками в скобках (test) и (androidTest), которые отображаются более бледным
цветом, как показано на рис. 14.1.
Do'stlaringiz bilan baham: |