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
.