Erste Schritte beim Testen
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Beschreiben des Zwecks von Einheitentests und End-to-End-Tests und Erklären des Unterschieds zwischen den beiden Varianten
- Erläutern der Rolle von Einheitentests für Lightning-Webkomponenten
Voraussetzungen
In diesem Modul entwickeln Sie Lightning-Webkomponenten und Einheitentests innerhalb eines Salesforce DX-Projekts und verwenden Visual Studio Code als Editor dazu. Wenn Sie mit Lightning-Webkomponenten, Salesforce DX oder der Verwendung von Visual Studio Code für die Salesforce-Entwicklung nicht vertraut sind, empfehlen wir Ihnen, die folgenden Projekte durchzuarbeiten, bevor Sie fortfahren: Schnelleinstieg: Salesforce DX, Schnelleinstieg: Visual Studio Code für die Salesforce-Entwicklung und Schnelleinstieg: Lightning-Webkomponenten.
Warum Testen wichtig ist
„Any bug not detected in the design phase will cost ten times more time to detect at the coding phase and an additional ten times more at the debugging phase. (Wird ein Fehler in der Entwicklungsphase nicht gefunden, verzehnfachen sich die Kosten für seine Entdeckung in der Codierungsphase und steigen in der Debugging-Phase nochmals um denselben Faktor.)“
– Dr. Nikolai Bezroukov, The Art of Debugging
Debuggen und Testen hängen zwar zusammen, sind in der Softwareentwicklung jedoch separate Prozesse. Beim Testen versucht man, Fehler zu finden und zu protokollieren. Beim Debuggen versucht man, die Ursache dieser Fehler zu finden und zu beheben. Und laut Dr. Nikolai Bezroukov sollte das Finden und Ausmerzen von Fehler im Code besser früher als später erfolgen.
In einer idealen Welt hat Software keine Fehler. Aber die Realität sieht so aus: Wir machen Fehler, Anforderungen werden missverstanden, und Anwendungen werden auf Weisen genutzt, die nie vorgesehen waren. Beim Testen werden diese Probleme offengelegt, damit sie behoben werden können. Je früher Fehler gefunden werden, desto "billiger" sind sie. Sobald die Fehler die nächsten Entwicklungsstufen (oder im schlimmsten Fall die Produktion) erreichen, sind mehr Menschen und Prozesse daran beteiligt, sie zu identifizieren und zu beheben.
Es gibt zwei Arten von Tests, die in der Regel für Salesforce-Anwendungen durchgeführt werden: Einheitentests und End-to-End-Tests. Sie unterscheiden sich in Umfang und Zweck.
Einheitentests
Bei Einheitentests konzentriert man sich auf das Testen kleiner, separater Teile des Funktionsumfangs einer Anwendung. Um Einheitentests zu erleichtern, sollten Sie Ihre Anwendung aus kleinen, testbaren Einheiten erstellen, anstatt eine einzelne lange Apex-Methode oder -Klasse zu schreiben. Dies heißt, der Code sollte aus Modulen mit separaten Methoden bestehen, die unabhängig getestet werden können. Auch hier gilt, anstatt eine einzelne, umfangreiche Lightning-Komponente für eine Anwendung zu schreiben, modularisieren Sie die Funktionen besser in kleineren Komponenten, die unabhängig getestet werden können. Kurze, schnelle und leicht durchführbare Einheitentests ermutigen Entwickler, sie im Rahmen ihres Entwicklungs- und Continuous Integration-Prozesses zu schreiben und durchzuführen. Dies stellt sicher, dass Fehler eher früher als später gefunden und behoben werden. Lesen Sie unbedingt den Artikel Testgetriebene Entwicklung, um mehr Informationen über diesen Prozess zu erhalten.
End-to-End-Tests
Bei End-to-End-Tests liegt der Schwerpunkt auf Tests der gesamten Anwendung bzw. des gesamten Benutzererlebnisses. Bei Webanwendungen beinhaltet dies oft Tests in einem Browser, bei denen geprüft wird, wie der Code und die Komponenten auf einer Seite in einer Testumgebung, wie z. B. einer Sandbox oder einer Testorganisationen, zusammenarbeiten.
End-to-End-Tests dauern in der Regel länger als Einheitentests, da jeder Test einen größeren Teil der Anwendungsfunktionalität umfasst. End-to-End-Tests sind zudem weniger zuverlässig als Einheitentests. Grund dafür sind die zufälligen Schwankungen in einer Live-Umgebung, wie z. B. Netzwerklatenz, Caching, Abhängigkeit von Drittsystemen, Infrastrukturprobleme usw. Diese Unwägbarkeiten können dazu führen, dass ein Test einmal erfolgreich durchgeführt wird und beim nächsten Mal fehlschlägt. Trotz dieser Nachteile bieten End-to-End-Tests eine wertvolle, realistischere Validierung der Anwendung und ihrer Integrationspunkte als Einheitentests.
Einheitentests und End-to-End-Tests im Vergleich
Sehen wir uns an, wie Einheitentests und End-to-End-Tests in der Praxis funktionieren. Als Beispiel verwenden wir die Lightning-Webkomponente api-property aus dem Repository lwc-recipes, einer Sammlung von Codebeispielen für Lightning-Webkomponenten auf der Salesforce-Plattform.
Die Komponente <c-api-property>
besteht aus den Komponenten (1) <lightning-card>
, (2) <lightning-input>
und (3) <c-chart-bar>
.
- Die Komponente
<lightning-card>
zeigt den Titel "ApiProperty" an und enthält die beiden anderen Komponenten. - Die Komponente
<lightning-input>
verarbeitet die Benutzereingabe (ein Zahlenwert) und überträgt Wertänderungsereignisse. - Die Komponente
<c-chart-bar>
rendert ein Balkendiagramm, das auf ihrem Prozentwert basiert.
Jede dieser drei Komponenten hat ihre eigene öffentliche API, ihren eigenen internen Zustand und ihr eigenes Verhalten. Und für jede dieser Komponenten könnte es eigene Einheitentests geben, mit denen ihre Funktionalität von den anderen Komponenten getrennt geprüft wird. Bei den Einheitentests für die Komponente <c-api-property>
könnte entweder angenommen werden, dass die Komponenten <lightning-card>
, <lightning-input>
und <c-chart-bar>
wie erwartet funktionieren, oder man könnte ihr Verhalten simulieren, um unterschiedliche Szenarien unter verschiedenen Bedingungen zu simulieren.
Für einen End-to-End-Test würde man bei unserem Beispiel die Komponente <c-api-property>
in eine Browserseite laden, Prozentwerte in das Eingabefeld eingeben und prüfen, ob das Balkendiagramm richtig dargestellt wird. Bei einem End-to-End-Test werden keine Daten oder Verhaltensweisen simuliert – es wird getestet, ob alle drei Komponenten so zusammenarbeiten, wie sie dies nach der Bereitstellung für Ihre Benutzer tun sollen.
Übersicht
Die folgende Tabelle gibt einen groben Überblick über die Vor- und Nachteile von Einheitentests im Vergleich zu End-to-End-Tests.
Einheitentests |
End-to-End-Tests |
|
---|---|---|
Tests dauern nicht lange |
Ja |
Nein |
Tests sind zuverlässig |
Ja |
Nein |
Tests sind genau und ermöglichen Ihnen, Probleme exakt zu identifizieren |
Ja |
Nein |
Tests decken viele Funktionen einer Anwendung gleichzeitig ab |
Nein |
Ja |
Echtes Benutzerverhalten wird simuliert |
Nein |
Ja |
Da Sie nun mehr über die Unterschiede zwischen Einheitentests und End-to-End-Tests wissen, werfen wir einen Blick darauf, wie dies in der Praxis aussieht. Im restlichen Modul legen wir den Schwerpunkt auf Einheitentests für Lightning-Webkomponenten.
Ressourcen
- Entwicklerhandbuch: Lightning-Webkomponenten
- Trailhead: Erstellen von Lightning-Webkomponenten
- Trailhead: Einheitentests in der Lightning-Plattform
- Externe Website: Google Testing Blog: Just Say No to More End-to-End Tests (Englisch)
- Externe Website: Kent Dodds Blog: Write Tests (Englisch)
- Externe Website: Simple Programmer: Back to Basics: Why Unit Testing is Hard (Englisch)
- Externe Website: Wikipedia: Testgetriebene Entwicklung