Зачем тестировать Activity в Android-приложении?

Ответ

Activity — это фундаментальный компонент UI в Android, представляющий собой один экран с пользовательским интерфейсом. Тестирование Activity необходимо для проверки корректности её жизненного цикла, визуального представления и взаимодействия с пользователем.

Ключевые аспекты тестирования Activity:

  • Жизненный цикл: Убедиться, что состояние сохраняется и восстанавливается при повороте экрана, сворачивании/разворачивании приложения или при его завершении системой. Например, введённый текст в поле не должен пропадать.
  • Навигация: Проверка корректных переходов (Intent) между Activity и передачи данных.
  • Взаимодействие с UI: Все элементы (кнопки, поля ввода, списки) должны реагировать на действия пользователя.
  • Визуальная целостность: Разметка (Layout) должна корректно отображаться на разных размерах и плотностях экрана.

Пример теста навигации с использованием Espresso (Kotlin):

@Test
fun clickLoginButton_navigatesToHomeActivity() {
    // Находим кнопку на текущей Activity (LoginActivity) и кликаем по ней
    onView(withId(R.id.button_login)).perform(click())

    // Проверяем, что был запущен Intent с целевой Activity (HomeActivity)
    intended(hasComponent(HomeActivity::class.java.name))
}

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

Ответ 18+ 🔞

Да ты послушай, что за дичь творится с этими вашими Activity! Ну вроде как один экран, интерфейс там, кнопочки. А на деле — это же просто ёперный театр какой-то, блядь! Один неверный чих, и всё, приложение накрылось медным тазом, пользователь в ярости, а тебе потом разгребать.

Вот смотри, на что тут, сука, внимание разбить надо, а то пиши пропало:

На что орать в первую очередь, когда тестируешь эту хрень:

  • Жизненный цикл, мать его. Это пиздец просто. Повернул телефон — всё, текст, который пользователь полчаса вбивал, испарился в хуйву. Свернул приложение, чтобы смску ответить, — а когда вернулся, оно заново запустилось, будто ничего и не было. Надо проверять, чтобы состояние сохранялось, как будто ничего и не произошло. Чистая магия, блядь, но должна работать!
  • Навигация. Вот нажал кнопку «Вперёд» — и должен попасть на следующий экран. А не в жопу, в никуда, или, что хуже, обратно на тот же самый. И данные, если передаются, должны дойти, а не потеряться по дороге, как носки в стирке.
  • Тыканье по кнопкам. Это же основа основ! Нажал — что-то должно произойти. Кнопка должна нажиматься, поле — принимать текст, список — прокручиваться. Если после клика только тишина и грусть — это пиздец, а не фича.
  • Внешний вид. Запустил на планшете — всё растянулось, как сопли. Запустил на маленьком экране — половина кнопок за горизонт уехала. Разметка должна сидеть ровно, а не выглядеть как пьяный пазл.

Вот, смотри, как это примерно выглядит в коде, если проверять переход между экранами (Espresso, Kotlin):

@Test
fun clickLoginButton_navigatesToHomeActivity() {
    // Ищем эту ёбаную кнопку входа и долбим по ней
    onView(withId(R.id.button_login)).perform(click())

    // А теперь проверяем, не обосралось ли ничего, и правда ли нас перекинуло куда надо
    intended(hasComponent(HomeActivity::class.java.name))
}

Короче, если этот фундамент, эта самая Activity, — кривой, то всё остальное — просто надстройка на болоте. Проверяй её со всех сторон, пока не будешь уверен, что она не развалится от первого же чиха пользователя. Иначе волнение ебать, потом получишь, а терпения ноль ебать на фиксы.