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

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 Unit-Tests und die meisten UI-Tests zuverlässig auszuführen.

Teststrategien

Mit Robolectric können Sie zwei Arten von Teststrategien verfolgen: Unit-Tests und UI-Tests.

Unit-Tests

Robolectric wurde entwickelt, um „Unit-Tests“ in Android-Apps zu ermöglichen. So können Sie beispielsweise das Starten 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. Das ist beispielsweise der Fall, wenn in Ihrer Klasse ein Bundle verwendet wird oder Sie eine Bluetooth-Verbindung simulieren 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

Mit Robolectric können auch UI-Tests wie Espresso- oder Compose-Tests ausgeführt werden. Sie können einen instrumentierten Test in Robolectric konvertieren, indem Sie ihn in das test-Quellset 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. Beispiel: In einem Compose-Test wird überprüft, ob sich die Benutzeroberfläche 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.
  • Verwenden Sie Robolectric, um Screenshots aufzunehmen, wenn die Pixelgenauigkeit nicht kritisch ist. So können Sie beispielsweise testen, wie eine Komponente auf verschiedene Schriftgrößen oder Themen reagiert.

Hinweis: Robolectric kann nativ Screenshots aufnehmen, aber Sie benötigen eine Drittanbieterbibliothek, um damit Screenshot-Tests durchzuführen.

Robolectric im Vergleich zu Gerätetests

Zusammenfassend lässt sich sagen, dass Robolectric für die meisten UI-Tests eine ausreichende Wiedergabetreue bietet. In einigen Fällen sind jedoch weiterhin Gerätetests erforderlich, z. B. bei Tests im Zusammenhang mit der System-UI wie Vollbild oder Bild-im-Bild oder bei der Verwendung nicht unterstützter Funktionen wie WebView.