Какие методы тестирования применяются
Что проверяют
Есть ли у вас реальная практика тестирования Android-приложений или только знание слова JUnit. Интервьюер хочет услышать границы между видами тестов и почему вы взяли те или иные инструменты. Следом обычно спрашивают, как тестировать корутины и ViewModel или как держать UI-тесты стабильными.
Как отвечать
Опирайтесь на пирамиду тестов и два каталога проекта:
- локальные юнит-тесты (
src/test): идут на JVM за секунды. JUnit 4 (JUnit 5 подключают сторонним плагином), моки через MockK или Mockito, для корутинkotlinx-coroutines-testсrunTestи подменойDispatchers.Main, дляFlowудобна Turbine. Здесь проверяютViewModel, юзкейсы, репозитории; - Robolectric: запускает код, завязанный на Android SDK, прямо на JVM. Компромисс между скоростью и реализмом;
- инструментальные тесты (
src/androidTest): на эмуляторе или устройстве черезAndroidJUnitRunner. Сюда попадает работа с Room (помогаетRoom.inMemoryDatabaseBuilder) и DI через@HiltAndroidTest; - UI-тесты: Espresso для View, для Compose
createComposeRuleи поиск узлов вродеonNodeWithText. UI Automator нужен, когда тест выходит за пределы приложения: системные диалоги, уведомления; - скриншотные тесты: Paparazzi или Roborazzi сравнивают отрисовку с эталоном без устройства;
- сквозные сценарии: Maestro или Appium поверх собранного APK;
- производительность: Macrobenchmark для времени запуска и плавности прокрутки.
Скажите, где это запускается: юнит-тесты на каждый коммит в CI, инструментальные на Gradle Managed Devices или в облачной ферме устройств. Приводите свои цифры: сколько тестов, сколько длится прогон, что поймали.
Где спотыкаются
Ставят Thread.sleep в UI-тестах. Тесты становятся медленными и нестабильными, ждать нужно через Idling Resources в Espresso или waitUntil в Compose.
Пишут всё инструментальными тестами. Прогон растягивается на десятки минут, хотя большую часть логики можно проверить на JVM.
Мокают всё подряд, включая свои простые классы. Тест проверяет не поведение, а порядок вызовов, и ломается при любом рефакторинге.