Robolektrische Strategien

Robolectric ist ein von Google gepflegtes Open-Source-Framework, mit dem Sie Tests in einer simulierten Android-Umgebung innerhalb einer JVM ausführen können, ohne den Overhead und die Unzuverlässigkeit eines Emulators. Sie unterstützt alle Android-Versionen ab Lollipop (API-Level 21).

Viele große Projekte verwenden Robolectric, um die Geschwindigkeit und Zuverlässigkeit ihrer Tests zu erhöhen und die Kosten für die Ausführung von Tests auf echten Geräten oder Emulatoren zu senken. Dazu gehören die meisten Google-Apps, die stark auf Robolectric basieren.

Robolectric ist kein vollständiger Ersatz für einen Emulator, da nicht alle Funktionen und APIs unterstützt werden. Robolectric hat beispielsweise kein Display wie ein Emulator und einige APIs werden nur teilweise unterstützt. Es emuliert jedoch genügend Teile von Android, um Einheitentests und die meisten UI-Tests zuverlässig auszuführen.

Teststrategien

Mit Robolectric können zwei Arten von Teststrategien angewendet werden: Unittests und UI-Tests.

Einheitentest

Robolectric wurde entwickelt, um „Unit-Tests“ in Android-Apps zu ermöglichen. Sie können beispielsweise den Start einer Aktivität simulieren und die darin enthaltene Logik testen, indem Sie alle Lebenszyklusmethoden aufrufen.

Sie können auch die Fakes von Robolectric (sogenannte Schatten) als Abhängigkeiten für Unit-Tests verwenden. Dies ist beispielsweise der Fall, wenn Ihre Klasse ein Bundle verwendet oder Sie eine Bluetooth-Verbindung fälschen müssen.

Wenn Sie eine testbare Architektur implementieren, müssen Sie Robolectric in der Regel nicht für Unit-Tests verwenden, da Ihr Code isoliert getestet werden sollte, ohne Abhängigkeiten vom Android-Framework.

UI-Tests

Robolectric kann auch UI-Tests wie Espresso- oder Compose-Tests ausführen. Sie können einen instrumentierten Test in Robolectric umwandeln, indem Sie ihn in den Quellsatz test verschieben und die Robolectric-Abhängigkeiten einrichten.

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

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

Alle UI-Tests im test-Quellsatz werden mit Robolectric ausgeführt.

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)))
     }
}

Die meisten UI-Tests interagieren nicht mit dem Framework und können mit Robolectric ausgeführt werden. Sie können Verhaltenstests mit Robolectric ausführen, da die erforderliche Wiedergabetreue mehr als ausreichend ist. Das ist beispielsweise der Fall, wenn bei einem Schreibtest geprüft wird, ob sich die UI nach dem Klicken auf eine Schaltfläche geändert hat.

Mit Robolectric können Sie auch andere UI-Tests ausführen, z. B. Screenshot-Tests. Die Wiedergabequalität ist jedoch geringer, da verschiedene Geräte Bildschirme etwas unterschiedlich darstellen.

Sie müssen entscheiden, ob die Implementierung von Robolectric für jeden Anwendungsfall geeignet ist. Hier sind einige Empfehlungen:

  • Verwenden Sie Robolectric für isolierte UI-Verhaltenstests für Komponenten, Funktionen oder Anwendungstests. Im Allgemeinen prüfen diese Tests die Zustandsverwaltung und das Verhalten der UIs und interagieren nicht mit externen Abhängigkeiten.
  • Mit Robolectric können Sie Screenshots aufnehmen, wenn die Pixelgenauigkeit nicht entscheidend ist. Zum Beispiel, um zu testen, wie eine Komponente auf verschiedene Schriftgrößen oder Designs reagiert.

Hinweis: Mit Robolectric können Screenshots nativ aufgenommen werden. Sie benötigen jedoch eine Drittanbieterbibliothek, um Screenshottests durchzuführen.

Robolektrische Tests im Vergleich zu Geräten

Zusammenfassend lässt sich sagen, dass Robolectric auch die meisten UI-Tests ausführen kann. In einigen Fällen sind jedoch Gerätetests erforderlich, z. B. wenn es um System-UIs wie Edge-to-Edge oder Bild im Bild geht oder wenn nicht unterstützte Funktionen wie WebView verwendet werden.