Чем отличаются Unit и UI тесты (контекст)?android-246

Unit тесты

@Test
fun addition_isCorrect() {
    val calculator = Calculator()
    assertEquals(4, calculator.add(2, 2))
}

Контекст:

  1. Уровень изоляции: Тестируют отдельные компоненты (классы, методы) в изоляции от других частей системы
  2. Скорость: Выполняются очень быстро (миллисекунды на тест)
  3. Зависимости: Используют mock-объекты (Mockito) для изоляции тестируемого кода
  4. Цель: Проверка бизнес-логики, алгоритмов, преобразования данных
  5. Инструменты: JUnit, Mockito, Truth, Hamcrest
  6. Расположение: src/test/java/

Когда использовать:

  • Тестирование отдельных методов класса
  • Проверка сложных алгоритмов
  • Валидация преобразования данных

UI тесты

@Test
fun loginButton_click_showsWelcomeMessage() {
    onView(withId(R.id.login_button))
        .perform(click())
    onView(withText("Welcome!"))
        .check(matches(isDisplayed()))
}

Контекст:

  1. Уровень изоляции: Тестируют приложение как целое (или большие компоненты)
  2. Скорость: Выполняются медленно (секунды на тест)
  3. Зависимости: Требуют эмулятора/устройства или Robolectric
  4. Цель: Проверка взаимодействия с UI и интеграции компонентов
  5. Инструменты: Espresso, UI Automator, Robolectric
  6. Расположение: src/androidTest/java/

Когда использовать:

  • Тестирование взаимодействия между Activity/Fragment
  • Проверка корректности отображения UI
  • Энд-ту-энд сценарии пользовательского потока

Ключевые отличия

Характеристика Unit тесты UI тесты
Скорость выполненияБыстрыеМедленные
Уровень тестированияНизкий (код)Высокий (UI)
ЗависимостиMock-объектыРеальная система
Стоимость поддержкиНизкаяВысокая
ПокрытиеЛогикаПользовательский опыт

Best Practices

  1. Пирамида тестирования: 70% Unit, 20% Integration, 10% UI
  2. Избегайте дублирования: Не тестируйте в UI тестах то, что можно проверить Unit-тестами
  3. Идемпотентность: UI тесты должны быть независимыми и воспроизводимыми

Резюмируем:

Unit тесты фокусируются на отдельных компонентах в изоляции, тогда как UI тесты проверяют интеграцию компонентов и пользовательский интерфейс. Оба типа дополняют друг друга в комплексной стратегии тестирования.