Робоэлектрические стратегии

Robolectric — это платформа с открытым исходным кодом, поддерживаемая Google, которая позволяет запускать тесты в моделируемой среде Android внутри JVM без накладных расходов и нестабильности эмулятора. Он поддерживает все версии Android, начиная с Lollipop (уровень API 21).

Многие крупные проекты используют Robolectric для повышения скорости и надежности своих тестов и снижения затрат, связанных с запуском тестов на реальных устройствах или эмуляторах. Сюда входит большинство приложений Google, которые в значительной степени полагаются на Robolectric.

Robolectric не является полной заменой эмулятора, поскольку он не поддерживает все функции и API. Например, у Robolectric нет экрана, как у эмулятора, а некоторые API поддерживаются лишь частично. Тем не менее, он эмулирует достаточное количество частей Android для надежного выполнения модульных тестов и большинства тестов пользовательского интерфейса.

Стратегии тестирования

С Robolectric вы можете использовать два типа стратегий тестирования: модульное тестирование и тестирование пользовательского интерфейса.

Модульное тестирование

Robolectric был задуман как способ включить «модульное тестирование» в приложениях Android. Например, вы можете смоделировать запуск Activity и протестировать внутри него логику, вызывая все методы жизненного цикла.

Вы также можете использовать подделки Robolectric (называемые тенями) в качестве зависимостей для модульных тестов. Например, если ваш класс использует Bundle или вам нужно имитировать соединение Bluetooth .

В общем, если вы реализуете тестируемую архитектуру , вам не нужно использовать Robolectric для модульного тестирования, поскольку ваш код должен тестироваться изолированно, без каких-либо зависимостей от платформы Android.

Тестирование пользовательского интерфейса

Robolectric также может запускать тесты пользовательского интерфейса , такие как тесты Espresso или Compose. Вы можете преобразовать инструментированный тест в Robolectric, переместив его в исходный набор test и настроив зависимости Robolectric.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

Любой тест пользовательского интерфейса, присутствующий в наборе исходного кода test выполняется с помощью Robolectric.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

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

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

Вы должны решить, достаточно ли хороша реализация Robolectric для каждого варианта использования, но вот несколько рекомендаций:

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

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

Робоэлектрические испытания в сравнении с устройствами

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