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

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 .