„Es nützt nichts! Ich kann mit den Integrationstests von Flutter keinen End-to-End-Test durchführen“, rief einer unserer Kunden vor etwa 9 Monaten aus. Ich fragte, was das Problem sei, und sie erklärten, dass sie für die Anmeldung die Google-Authentifizierung und das Paket verwendeten, es aber nicht möglich sei, die Integrationstests von Flutter für die Interaktion mit den Anmeldebildschirmen zu verwenden. Ich verstand immer noch nicht ganz, wo das Problem lag, und dann machte es Klick: Dieses Plugin verwendet , mit denen die Integrationstests nicht funktionieren. google_sign_in native UI-Komponenten Ich war ziemlich enttäuscht, dass ich damals keine Lösung anbieten konnte und musste es dabei belassen. Spulen wir jedoch bis heute vor, stellt sich eine fantastische neue Lösung namens vor . Ich werde Ihnen alles darüber erzählen, aber bevor wir uns darauf einlassen, wollen wir noch einmal zusammenfassen, warum es wichtig ist, Tests durchzuführen, welche Tools Ihnen bisher zur Verfügung standen, und dann darüber sprechen, wie Sie mit Patrol beginnen können. „Patrol“ LeanCode Warum überhaupt Flutter-Apps testen? Einer der Hauptgründe, warum Entwicklungsteams (CI)-Dienste nutzen besteht darin, sofortiges Feedback zu dem Code zu erhalten, den sie in ihr Repo übernehmen. Tests können als Teil Ihrer Pipeline automatisch ausgeführt werden, um ein hohes Maß an Qualität und Stabilität sicherzustellen, da Fehler oder Probleme frühzeitig erkannt und sofort behoben werden können. Wir ermutigen Kunden stets, beim Einrichten ihrer Arbeitsabläufe Tests zu implementieren, aber es ist nicht ungewöhnlich, dass wir hören: „Wir haben keine Zeit, Tests zu schreiben.“ Hoffentlich sitzen Sie nicht in diesem Boot und nutzen Tests als Teil Ihres App-Entwicklungszyklus, um qualitativ hochwertige und fehlerfreie Apps zu liefern! Continuous Integration Codemagie Was sind die wichtigsten automatisierten Methoden zum Testen von Flutter-Apps? Es gibt vier Haupttestmethoden, die im Rahmen Ihres CI-Workflows automatisiert werden können. Da das Testen ein Thema für sich ist, fasse ich es kurz, aber die Verwendung einer Kombination dieser Testmethoden wird Ihnen helfen, die Qualität Ihrer App zu verbessern und Probleme eher früher als später zu erkennen. Erstens gibt es , die üblicherweise zum isolierten Testen Ihrer Funktionen und Methoden verwendet werden, um sicherzustellen, dass sie wie erwartet funktionieren. Es können auch Unit-Tests geschrieben werden, um sicherzustellen, dass Ihre Geschäftslogik in verschiedenen Szenarien ohne unerwartete Ergebnisse funktioniert. „Unit-Tests“ Als nächstes haben wir Flutter- , mit denen Sie Ihre UI-Komponenten testen und sicherstellen können, dass sie korrekt gerendert werden und wie erwartet funktionieren. „Widget-Tests“ Dann gibt es noch , bei dem Sie testen, ob die Einheiten und Komponenten Ihrer Anwendung wie erwartet zusammenarbeiten. den „Integrationstest“ Schließlich gibt es noch bei dem Sie die Anwendung so testen, als ob sie von einem echten Benutzer verwendet würde. In einem CI-Workflow wird dies normalerweise mithilfe von Simulatoren oder Emulatoren automatisiert, um verschiedene Pfade durch Ihre App zu testen und sicherzustellen, dass nach Änderungen an Ihrem Code keine Probleme auftreten. den „End-to-End-UI-Test“, Hier steckte der Kunde, von dem ich eingangs sprach, fest, weil er seine End-to-End-UI-Tests nicht durchführen konnte, weil es nicht möglich war, sich bei der App anzumelden. Damals testeten sie eine „Dev“-Version, die den Anmeldeteil umging. Dies ist jedoch nicht mehr erforderlich, da verfügbar ist! „Patrol“ Treten Sie ein, Bühne links, Patrouille! Also zunächst einmal: Was ist Patrol? Nun, ich denke, die Dokumente sagen es am besten: Patrol ist ein neues Open-Source-UI-Testframework für Flutter, das von LeanCode entwickelt wurde. Es baut auf den vorhandenen Testtools von Flutter auf und ermöglicht es Ihnen, Dinge zu tun, die zuvor unmöglich waren. Mit Patrol können Sie auf native Funktionen der Plattform zugreifen, auf der die Flutter-App ausgeführt wird. Das Wichtigste dabei ist, dass Sie damit auf die der Plattform zugreifen können, auf der Ihre App ausgeführt wird. nativen Funktionen Flutter- Das bedeutet, dass Sie jetzt Dinge tun können wie: Interagieren Sie mit Dialogfeldern für Berechtigungsanfragen, um Anfragen abzulehnen oder anzunehmen. Interagieren Sie mit WebViews. Minimieren und maximieren Sie Ihre App. Interagieren Sie mit Authentifizierungsflüssen wie der Google- oder Apple-Authentifizierung. Interagieren Sie mit anderen nativen Funktionen wie dem Öffnen der Benachrichtigungsleiste, dem Drücken der Home-Taste, dem Ein- oder Ausschalten der WLAN-Konnektivität oder dem Wechseln des Geräts in den Dunkelmodus usw. Okay, das klingt großartig, aber wo ist der Haken? Nun, es gibt keinen! Und außerdem ist es nicht nur , sondern auch ! kostenlos Open Source Darüber hinaus führt Patrol auch ein, die Ihnen eine präzisere Syntax zum Schreiben Ihrer Tests bieten. Sie können mehr darüber lesen . „benutzerdefinierte Finder“ Hier Patrol installieren und einrichten Um mit Patrol zu beginnen, müssen Sie die CLI installieren, die zu Ihrer hinzufügen und einige Konfigurationen in Ihren iOS- und Android-Projekten einrichten. Patrol-Abhängigkeit pubspec.yaml hat einige großartige Dokumentationen erstellt Hier finden Sie eine Anleitung für jede Plattform, die Sie durch den Prozess führt. Ihre Schritt-für-Schritt-Anleitung führt Sie durch die Einrichtung für und . LeanCode Hier iOS Android Wenn Sie auf Probleme stoßen, erhalten Sie am besten Hilfe auf dem Server, dem Sie beitreten können . Patrol Community Discord- Hier Wenn Sie Fehler finden, können Sie ein Problem melden . Hier Patrol installieren und einrichten Um mit Patrol zu beginnen, müssen Sie die CLI installieren, die zu Ihrer hinzufügen und einige Konfigurationen in Ihren iOS- und Android-Projekten einrichten. Patrol-Abhängigkeit pubspec.yaml hat einige großartige Dokumentationen erstellt Hier finden Sie eine Anleitung für jede Plattform, die Sie durch den Prozess führt. Ihre Schritt-für-Schritt-Anleitung führt Sie durch die Einrichtung für und . LeanCode Hier iOS Android Wenn Sie auf Probleme stoßen, erhalten Sie am besten Hilfe auf dem Server, dem Sie beitreten können . Patrol Community Discord- Hier Wenn Sie Fehler finden, können Sie ein Problem melden . Hier Native Funktionstests mit Patrol schreiben Nachdem Sie alles eingerichtet haben, beginnen wir mit dem Testen einiger nativer Funktionen. Um es selbst auszuprobieren, habe ich eine einfache Flutter-App mit einer erhöhten Schaltfläche eingerichtet, die beim Klicken einen Warndialog öffnet. nativen Durch Klicken auf „OK“ oder „Abbrechen“ wird der Dialog einfach geschlossen. Auch hier würde ich empfehlen, die eigene Dokumentation von Patrol zu verwenden, die Sie finden können um Ihre erste Testdatei hinzuzufügen. Hier Für meinen Test wollte ich also auf die erhöhte Schaltfläche mit dem Text „Klick mich!“ klicken. Es handelt sich um ein Standard-Flutter-Widget, sodass es mit dem folgenden Patrol-Finder angetippt werden kann: await $('Click me!').tap(); Anschließend sollte der native Dialog angezeigt werden, sodass wir nun mit der Interaktion mit einer nativen UI-Komponente beginnen können. Fügen wir also den nativen Finder hinzu, der es uns ermöglicht, auf die Schaltfläche „OK“ zu tippen: await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); Das war einfach! Ich möchte auch den „Abbrechen“-Button testen, also lasst uns auf den „Klick mich!“-Button tippen. Klicken Sie erneut auf die Schaltfläche und tippen Sie dann auf die Schaltfläche „Abbrechen“ des nativen Dialogs, indem Sie wie folgt ein paar weitere Zeilen hinzufügen: await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); Ihre fertige Testdatei sollte so aussehen: import 'package:cmpatrol/main.dart'; import 'package:patrol/patrol.dart'; void main() { patrolTest( 'Native tests', nativeAutomation: true, ($) async { await $.pumpWidgetAndSettle(const MyApp()); await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'NO')); }, ); } Sie sollten diesen Test nun auf Ihrem Emulator oder einem echten Gerät ausführen können, indem Sie den Befehl zum Starten des Tests verwenden. Meine Integrationstestdatei hieß , also habe ich die Tests wie folgt vom Terminal aus gestartet: „button_test“ patrol test -t integration_test/button_test.dart Ob Ihre Tests erfolgreich sind oder nicht, sehen Sie direkt im Terminal. Wenn die Tests fehlschlagen, erhalten Sie einen Link zum vollständigen Testbericht. Alternativ: Wenn Sie Ihre Tests wie ich auf Android ausführen, können Sie auf den Bericht zugreifen, indem Sie im folgenden Verzeichnis auf klicken: index.html ./build/app/reports/androidTest/connected Sie können weiter mit anderen nativen Funktionen experimentieren, z. B. dem Öffnen der Benachrichtigungsleiste, dem Deaktivieren des WLANs, dem Aktivieren des Dunkelmodus sowie dem Minimieren und Maximieren der App: // minimize app await $.native.pressHome(); await $.native.openNotifications(); await $.native.disableWifi(); await $.native.enableDarkMode(); // maximize app await $.native.openApp(); ⚠️ Beachten Sie, dass es nicht möglich ist, Ihre App vollständig zu schließen und dann erneut zu öffnen, da sonst der gesamte Test beendet und somit fehlgeschlagen würde. Konsultieren Sie die Patrouille für weitere Beispiele. Dokumentation Verwenden Sie Patrol in Ihren Codemagic-Workflows Um Patrol in Ihre Arbeitsabläufe zu integrieren, müssen Sie zunächst die auf der Build-Maschine installieren. Dies dauert nur wenige Sekunden und sobald dies erledigt ist, können Sie Ihr Testskript ausführen. Nachfolgend finden Sie ein Beispiel dafür, wie Sie diese Schritte zum Abschnitt „scripts“ Ihrer Konfigurationsdatei hinzufügen würden. Ich würde empfehlen, das Skript zur Installation der Patrol-CLI als einen der ersten Skriptschritte auszuführen. Anschließend können Sie Ihre Patrol-Tests entweder unmittelbar danach oder nach anderen Tests ausführen, die Sie möglicherweise auch vorher ausführen möchten. Patrol-CLI codemagic.yaml- Bevor Sie Ihre Patrol-Tests ausführen, müssen Sie den Emulator starten. Daher fügen wir ein Skript hinzu, um den Emulator zu starten und darauf zu warten, dass er vollständig gestartet ist. Beachten Sie, dass die Android-Emulatoren nicht auf Maschinen verfügbar sind, die Apple Silicon M1- oder M2-Maschinen verwenden, da das Apple Virtualization Framework keine verschachtelte Virtualisierung unterstützt. Daher würde ich beim Testen von Android-Apps die Verwendung einer Instanz empfehlen. Linux- Der Skriptabschnitt Ihrer sollte etwa so aussehen: codemagic.yaml scripts: ... - name: Install Patrol CLI script: dart pub global activate patrol_cli - name: Launch Android emulator script: | cd $ANDROID_HOME/tools emulator -avd emulator & adb wait-for-device - name: Run tests with Patrol script: patrol test -t integration_test/your_test.dart ignore_failure: true ... Die Ergebnisse des Patrol-Tests werden in den Codemagic-Build-Protokollen angezeigt Die Patrol-Testergebnisse sind auch im Format verfügbar, was bedeutet, dass sie in den Build-Protokollen auf dem Codemagic-Build-Übersichtsbildschirm angezeigt werden können. Sie müssen lediglich die Eigenschaft im Pfad zur generierten JUnit-XML-Datei hinzufügen. Sie können die Eigenschaft mit einem booleschen Wert verwenden, um zu steuern, ob der Rest des Workflows weiter ausgeführt werden soll oder nicht. Wenn Sie Ihre Ergebnisse wie im nächsten Abschnitt beschrieben in ein Testmanagementsystem hochladen möchten, sollten Sie dies auf setzen. JUnit-XML- test_report „ignore_failure“ true Hier ist ein Beispiel dafür, wie Ihr Skript aussehen sollte: scripts: ... - name: Run tests with Patrol script: | patrol test -t integration_test/your_test.dart test_report: build/app/outputs/androidTest-results/connected/*.xml ignore_failure: true ... Ein fehlgeschlagener Test könnte etwa so aussehen: Sammeln des Patrol-Testberichts als Build-Artefakt Möglicherweise möchten Sie außerdem die Ausgabe des Testberichts als Build-Artefakt sammeln, damit Sie den vollständigen Bericht anzeigen können, falls Fehler auftreten. Dadurch steht der Bericht als ZIP-Datei auf dem Build-Übersichtsbildschirm im Abschnitt „Artefakte“ auf der linken Seite zum Download zur Verfügung. Der einfachste Weg, dies zu tun, besteht darin, das Verzeichnis, in dem sich die Berichtsdateien befinden, in das Verzeichnis zu kopieren, das Codemagic zum Exportieren von Artefakten verwendet. Es gibt eine integrierte Umgebungsvariable namens , die auf dieses Verzeichnis verweist, das Sie in Ihrem Skript verwenden können. $CM_EXPORT_DIR Das Skript dafür sollte wie folgt aussehen: scripts: ... - name: Export Patrol test report script: | cp -r build/app/reports/androidTests/connected $CM_EXPORT_DIR/report ... Abschluss hat endlich das Problem der Durchführung von UI- und Integrationstests mit nativen Funktionen überwunden. Es ist jetzt möglich, native Funktionen zu testen und mit Authentifizierungsabläufen und nativen Dialogen zu interagieren und sogar native Funktionen wie WLAN, Mobilfunk und Dunkelmodus umzuschalten und sogar Ihre App zu minimieren und zu maximieren. Darüber hinaus ist es sowohl als auch und bietet eine Lösung für ein echtes Problem, das seit der Einführung von Flutter besteht. Darüber hinaus lässt es sich ganz einfach hinzufügen und in Ihren Codemagic-Workflows verwenden. Wenn Sie die großartige Arbeit von LeanCode unterstützen möchten, geben Sie Patrol ein „Gefällt mir“ auf pub.dev und geben Sie dem Patrol GitHub-Repository einen Stern . Patrol kostenlos Open Source Hier Hier Dieser Artikel wurde von Kevin Suhajda, Head of Solutions Engineering bei, verfasst . Sie finden Kevin auf , , Und . Codemagie X GitHub LinkedIn Auch veröffentlicht. hier