Robolectric to framework open source obsługiwany przez Google, który umożliwia uruchamianie testów w symulowanym środowisku Androida w ramach JVM bez obciążenia i niestabilności emulatora. Obsługuje wszystkie wersje Androida od Lollipop (poziom API 21).
Wiele dużych projektów korzysta z Robolectric, aby zwiększyć szybkość i wiarygodność testów oraz ograniczyć koszty związane z wykonywaniem testów na prawdziwych urządzeniach lub emulatorach. Obejmuje to większość aplikacji Google, które w dużym stopniu bazują na Robolectric.
Robolectric nie zastępuje w pełni emulatora, ponieważ nie obsługuje wszystkich funkcji i interfejsów API. Na przykład Robolectric nie ma ekranu, tak jak emulator, a niektóre interfejsy API są obsługiwane tylko częściowo. Emuluje jednak wystarczającą liczbę elementów Androida, aby można było niezawodnie przeprowadzać testy jednostkowe i większość testów interfejsu użytkownika.
Testowanie strategii
W Robolectric możesz stosować 2 rodzaje strategii testowania: testowanie jednostkowe i testowanie interfejsu użytkownika.
Testowanie jednostkowe
Robolectric został stworzony jako sposób na umożliwienie „testowania jednostkowego” aplikacji na Androida. Możesz na przykład symulować uruchamianie Activity i testować logikę wewnątrz niego, wywołując wszystkie metody cyklu życia.
Jako zależności w testach jednostek możesz też używać fałszywych danych Robolectric (tzw. cieni). Na przykład, jeśli Twoja klasa korzysta z pakietu lub musisz symulować połączenie Bluetooth.
Jeśli zaimplementujesz architekturę testową, nie musisz używać Robolectric do testowania jednostkowego, ponieważ Twój kod powinien być testowany oddzielnie, bez zależności od platformy Android.
Testowanie interfejsu użytkownika
Robolectric może też przeprowadzać testy UI, takie jak testy Espresso lub Compose. Możesz przekonwertować test z instrumentacją na test Robolectric, przenosząc go do zestawu test
źródeł i konfigurując zależności Robolectric.
android {
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}
dependencies {
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.13")
}
Każdy test interfejsu znajdujący się w zbiorze źródłowym test
jest uruchamiany przez 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)))
}
}
Większość testów interfejsu użytkownika nie wchodzi w interakcję z ramką i można je uruchamiać w Robolectric. Możesz przeprowadzać testy zachowania w Robolectric, ponieważ dokładność tego narzędzia w pełni wystarcza. Na przykład gdy testowanie kodu źródłowego sprawdza, czy interfejs użytkownika zmienił się po kliknięciu przycisku.
Za pomocą Robolectric możesz też wykonywać inne testy interfejsu użytkownika, np. testy zrzutów ekranu. Jednak jakość jest niższa, ponieważ różne urządzenia renderują ekrany nieco inaczej.
Musisz zdecydować, czy implementacja Robolectric jest wystarczająca w każdym przypadku użycia, ale oto kilka zaleceń:
- Używaj Robolectric do testów zachowania UI w przypadku komponentów, funkcji lub aplikacji. Ogólnie te testy sprawdzają zarządzanie stanem i zachowanie interfejsu użytkownika, ale nie oddziałują na zewnętrzne zależności.
- Użyj Robolectric do robienia zrzutów ekranu, gdy dokładność pikseli nie jest krytyczna. Możesz na przykład sprawdzić, jak komponent reaguje na różne rozmiary czcionki lub motywy.
Uwaga: Robolectric może robić zrzuty ekranu w sposób natywny, ale do testowania zrzutów ekranu za pomocą tego narzędzia potrzebna jest biblioteka innej firmy.
Testy Robolectric a testy urządzeń
Podsumowując, Robolectric zapewnia wystarczającą zgodność, aby przeprowadzać większość testów interfejsu użytkownika, ale w niektórych przypadkach konieczne są testy na urządzeniu, np. w przypadku testów związanych z interfejsem systemu, takich jak wyświetlanie obrazu od krawędzi do krawędzi lub obrazu w obrazie, lub gdy korzystasz z nieobsługiwanych funkcji, takich jak WebView
.