На этой странице описаны основные принципы тестирования приложений для Android, включая основные рекомендации и их преимущества.
Навыки работы с Android
Посмотреть на GitHubСоздайте стратегию тестирования
android skills add testing-setupПреимущества тестирования
Тестирование – это неотъемлемая часть процесса разработки. Оно помогает убедиться в правильной работе приложения и его функций, а также проверить удобство использования. Если вы будете регулярно проводить тестирования,
Вы можете протестировать приложение вручную, переходя по его разделам. Вы можете использовать разные устройства и эмуляторы, менять язык системы, пытаться вызвать все возможные ошибки и пройти все пути пользователя.
Однако ручное тестирование плохо масштабируется, и можно легко упустить из виду регрессии в поведении приложения. Автоматизированное тестирование выполняется с помощью специальных инструментов. Оно позволяет быстрее получить результаты, которые можно использовать для улучшения приложения на ранних этапах разработки.
Типы тестов в Android
Мобильные приложения – это сложные продукты, которые должны работать в разных средах. Поэтому существует множество типов тестов.
Тема
Например, в зависимости от предмета тестирования различают следующие типы тестов:
- Функциональное тестирование. Выполняет ли приложение свои задачи?
- Тестирование производительности: быстро ли и эффективно ли оно работает?
- Тестирование специальных возможностей. Хорошо ли приложение работает с сервисами специальных возможностей?
- Тестирование совместимости. Хорошо ли работает приложение на всех устройствах и уровнях API?
Область действия
Тесты также различаются по размеру и степени изоляции.
- Модульные, или небольшие, тесты проверяют только малую часть приложения, например метод или класс.
- Сквозные или большие тесты проверяют более крупные части приложения, например весь экран или путь пользователя.
- Средние тесты находятся посередине и проверяют интеграцию между двумя или более блоками.
Существует множество способов классификации тестов. Однако наиболее важным различием для разработчиков приложений является то, где выполняются тесты.
Инструментальные и локальные тесты
Вы можете запустить тесты на устройстве Android или другом компьютере.
- Инструментальные тесты выполняются на устройстве Android (физическом или эмулированном). Приложение создается и устанавливается вместе с тестовым приложением, которое вводит команды и считывает состояние. Инструментальные тесты обычно представляют собой тесты пользовательского интерфейса, запускающие приложение и затем взаимодействующие с ним.
- Локальные тесты выполняются на компьютере для разработки или сервере, поэтому их также называют тестами на стороне хоста. Обычно они небольшие и быстрые, изолирующие тестируемый субъект от остальной части приложения.
Не все модульные тесты являются локальными, и не все сквозные тесты выполняются на устройстве. Пример:
- Большой локальный тест. Вы можете использовать локальный симулятор Android, например Robolectric.
- Небольшой инструментальный тест. Позволяет проверить, правильно ли код работает с функцией фреймворка, например базой данных SQLite. Вы можете запустить этот тест на нескольких устройствах, чтобы проверить интеграцию с разными версиями SQLite.
Примеры
В следующих фрагментах кода показано, как взаимодействовать с интерфейсом в инструментированном тесте интерфейса, который нажимает на элемент и проверяет, отображается ли другой элемент.
Espresso
// When the Continue button is clicked
onView(withText("Continue"))
.perform(click())
// Then the Welcome screen is displayed
onView(withText("Welcome"))
.check(matches(isDisplayed()))
Интерфейс Compose
// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()
// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
Этот фрагмент кода показывает часть модульного теста для ViewModel (локальный тест на стороне хоста):
// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)
// When data is loaded
viewModel.loadData()
// Then it should be exposing data
assertTrue(viewModel.data != null)
Тестируемая архитектура
При тестируемой архитектуре приложения код имеет структуру, которая позволяет легко тестировать различные его части по отдельности. Тестируемые архитектуры имеют и другие преимущества, такие как лучшая читаемость, удобство обслуживания, масштабируемость и возможность повторного использования.
Архитектура, которая не поддается тестированию, приводит к следующим результатам:
- Более крупные, медленные и нестабильные тесты. Классы, которые не могут быть протестированы модульно, могут быть покрыты более крупными интеграционными тестами или тестами пользовательского интерфейса.
- Меньше возможностей для тестирования разных сценариев. Чем больше тестов, тем медленнее они выполняются, поэтому протестировать все возможные состояния приложения может быть нереально.
Подробнее о рекомендациях по архитектуре…
Подходы к разделению
Если вы можете извлечь часть функции, класса или модуля из остального, протестировать его проще и эффективнее. Такой подход называется разделением, и это самая важная концепция тестируемой архитектуры.
Вот распространенные методы декуплирования:
- Разделите приложение на слои, например презентации, домена и данных. Вы также можете разделить приложение на модули, по одному на каждую функцию.
- Не добавляйте логику в объекты с большими зависимостями, такие как действия и фрагменты. Используйте эти классы как точки входа в фреймворк и переместите пользовательский интерфейс и бизнес-логику в другое место, например в Composable, ViewModel или слой домена.
- Избегайте прямых зависимостей фреймворка в классах, содержащих бизнес-логику. Например, не используйте контексты Android в ViewModels.
- Сделайте так, чтобы зависимости было легко заменить. Например, используйте интерфейсы вместо конкретных реализаций. Используйте внедрение зависимостей, даже если вы не используете фреймворк внедрения зависимостей.
Дальнейшие действия
Теперь, когда вы знаете, зачем нужно тестирование и какие бывают типы тестов, вы можете прочитать о том, что тестировать, или узнать о стратегиях тестирования.
Если вы хотите создать свой первый тест и учиться на практике, ознакомьтесь с практическими работами по тестированию.