Testautomatisierung mit Maestro

Maestro: das einfachste und effektivste Framework für die Testautomatisierung mobiler Apps?

Wer heute mobile Apps automatisiert testen möchte, der muss sich auf einen hohen Aufwand für die Einrichtung des Testframeworks einstellen. Zudem werden dafür technisch versierte Expert:innen in der Qualitätssicherung benötigt, die anschließend die Umsetzung der Testautomatisierung auf Basis einer soliden Software-Architektur übernehmen.

Maestro ist ein junges und spannendes Open-Source-Framework. Der Anbieter hat sich zum Ziel gesetzt, die Komplexität in der Testautomatisierung für mobile Apps zu reduzieren. Anders als andere Technologien fokussiert sich Maestro ausschließlich auf mobile Apps und möchte typische Fehlerszenarien bei der Automatisierung direkt mit den mitgelieferten Hausmitteln lösen.

Das ist Grund genug, das Framework mal im Detail anzuschauen. In diesem Artikel stellen wir Maestro vor und gehen dabei der Frage nach, ob Maestro dem eigenen Anspruch wirklich gerecht wird.

Was ist Maestro und was leistet das UI Testing Framework?

Maestro unterstützt das automatisierte Testen von Android Views und Jetpack Compose, iOS UIKit und SwiftUI, React Native, Flutter und WebViews.

Aus der Erfahrung mit anderen vergleichbaren Frameworks möchte Maestro Simplizität, Stabilität, hohen Leistungsumfang und Effektivität unter einen Hut bringen. Das erste Release wurde von den US-amerikanischen Entwicklern mobile.dev im Juli 2022 veröffentlicht. Seitdem werden aktuell wöchentlich neue Features und Fixes bereitgestellt.

Testautomatisierung mit Maestro | Software testing

Die Testanweisungen werden in einer einfachen YAML-Syntax verfasst, wobei sich die Schreibweise zwischen den verschiedenen Plattformen nicht unterscheidet.

Voraussetzung für die Verwendung von Maestro ist eine JVM (Java Virtual Machine), die entweder auf Windows, MacOS oder einer Linux Distribution installiert ist. Zur Kommunikation mit Android-Emulatoren verwendet Maestro ein eigens entwickeltes dadb, welches ohne Umweg über den ADB-Server eine Direktverbindung herstellen kann. Bei Echtgeräten wird weiterhin das reguläre ADB genutzt. iOS-Simulatoren lassen sich über Facebooks IDB ansprechen, jedoch werden zurzeit iOS-Echtgeräte leider nicht unterstützt.

Maestro – ein erster Eindruck der Testautomatisierung

Um zu erfahren, inwieweit Maestro seine Versprechen auch halten kann, haben wir eine Reihe von unternehmensinternen Apps automatisiert und das Tool auf Herz und Nieren geprüft. Zunächst werden wir zur Veranschaulichung den Umgang mit Maestro beispielhaft anhand einer Automatisierung der Routenplanung zwischen den beiden adesso Standorten Berlin und Dortmund in der Google Maps App zeigen. Im Anschluss werden weitere Findings im Rahmen der Analyse behandelt.

So einfach ist das Setup von Maestro

Der Aufwand zum Aufsetzen einer testfähigen Umgebung ist beeindruckend gering. Es ist keine spezielle Konfiguration notwendig, damit der Test gestartet werden kann.

curl –Ls „https://get.maestro.mobile.dev“ | bash

Dieser Befehl wird in der Kommandozeile ausgeführt. Dann stehen die Maestro Binaries bereits zur Verfügung. In der Regel setzt Maestro seine Umgebungsvariable selbst. Falls nicht, muss diese manuell gesetzt werden:

export PATH=“$PATH“:“$HOME/.maestro/bin“

Tests schreiben

In einer YAML-Datei wird das Testskript, sogenannte Flows, verfasst. Die Syntax ist lesbar und simpel gestaltet, sodass bereits nach kurzer Einarbeitungszeit die ersten Flows geschrieben werden konnten. Dabei spielt es keine Rolle, für welche mobile Plattform die Automation geschrieben wird. Ein Flow besteht aus zwei Teilen: der obere Teil definiert den Paketnamen der App und die zu verwendenden Umgebungsvariablen, anschließend beginnen die Testanweisungen – sogenannte Steps. Maestro verwaltet die impliziten Wartezeiten zwischen den Anweisungen selbst, sodass in der Regel lediglich die Testschritte angegeben werden müssen. Dadurch wird die die Lesbarkeit der Tests immens erhöht.

[js]appId: com.google.android.apps.maps #Paketname von Google Maps
env: #Hier können Variablen definiert werden, die im Test verwendet werden können
TARGET: „Adesso Dortmund“

START: „Adesso Berlin“
— #Nach den Bindesstrichen beginnen die Testanweisungen
– launchApp: #Öffnet die oben definierte App
clearState: true #Löscht die Daten der App vor dem Start
– tapOn: „Search here“
– inputText: ${TARGET} #Einsetzen der Variable TARGET (Adesso Dortmund)
– tapOn:
text: „Adesso SE“
index: 0
– tapOn: „Directions“
– tapOn:
id: „com.google.android.apps.maps:id/directions_startpoint_textbox“
– inputText: ${START} #Einsetzen der Variable START (Adesso Berlin)
– tapOn: „Adesso SE“[/js]

Für die Umsetzung von Interaktionen mit der UI unterstützt Maestro als Testautomations-Tool verschiedene Befehle, die in anderen Frameworks händisch implementiert werden. So reicht es dann, das Keyword (Interaktion) und einen Parameter in der yaml-Datei zu übergeben. Maestro unterstützt eine Vielzahl von Befehlen, wie die nachfolgende Liste zeigt:

Befehl

Beschreibung

tapOn Tippt auf UI-Element mit spezifizierter ID, Text oder Koordinate
assertVisible Prüft, ob ein UI-Element sichtbar ist
assertInvisible Prüft, ob ein UI-Element nicht sichtbar ist
copyTextFrom Kopiert den Text von einem UI-Element
pasteText Fügt einen kopierten Text ein
scroll Scrollt vertikal nach unten
swipe Führt einen Swipe durch. Mit start und end kann die Anweisung konkretisiert werden.  Mit direction wird eine Richtung angegeben. Hierbei startet der Swipe von der Mitte aus.
textInput Eingabe eines gegebenen Textes
eraseText Löscht Text aus einem Textfeld
hideKeyboard Blendet die Softwaretastatur aus
pressKey Ermöglicht das Drücken von speziellen Tasten, wie: home, lock, volume up, volume down
takeScreenshot Führt eine Bildschirmaufnahme durch
openLink Öffnet einen Link, z.B. Deeplink
launchApp Startet die App
stopApp Beendet die App
runFlow Führt einen Flow aus einer externen YAML-Datei aus
extendedWaitUntil Wartet explizit auf ein bestimmtes Element
waitForAnimationToEnd Wartet darauf, dass eine Animation oder ein Video statisch wird
repeat Führt eine Anweisung mehrmals aus

Die YAML-Dateien werden anschließend über die Kommandozeile ausgeführt. Hierbei kann auch eine ganze Testsuite ausgeführt werden, indem alle Flows in einem Ordner gesammelt werden. Verschiedene weitere Optionen ermöglichen beispielsweise die Ausführung auf einem bestimmten Testgerät, die Bildschirmaufnahme eines Tests oder das Exportieren des Testergebnisses als JUnit XML.

[js]maestro test flow.yaml #Startet den Test für die flow.yaml Datei
maestro test testSuite/ #Startet alle Flows innerhalb des Ordners testSuite
maestro –device emulator-5554 test flow.yaml #Startet den Test auf einem bestimmten Android Emulator[/js]

Maestro Studio – ein persönlicher Assistent für die Testautomatisierung

Um die UI-Elemente einer App zu identifizieren, bietet Maestro eine Browser-Applikation an, welche die laufende App spiegelt und deren Inhalte anzeigt. Zur Interaktion mit den UI-Elementen werden wie auch in anderen Ansätzen der Testautomatisierung sogenannte Lokatoren benötigt, die z.B. in Form einer ID oder eines Textes vorzufinden sind.

maestro studio #Startet die Inspector-App im Standard-Browser

Mit einem Rechtsklick auf ein bestimmtes UI-Element werden ID und Text des Elementes angezeigt, falls diese vorhanden sind. Ebenfalls werden Code-Vorschläge bereitgestellt. Diese zeigen, wie damit interagiert werden kann.

Testautomatisierung mit Maestro | Inspects Elements

Mit einem Linksklick kann direkt mit der UI interagiert werden. Die Aktion wird anschließend als Step einem Flow automatisch hinzugefügt und gleich ausgeführt, sodass die erfolgreiche Durchführung des Steps auch direkt überprüft werden kann. Dies beschleunigt das Schreiben der Testanweisungen, weil Lokatoren nicht mehr händisch kopiert und in den Testcode eingebunden werden müssen.

Besitzen die Elemente keine Lokatoren, muss alternativ mit absoluten Koordinaten gearbeitet werden (Y: 0-100%, X: 0-100%). Als Hilfestellung kann per Tastenkombination ein Fadenkreuz aktiviert werden. Wird nun auf die gewünschte Stelle geklickt, registriert Maestro Studio die Koordinaten von allein. In der unteren Leiste werden auch die aktuellen Koordinaten angegeben.

Testautomatisierung mit Maestro | Maestro Studio

Nach Auswahl aller benötigten Steps kann abschließend der gesamte Flow bequem als YAML-Datei exportiert und anschließend in das eigene Maestro Projekt eingecheckt werden.

Einschränkungen bei der Arbeit mit Maestro

Maestro verfolgt bei automatisierten Tests die Philosophie, dass das Verhalten eines echten Nutzers nachgebildet werden soll. Dies führt jedoch zu Einschränkungen im Funktionsumfang. Es können beispielsweise nicht alle Eigenschaften von Elementen ausgewertet werden. Wird geprüft, ob ein Button inaktiv ist, können die Eigenschaften clickable oder focused nicht von Maestro überprüft werden, weil davon ausgegangen wird, dass ein Nutzer erst weiß, ob eine Eigenschaft vorliegt, nachdem eine Interaktion, in diesem Falle der Klick, vorgenommen wurde.

Wie bereits erwähnt, können zurzeit noch keine physischen iOS-Geräte angesprochen werden. Dies soll nach aktueller Planung des Entwicklungsteams jedoch ab Q2/2023 möglich sein. Für die Kommunikation wird aktuell während der Laufzeit ein Treiber auf die Endgeräte installiert. Dies ist durch Apples Sicherheitsfunktionen nur eingeschränkt möglich.

Des Weiteren ist eine Parallelisierung von Testläufen nicht möglich. Maestro orchestriert den Serverstart zur Kommunikation mit den Testgeräten selbst, sodass dieser nicht auf verschiedenen Ports gestartet werden kann.

Für die Interaktion mit den UI-Elementen sind neben IDs und Texten bei anderen Frameworks – wie Appium und Selenium – noch XPath in Verwendung. XPath gilt bei Verwendung anderer Frameworks immer als Ausweichmöglichkeit, wenn keine IDs hinterlegt sind. Durch seine Baumstruktur können zudem sehr komplexe Abfragen vorgenommen werden, die jedoch gleichzeitig überaus anfällig für Änderungen in der Struktur der App sind. Maestro unterstützt XPath von Hause aus nicht. Sollte also weder Text noch ID für ein Element vorliegen, muss bei Maestro zwangsläufig auf Koordinaten ausgewichen werden.

Fazit

Die Testautomatisierung mit Maestro überzeugt mit einer durchdachten Plug-and-Play-Mentalität. Mit wenig Aufwand und in wenigen Minuten ist es möglich die ersten Tests ohne Vorbereitung zu schreiben. Durch verschiedene Einschränkungen gegenüber anderen Frameworks wie Appium (fehlende XPath Unterstützung, keine Abfrage von bestimmten Properties von UI-Elementen, sowie die noch offene Unterstützung für echte iOS-Geräte) ist Maestro jedoch nicht für jedes Projekt geeignet. Für einfache Projekte, die Erstellung von Smoke Tests oder in einem technisch weniger versierte Team scheint es Maestro aber heute schon eine gute Lösung zu sein.

Aufgrund der Stabilität, der Performance und der effizienten Erstellung von automatisierten Tests explizit für mobile Apps wünschen wir uns eine Hybridlösung. Bei dieser könnten zum Beispiel alle einfachen Tests mit Maestro und alle übriggebliebenen (komplexen) Tests mit Appium umgesetzt werden. Die sequenzielle Ausführung der Tests könnte weiterhin über JUnit erfolgen.

Da sich das Projekt noch im Aufbau befindet, erscheint es auch nur eine Frage der Zeit zu sein, bis manche noch fehlende Feature nachgereicht werden. Andere werden aber aufgrund ihrer Philosophie wohl bleiben.

Uns hat Maestro als Testautomatisierungs-Tool überzeugt. Die beschriebenen Einschränkungen sehen wir auch als Chance noch mal an diejenigen zu appellieren, deren Testprozess noch nicht das Fordern von passenden IDs bei der Implementierung in der Definition of Done vorsieht. Denn instabile Lokatoren können instabile Tests und einen erhöhten Wartungsaufwand verursachen.

Mehr zu unseren Leistungen

×
Telefon

Sie sind auf der Suche nach einem Experten im Bereich App-Entwicklung? Wir freuen uns auf Ihre Nachricht!

+49 231 99953850
×