Grundlagen zum Testen von Android-Apps

Auf dieser Seite werden die wichtigsten Prinzipien für das Testen von Android-Apps beschrieben, einschließlich der zentrale Best Practices und deren Vorteile.

Vorteile von Tests

Tests sind ein wesentlicher Bestandteil der App-Entwicklung. Durch Ausführen von Tests kontinuierlich mit Ihrer App vergleichen, können Sie die Richtigkeit und Funktionalität Nutzungsverhalten und Nutzungsverhalten prüfen, bevor Sie sie veröffentlichen.

Sie können Ihre App manuell testen, indem Sie durch sie navigieren. Sie können verschiedene Geräte und Emulatoren erstellen, die Systemsprache ändern oder jeden User Flow durchlaufen.

Manuelle Tests skalieren jedoch schlecht und können leicht übersehen werden. sich auf das Verhalten Ihrer App auswirken. Für automatisierte Tests werden Tools verwendet. die Tests für Sie durchführen, was schneller, reproduzierbarer und allgemein Sie erhalten zu Beginn der Entwicklung umsetzbares Feedback zu Ihrer App. .

Testtypen in Android

Mobile Anwendungen sind komplex und müssen in vielen Umgebungen gut funktionieren. Als gibt es viele Arten von Tests.

Betreff

Zum Beispiel gibt es je nach Subjekt verschiedene Arten von Tests:

  • Funktionstests: Funktioniert die App wie gewünscht?
  • Leistungstests: Werden sie schnell und effizient durchgeführt?
  • Barrierefreiheitstests: Funktioniert die App gut mit Bedienungshilfen?
  • Kompatibilitätstests: Funktioniert das Gerät auf allen Geräten und API-Ebenen gut?

Aufgabenstellung

Tests variieren auch je nach Größe oder Isolationsgrad:

  • Mit Einheitentests oder kleinen Tests wird nur ein sehr kleiner Teil der App überprüft. wie eine Methode oder eine Klasse.
  • Mit End-to-End-Tests oder großen Tests lassen sich größere Teile der App zum Beispiel einen ganzen Bildschirm oder einen User Flow.
  • Mittellange Tests liegen dazwischen und prüfen die Integration zwischen zwei oder mehr Einheiten.
<ph type="x-smartling-placeholder">
</ph> Tests können entweder klein, mittel oder groß sein.
Abbildung 1: Testbereiche in einer typischen Anwendung

Es gibt viele Möglichkeiten, Tests zu klassifizieren. Der wichtigste Unterschied zwischen für App-Entwickler.

Instrumentierte und lokale Tests im Vergleich

Du kannst Tests auf einem Android-Gerät oder einem anderen Computer durchführen:

  • Instrumentierte Tests werden auf einem Android-Gerät, entweder physisch oder emuliert, ausgeführt. Die App wird zusammen mit einer Test-App erstellt und installiert, die Befehle und den Bundesstaat gelesen. Instrumentierte Tests sind normalerweise UI-Tests, und interagieren dann damit.
  • Lokale Tests werden auf Ihrem Entwicklungscomputer oder einem Server ausgeführt. auch Hostseitige Tests genannt. Sie sind meist klein und schnell, Testperson aus der restlichen App herausgenommen werden.
<ph type="x-smartling-placeholder">
</ph> Tests können als instrumentierte Tests auf einem Gerät oder als lokale Tests auf Ihrem Entwicklungscomputer ausgeführt werden.
Abbildung 2: Verschiedene Arten von Tests, je nachdem, wo sie ausgeführt werden

Nicht alle Einheitentests sind lokal und nicht alle End-to-End-Tests werden auf einem Gerät ausgeführt. Für Beispiel:

  • Großer lokaler Test: Sie können einen lokal ausgeführten Android-Simulator verwenden, z. B. als Robolectric.
  • Kleiner instrumentierter Test: Mit einem Framework-Feature wie z. B. eine SQLite-Datenbank. Sie können diesen Test mehrere Geräte verwenden, um die Integration mit verschiedenen SQLite-Versionen zu prüfen.

Beispiele

Die folgenden Snippets veranschaulichen die Interaktion mit der Benutzeroberfläche in einem instrumentierten UI-Test, bei dem ein Element angeklickt wird und geprüft wird, ob ein anderes wird angezeigt.

Espresso

// When the Continue button is clicked
onView(withText("Continue"))
    .perform(click())

// Then the Welcome screen is displayed
onView(withText("Welcome"))
    .check(matches(isDisplayed()))

Benutzeroberfläche zum Schreiben

// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()

// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()

Dieses Snippet zeigt einen Teil eines Einheitentests für ein ViewModel (lokal, hostseitig). testen):

// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)

// When data is loaded
viewModel.loadData()

// Then it should be exposing data
assertTrue(viewModel.data != null)

Teststrategie definieren

Idealerweise würden Sie jede Codezeile in Ihrer App auf jedem Gerät testen. mit denen deine App kompatibel ist. Leider ist dieser Ansatz zu langsam und kostspielig sein.

Eine gute Teststrategie findet das richtige Gleichgewicht Geschwindigkeit und Zuverlässigkeit ermitteln. Die Ähnlichkeit der Testumgebung mit auf einem echten Gerät die Genauigkeit des Tests bestimmt. Höhere Bildqualität wird ausgeführt auf emulierten Geräten oder dem physischen Gerät selbst. Tests mit niedrigerer Genauigkeit können ausgeführt werden, in der JVM Ihrer lokalen Workstation. High-Fidelity-Tests sind oft langsamer mehr Ressourcen erfordern, daher sollte nicht jeder Test ein High-Fidelity-Test sein.

Instabile Tests

Fehler können selbst bei korrekt entworfenen und implementierten Testläufen auftreten. Beispiel: wird bei einem Test auf einem echten Gerät möglicherweise ein automatisches Update im in der Mitte des Tests, sodass er fehlschlägt. Subtile Race-Bedingungen in Ihrem Code nur einen geringen Prozentsatz der Zeit. Tests, die nicht 100% der Uhrzeiten instabil sind.

Testbare Architektur

Bei einer testbaren App-Architektur folgt der Code einer Struktur, die es Ihnen ermöglicht, um verschiedene Teile davon einfach isoliert zu testen. Testbare Architekturen haben weitere Vorteile wie bessere Lesbarkeit, Verwaltbarkeit, Skalierbarkeit Wiederverwendbarkeit.

Eine Architektur, die nicht testbar ist, erzeugt Folgendes:

  • Größere, langsamere, instabilere Tests. Klassen, die nicht getestet werden können, haben möglicherweise von größeren Integrations- oder UI-Tests abgedeckt sein.
  • Weniger Möglichkeiten zum Testen verschiedener Szenarien Größere Tests sind langsamer, Daher kann es unrealistisch sein, alle möglichen Status einer App zu testen.

Weitere Informationen zu Architekturrichtlinien finden Sie im Leitfaden zur App-Erstellung Architektur.

Ansätze zur Entkopplung

Wenn Sie Teile einer Funktion, Klasse oder eines Moduls aus dem Rest extrahieren können, einfacher und effektiver ist. Diese Vorgehensweise wird als Entkopplung bezeichnet. ist das wichtigste Konzept einer testbaren Architektur.

Zu den gängigen Entkopplungsmethoden gehören:

  • App in Ebenen wie „Darstellung“, „Domain“ und „Daten“ aufteilen Sie können Außerdem kannst du die App in Module aufteilen, eines pro Funktion.
  • Fügen Sie Entitäten mit großen Abhängigkeiten keine Logik hinzu, z. B. Aktivitäten und Fragmente. Verwenden Sie diese Klassen als Einstiegspunkte in das Framework und Verschieben von UI und Geschäftslogik an eine andere Stelle, etwa in ein Composable, ViewModel oder Domain-Ebene.
  • Vermeiden Sie direkte Framework-Abhängigkeiten in Klassen, die Geschäftslogik enthalten. Verwenden Sie beispielsweise keine Android-Kontexte in ViewModels.
  • Machen Sie Abhängigkeiten einfach ersetzt. Verwenden Sie beispielsweise Schnittstellen anstelle von konkreten Implementierungen verwenden. Verwenden Sie Abhängigkeitsinjektion, auch wenn Sie kein DI-Framework verwenden

Nächste Schritte

Jetzt, da Sie wissen, warum Sie Tests durchführen sollten, und die beiden Haupttypen von Tests kennen, können Sie Hier erfahren Sie, was getestet werden sollte.

Wenn Sie Ihren ersten Test erstellen und durch Ausprobieren lernen möchten, aktivieren Sie Codelabs.