В последние годы в разработке Android наметился заметный сдвиг в сторону декларативных UI-фреймворков, и последним дополнением к этой экосистеме стал Jetpack Compose. Декларативные UI-фреймворки предлагают структуры контроля, с помощью которых можно менять способ отрисовки пользовательского интерфейса. Декларативно созданные пользовательские интерфейсы могут использовать эти структуры управления, что делает их более динамичными, чем императивные фреймворки, которые обычно используются для разработки под Android и IOS. 

В этой статье мы расскажем о лучших практиках и методах тестирования приложений на базе Jetpack Compose, и о том, как использовать эти инструменты и методы для обеспечения качества и надежности приложения. 

Для начала мы расскажем о Jetpack и о том, как работает фреймворк Compose. Затем мы поговорим о юнит-тестировании и выстраивании процесса тестирования. Далее мы рассмотрим на примерах, как проводить простое интеграционное тестирование и тестирование при помощи Espresso. Наконец, перечислим преимущества и недостатки тестирования с помощью Jetpack. 

Если вы впервые работаете с Android, ознакомьтесь с этими статьями, прежде чем продолжить.

Что такое Jetpack Compose?

Jetpack Compose — это современный реактивный UI-фреймворк для Android, позволяющий разработчикам быстро и легко создавать красивые, отзывчивые и настраиваемые пользовательские интерфейсы.

Одним из ключевых преимуществ этого фреймворка является его способность сокращать количество шаблонного кода, необходимого для создания элементов пользовательского интерфейса. Благодаря этому разработчикам становится проще и быстрее создавать и поддерживать приложения, а также легче тестировать и отлаживать их. 

Однако тестирование с помощью Jetpack Compose все же может оказаться непростой задачей, особенно для тех, кто только начинает с ним работать.

Процесс тестирования с Compose и юнит-тестирование

Юнит-тестирование является важной составляющей процесса разработки программного обеспечения, и Jetpack Compose не является исключением. Юнит-тестирование позволяет разработчикам изолированно тестировать отдельные блоки кода, чтобы подтвердить, что они работают так, как задумано, и что вносимые в код изменения не нарушат существующую функциональность. 

Чтобы провести юнит-тестирование кода Jetpack Compose, можно использовать библиотеку AndroidX Test. Она дает несколько ценных инструментов и классов для тестирования Android-приложений, в том числе класс ComposeTestRule.

Класс ComposeTestRule, предоставляемый AndroidX Test библиотекой, позволяет разработчикам создавать представления Jetpack Compose и манипулировать ими в своих тестах. Он используется вместе с JUnit 4 и может применяться для установки и удаления представлений Jetpack Compose в рамках процесса тестирования.

Для использования ComposeTestRule нужно аннотировать тестовый класс аннотацией @RunWith(JUnit4::class) и создать экземпляр ComposeTestRule как поле @get:Rule в классе. Затем можно использовать этот экземпляр для установки содержимого Activity в представлении Jetpack Compose и взаимодействия с этим представлением в рамках теста.

Использование ComposeTestRule

Приведем пример использования класса ComposeTestRule для тестирования простого UI-элемента Jetpack Compose:

@RunWith(JUnit4::class)
class MyTest {
  @get:Rule
  val composeTestRule = ComposeTestRule()

  @Test
  fun testMyButton() {
    // Create the Jetpack Compose view
    val myButton = @Composable {
      Button(onClick = { /* Do something */ }) {
        Text("Click me")
      }
    }

    // Set the view as the content of the Activity
    composeTestRule.setContent {
      myButton
    }

    // Find the Button view and perform a click action
    onNodeWithText("Click me").performClick()

    // Verify that the button was clicked
    assertTrue(/* Button was clicked */)
  }
}

В этом примере мы используем правило ComposeTestRule, чтобы установить представление Jetpack Compose в качестве содержимого Activity, а затем используем метод onNodeWithText() для поиска представления Button и выполнения клика на нем. Затем можно использовать утверждения для проверки того, что кнопка была нажата, как и ожидалось.

Интеграционное тестирование

Хотя юнит-тестирование очень важно для проверки отдельных частей кода, необходимо также проверить, как эти части работают вместе как единое целое. Здесь на помощь приходит интеграционное тестирование. 

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

Для проведения интеграционного тестирования в Jetpack Compose можно использовать класс AndroidJUnitRunner, который входит в состав библиотеки AndroidX Test. Подобно рабочему процессу UI-тестирования, этот класс позволяет запускать Activity и взаимодействовать с ней, как с реальным пользователем, включая нажатие кнопок, ввод текста в поля и т.д. 

Приведем пример использования класса AndroidJUnitRunner для проведения интеграционного тестирования Jetpack Compose:

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyIntegrationTest {
  @get:Rule
  val activityRule = ActivityTestRule(MyActivity::class.java)

  @Test
  fun testMyUI() {
    // Find the Button view and perform a click action
    onView(withId(R.id.my_button)).perform(click())

    // Find the TextView and verify that the text has been updated
    onView(withId(R.id.my_text_view)).check(matches(withText("Button clicked!")))
  }
}

Здесь мы используем ActivityTestRule для запуска MyActivity Activity, а затем с помощью метода onView() находим view Button и выполняем клик. Затем можно снова использовать метод onView(), чтобы найти TextView и убедиться, что текст обновился, как и ожидалось. 

Тестирование на Espresso

Помимо библиотеки AndroidX Test, для тестирования приложений на базе Jetpack Compose разработчики могут использовать фреймворк тестирования Espresso. Espresso — это популярный фреймворк тестирования для Android, позволяющий разработчикам писать надежные автоматизированные UI-тесты для своих приложений.

Чтобы использовать Espresso с Jetpack Compose, необходимо использовать класс ViewInteraction для взаимодействия с элементами пользовательского интерфейса. Класс ViewInteraction позволяет выполнять действия над представлениями и утверждать их состояние. 

Вот пример использования Espresso для тестирования UI-элемента Jetpack Compose:

@RunWith(AndroidJUnit4::class)
class MyEspressoTest {
  @get:Rule
  val activityRule = ActivityTestRule(MyActivity::class.java)

  @Test
  fun testMyButton() {
    // Find the Button view and perform a click action
    onView(withId(R.id.my_button)).perform(click())

    // Find the TextView and verify that the text has been updated
    onView(withId(R.id.my_text_view)).check(matches(withText("Button clicked!")))
  }
}

Как видите, мы снова используем метод onView(), чтобы найти Button view и кликнуть по нему; а затем снова используем метод onView(), чтобы найти TextView и проверить, что текст обновился, как и ожидалось. 

Преимущества и недостатки тестирования с помощью Jetpack Compose

Использование Jetpack Compose для разработки приложений и инструментов тестирования для проверки их работы имеет множество преимуществ. Однако важно помнить, что, как и в любой другой технологии, здесь есть свои компромиссы. 

Ниже приведены преимущества и недостатки использования Jetpack Compose. 

Преимущества:

  • Jetpack Compose позволяет разработчикам значительно сократить объем шаблонного кода, необходимого для создания UI-элементов, что упрощает и ускоряет разработку и поддержку приложений. Это также облегчает тестирование и отладку приложений, поскольку в них меньше кода, о котором приходится беспокоиться.

  • Библиотека AndroidX Test и фреймворк тестирования Espresso предоставляют широкий набор инструментов и возможностей для тестирования приложений на базе Jetpack Compose, включая возможность настройки и управления представлениями, выполнения действий над ними и утверждений об их состоянии.

  • Jetpack Compose использует реактивную модель программирования, то есть UI-элементы автоматически обновляются в ответ на изменения базовых данных. Это упрощает процесс тестирования, поскольку можно изменять данные и проверять, что пользовательский интерфейс обновляется в соответствии с ожиданиями.

Недостатки:

  • Jetpack Compose — относительно новый фреймворк, поэтому разработчикам, не знакомым с ним, может потребоваться обучение. 

  • Jetpack Compose использует модель программирования, отличную от традиционных UI-фреймворков Android, таких как система Android View. Возможно, разработчикам придется применять новые методики и подходы к тестированию — и ознакомление с этими концепциями потребует времени.

  • Jetpack Compose находится в стадии активной разработки и может подвергаться изменениям и обновлениям. Это может усложнить сопровождение тестов с течением времени, поскольку разработчикам придется постоянно обновлять свои стратегии тестирования, чтобы соответствовать этим изменениям.

Подробнее тестирование с Jetpack Compose разберем на открытом уроке 12 октября. Рассмотрим особенности данной технологии и возможные подходы к написанию автотестов.

Также приглашаем тестировщиков на другие открытые уроки курса "Kotlin QA Engineer":

  • 28 сентября: Автоматизации тестирования на Kotlin: настоящее и будущее в 2023 году. Регистрация

  • 19 октября: Взаимодействие с СУБД для заполнения тестовых данных на Kotlin. Регистрация

Комментарии (0)