E2E-Tests: A Tutorial and Architectural Guide
End-to-End-Tests (E2E) helfen bei der Validierung der wichtigsten Abläufe in Ihrer Anwendung, z. B. bei Benutzeranmeldungen. Bei der Front-End-Entwicklung helfen E2E-Tests bei der Überprüfung, ob die richtige Benutzeroberfläche dargestellt wurde. Bei der Back-End-Entwicklung helfen E2E-Tests zu überprüfen, ob ein wichtiger Ablauf in Ihren Back-End-Diensten die erwartete Ausgabe liefert.
In diesem Beitrag werden Sie in das E2E-Testen eingeführt und erhalten umsetzbare Tipps. Außerdem wird erklärt, wie man wiederverwendbare Tests schreibt, damit sie leichter für die Erstellung von E2E-Tests verwendet werden können. Wie Sie vielleicht wissen, sind E2E-Tests oft eine große Frustration für Entwickler, da sie einen hohen Aufwand beim Schreiben, Ausführen und Warten erfordern.
Zunächst wollen wir uns ansehen, wo E2E-Tests in der Softwaretestpyramide angesiedelt sind.
Platz der E2E-Tests in der Testpyramide
Bei der Betrachtung der Testpyramide finden wir vier Haupttypen von Tests, die uns dabei helfen, die Qualität des Codes zu gewährleisten:
- E2E-Tests helfen dabei, hochwertige Pfade in Ihrer Anwendung zu verifizieren. Mit anderen Worten, sie helfen bei der Überprüfung von Benutzergeschichten, da diese oft Abläufe in Ihrer Anwendung darstellen.
- Integrationstests helfen bei der Überprüfung der Integration mehrerer Funktionen oder Komponenten. Integrationstests zeigen Ihnen, ob Ihr Code mit anderen Funktionen zusammenarbeitet.
- Unit-Tests helfen bei der Überprüfung der Geschäftslogik von Funktionen. Unit-Tests sind die grundlegendste Form des Testens und stellen sicher, dass die Geschäftslogik korrekt ist.
- Zu guter Letzt dürfen wir die statische Analyse oder statische Tests nicht vergessen. Statische Tests helfen dabei, Tipp- oder Typfehler zu finden.
Nach dieser Pyramide sollten die meisten Tests Unit-Tests sein, mit weniger Integrationstests und noch weniger E2E-Tests. Dennoch ist es wichtig, die Abläufe in Ihrer Anwendung zu überprüfen. E2E-Tests sind schwer zu pflegen und erfordern einen hohen Aufwand. Überprüfen Sie daher nur die wichtigsten Abläufe mit E2E-Tests. Andere Testarten wie Integrations- und Unit-Tests sollten Ihnen bereits genügend Vertrauen in Ihre Codebasis geben.
Unterschiedliche E2E-Teststrategien
Lassen Sie mich Ihnen sagen, dass verschiedene Strategien existieren. Wir können zwischen horizontalen E2E-Tests und vertikalen E2E-Tests wählen. Beide Strategien sind es wert, erforscht zu werden, da sie es Ihnen ermöglichen, verschiedene Szenarien zu testen. Erfahren Sie, was die einzelnen Strategien bewirken.
Strategie Nr. 1: Vertikale End-to-End-Tests
Diese Strategie konzentriert sich auf das Testen aller Schichten der Testpyramide. Sie umfasst Unit-Tests, Integrationstests und UI-Tests. Ihr Ziel ist es, eine Komponente auf einer granularen Ebene mit Unit-Tests zu testen, zu testen, wie sich eine Komponente bei der Interaktion mit anderen Komponenten mit Hilfe von Integrationstests verhält, und schließlich das Verhalten der Komponente zu überprüfen, wenn Benutzer über die Benutzeroberfläche interagieren.
In der Regel möchten Sie eine kontinuierliche Integrationspipeline verwenden, um diese Tests bei jedem Code-Commit oder Pull-Request zu automatisieren.
Strategie Nr. 2: Horizontale End-to-End-Tests
Horizontale E2E-Tests konzentrieren sich auf die Verifizierung eines vollständigen Benutzerflusses. Hier ist ein Beispielfluss für einen Webshop:
- Produktseite öffnen
- Produktgröße auswählen
- Produkt in den Warenkorb legen
- Zur Kasse gehen
- Adress- und Zahlungsinformationen ausfüllen
- Zahlung abschließen
- Einkaufsbestätigungsbildschirm anzeigen
Hier wollen wir jede Transaktion des Benutzerflusses überprüfen. Häufig wird bei dieser Art von Tests die Interaktion zwischen verschiedenen Anwendungen überprüft und Zustandsänderungen für diese Anwendungen verifiziert.
Beachten Sie, dass diese Art von Tests teuer zu schreiben sind. Die Definition der Benutzerabläufe und das Schreiben dieser Tests nimmt viel Zeit in Anspruch. Versuchen Sie daher, sich auf kritische Transaktionspfade für Ihre Anwendung zu konzentrieren.
Stellen Sie jedoch sicher, dass Sie diese kritischen Benutzerflüsse für verschiedene Bedingungen testen. Diese Strategie ermöglicht es Ihnen, ein vollständiges Bild der Robustheit des Benutzerflusses zu erhalten. Zu diesen Bedingungen gehören:
- Komplexe Zeitszenarien: Ein Konzertticket ist zum Beispiel nur 15 Minuten lang verfügbar.
- Unterschiedliche Dateneingaben oder fehlende Daten.
- Unterbrechungen des Ablaufs: Ein Benutzer beschließt, die Kassenseite zu verlassen, um eine andere Produktseite aufzurufen. Wir müssen zum Beispiel überprüfen, ob die Komponente den Checkout-Status speichert.
Als Nächstes erfahren wir, wann E2E-Tests geschrieben werden sollten.
Wann sollten E2E-Tests geschrieben werden
Sie wissen vielleicht nicht, dass E2E-Tests teure Tests sind, die in Ihrer kontinuierlichen Integrationspipeline ausgeführt werden. Sie erfordern oft eine umfangreiche Vorbereitung, z. B. die Erstellung einer Datenbank, die die Produktionsdaten nachahmt. Außerdem stellen sie manchmal zeitaufwändige Abläufe in Ihrer Anwendung dar. Daher können sie langsam sein und mehr Ressourcen für ihre Ausführung benötigen.
Verwenden Sie E2E-Tests, um die wichtigsten Abläufe in Ihrer Anwendung zu überprüfen. Beispiele für hochwertige Abläufe sind:
- An- und Abmeldung
- Registrieren eines neuen Benutzers
- Artikel in den Warenkorb legen
- Passwort ändern
- Alle anderen wichtigen Abläufe im Zusammenhang mit Ihrem Dienst
Vergessen Sie jedoch nicht, die von Ihnen geschriebene Geschäftslogik mit Unit- und Integrationstests zu überprüfen. Die Kombination aus Unit- und Integrationstests sollte Ihnen ein hohes Maß an Vertrauen in die Qualität Ihres Codes geben. E2E-Tests helfen Ihnen, dieses Vertrauen für kritische Pfade zu erhöhen.
Hier sind einige umsetzbare Tipps für das Schreiben von E2E-Tests.
Tipps für das Schreiben von E2E-Tests
Focus on Writing Reusable Tests
Der erste und wichtigste Tipp ist, kleine, unabhängige, wiederverwendbare Tests und Komponenten zu schreiben. So können Sie mehrere kleine Komponenten aneinanderreihen, um komplette End-to-End-Benutzerabläufe einfacher zu erstellen. Anstatt viele benutzerdefinierte Komponenten zu schreiben, die nur von E2E-Tests verwendet werden, sollten Sie sich auf das Schreiben wiederverwendbarer Komponenten konzentrieren.
Das Schreiben kleiner, unabhängiger Komponenten hilft bei der Wiederverwendung von Code und reduziert die Zeit für die Fehlersuche. Außerdem ist es einfacher, kleine Komponenten zu aktualisieren, wenn sich die Funktionalität oder die Benutzerabläufe ändern.
Betrachten Sie immer den Grund für das Schreiben eines E2E-Tests
Wenn Sie einen bestimmten Ablauf mit einem E2E-Test abdecken wollen, überlegen Sie, ob es sich lohnt, ihn abzudecken. Testen Sie nur hochwertige Benutzerabläufe mit E2E-Tests. Sie sollten zum Beispiel nicht testen, ob eine Fehlermeldung angezeigt wird, wenn ein Benutzer eine falsche E-Mail-Adresse eingibt. Dies ist ein viel zu einfacher Anwendungsfall, der sich nicht für einen E2E-Test eignet. Diese Anforderung kann einfach mit einem Unit-Test getestet werden.
Andererseits lohnt es sich zu testen, ob die Anmeldeseite den Benutzer nach erfolgreicher Anmeldung auf die richtige Anwendungsseite weiterleitet. Dies ist ein wertvoller Fluss für Ihre Benutzer, um die Anwendung nutzen zu können. Kurz gesagt, denken Sie immer an den Grund für das Schreiben eines E2E-Tests.
E2E-Tests sollten nicht von Implementierungsdetails abhängen
Sie wollen E2E-Tests nicht jedes Mal aktualisieren, wenn Sie Implementierungsdetails für einen bestimmten Ablauf ändern. Daher sollten Sie Komponenten schreiben, die es Ihnen ermöglichen, Implementierungsdetails zu abstrahieren. E2E-Tests sind viel einfacher zu warten und machen mehr Spaß, wenn Implementierungsdetails in Komponenten versteckt sind. Kurz gesagt, E2E-Tests sollten unabhängig von Implementierungsdetails sein.
Als nächstes wollen wir uns die Fallstricke von E2E-Tests ansehen.
Fallstricke von E2E-Tests
Hier ist eine Liste von häufigen Fallstricken im Zusammenhang mit E2E-Tests:
- E2E-Tests sollten nicht versuchen, so viel wie möglich auf einmal zu testen. Oft schreiben Entwickler riesige E2E-Tests, die jeden Aspekt des Benutzerflusses überprüfen. Halten Sie die Dinge einfach und überprüfen Sie nur die wichtigsten Aspekte des Benutzerflusses. Bei einem Anmeldevorgang müssen Sie zum Beispiel nur überprüfen, ob der Benutzer zur Anwendungsseite weitergeleitet wurde. Dies erleichtert den Entwicklern die Wartung und Aktualisierung von E2E-Tests.
- Wenn ein E2E-Test fehlschlägt, kann es schwierig sein, die genaue Ursache für den Fehler zu finden. Sie können jedoch den Debugging-Aufwand reduzieren, indem Sie Ihre Geschäftslogik mit Unit- und Integrationstests abdecken. Einige Tools bieten auch eine gute Ursachenanalyse mit Screenshots und Konsolenprotokollen von fehlgeschlagenen Testschritten, was den Zeitaufwand für die Fehlersuche verringern kann.
- E2E-Tests benötigen einen beträchtlichen Teil der Zeit in Ihrer Continuous Integration (CI) Pipeline. Sie können Ihre CI-Pipeline blockieren, was die gesamte Entwicklung verlangsamt. Das bedeutet, dass Sie möglicherweise in Ihre CI-Pipeline investieren müssen, um ein paar weitere Pipelines für die Ausführung von Tests zu haben.
- E2E-Tests sind ein kontinuierlicher Aufwand. Jedes Mal, wenn neue Funktionen hinzugefügt oder alte Funktionen geändert werden, müssen Sie wahrscheinlich Ihre E2E-Tests aktualisieren. Wir können diesen Aufwand jedoch reduzieren, indem wir wiederverwendbare Komponenten schreiben, die Implementierungsdetails abstrahieren. Darüber hinaus verwenden einige Tools KI, um die Tests anzupassen, wenn sich der Code ändert, wodurch die Testwartung reduziert wird.
Werfen wir nun einen kurzen Blick auf die Unterschiede zwischen Systemtests und E2E-Tests.
Systemtests vs. E2E-Tests – Was ist der Unterschied?
Was ist also der Unterschied zwischen Systemtests und E2E-Tests? Systemtests konzentrieren sich auf die Validierung sowohl der funktionalen als auch der nicht-funktionalen Anforderungen. Oft wird es von einem externen Team durchgeführt, das die Anwendung als Blackbox behandelt. Mit anderen Worten, sie wissen nichts über die Funktionsweise der Anwendung außer den Anforderungen, die sie erfüllen sollte.
Diese Form des Testens wird jedoch oft mit E2E-Tests verwechselt, da Systemtests eine Form von E2E-Tests sind. Allerdings wird beim Systemtest viel mehr geprüft als beim E2E-Test. Systemtests messen zum Beispiel Skalierbarkeit, Leistung oder Zuverlässigkeit. E2E-Tests hingegen konzentrieren sich auf die korrekte Ausführung von Benutzerabläufen.
Zum Schluss fassen wir die Erkenntnisse aus diesem Artikel zusammen.
Schlussfolgerung zu E2E
End-to-End-Tests sind sehr leistungsfähig, da sie bei der Validierung hochwertiger Benutzerabläufe oder User Stories helfen. Sie helfen, die Qualität Ihrer Anwendung zu gewährleisten.
Das Schreiben und Pflegen von E2E-Tests kann jedoch viel Zeit und Aufwand erfordern. Es ist möglich, diesen Aufwand zu reduzieren, indem man kleine, wiederverwendbare Komponenten schreibt, die Implementierungsdetails abstrahieren. Einige Tools helfen auch bei der Erstellung belastbarerer Tests, indem sie KI oder mehrere Attribute zur Identifizierung der einzelnen Elemente verwenden. Daher müssen Sie E2E-Tests nicht jedes Mal aktualisieren, wenn sich Implementierungsdetails für hochwertige Benutzerabläufe ändern. Darüber hinaus ermöglichen wiederverwendbare Komponenten die einfache Erstellung von E2E-Testabläufen.
E2E-Tests sollten die wichtigsten Abläufe Ihrer Anwendung abdecken. Sie testen die Abläufe, denen Ihre Benutzer und Kunden folgen, um einen Nutzen aus Ihrer Anwendung zu ziehen. Wenn sie sich nicht anmelden oder einen Artikel in den Warenkorb legen können, werden sie entweder die Anwendung verlassen (wenn sie es können) oder den Support anrufen, wenn sie gezwungen sind, Ihre Anwendung zu nutzen. Sie möchten zum Beispiel den Anmelde- und Abmeldevorgang abdecken, sind aber weniger daran interessiert, eine Fehlermeldung nach der Eingabe einer falschen E-Mail-Adresse zu überprüfen.
Letztendlich sollte es Spaß machen, E2E-Tests zu schreiben. Sie sollten nicht viel Zeit und Mühe beim Schreiben und Warten erfordern. Halten Sie E2E-Tests einfach und konzentrieren Sie sich auf wiederverwendbare Komponenten, und Sie werden großartige Ergebnisse sehen.
Dieser Beitrag wurde von Michiel Mulders geschrieben. Michiel ist ein leidenschaftlicher Blockchain-Entwickler, der gerne technische Inhalte schreibt. Außerdem lernt er gerne über Marketing, UX-Psychologie und Unternehmertum. Wenn er nicht gerade schreibt, genießt er wahrscheinlich ein belgisches Bier!