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 .
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 .
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 .