Unit Testing
Unit Tests prüfen einzelne, isolierte Einheiten des Quellcodes und stellen sicher, dass diese in sich wie vorgesehen funktionieren.
Ein typisches Beispiel: In einem Onlineshop kann ein Produkt dem Warenkorb hinzugefügt werden. Ein Unit Test prüft dabei nicht, ob der Button klickbar ist oder die Seite korrekt aussieht, sondern ob die zugrunde liegende Logik stimmt: Wurde das Produkt korrekt erfasst? Stimmt die Anzahl? Wird der Gesamtpreis richtig berechnet und gespeichert? Genau diese Business-Logik wird isoliert geprüft, unabhängig vom Rest der Applikation.
Das Ziel ist es, Fehler so früh wie möglich zu lokalisieren: Schlägt ein Unit Test fehl, ist der betroffene Codebereich direkt identifizierbar. Unit Tests werden von Entwickler*innen erstellt, laufen in der Regel automatisiert und begleiten die Entwicklung von Anfang an.
Component Testing
Sobald einzelne Einheiten getestet sind, werden grössere, in sich abgeschlossene Komponenten eines Systems überprüft, also beispielsweise ein ganzes Modul oder ein Service. Component Tests prüfen das Verhalten einer Komponente möglichst isoliert von anderen Teilen des Systems. Die Abhängigkeiten zu anderen Teilen des Systems werden nicht berücksichtigt.
Zurück zu unserem Warenkorb-Beispiel, bei dem ein Produkt dem Warenkorb hinzugefügt wird: Ein Component Test prüft dabei nicht die Business-Logik dahinter, sondern ob die Komponente sich korrekt verhält: Wird der “Zum Warenkorb hinzufügen-Button” deaktiviert, sobald das Produkt bereits im Warenkorb ist? Erscheint die Erfolgsmeldung nach dem Klick? Zeigt die Komponente einen Ladezustand, während die Anfrage läuft? Genau dieses Verhalten wird isoliert geprüft.
Integration Testing
Integration Testing prüft, ob voneinander abhängige Komponenten korrekt miteinander interagieren: ob Daten korrekt übergeben werden, ob Logiken zusammen funktionieren und ob sich das System als Ganzes verhält wie erwartet.
Beim Warenkorb-Beispiel kann geprüft werden, ob eine Bestellung nicht nur innerhalb einer Komponente korrekt verarbeitet wird, sondern die Bestellung auch tatsächlich korrekt in der Datenbank landet. Hier zeigen sich Fehler, die bei isolierten Unit oder Component Tests nicht sichtbar werden: Die einzelnen Teile funktionieren zwar in sich, aber nicht miteinander.
API Testing
API Tests sind mitunter Teil von Integrationstests, fokussieren sich aber auf die Kommunikation zwischen definierten Schnittstellen. Sie prüfen, ob APIs die richtigen Daten zurückgeben, korrekt auf Anfragen reagieren und unter verschiedenen Bedingungen stabil bleiben, unabhängig davon, was an der Oberfläche passiert.
Beispiel: Ein Produkt wird dem Warenkorb hinzugefügt. Ein API Test prüft die Schnittstelle dahinter - gibt der Endpoint die erwarteten Daten und Statuscodes zurück? Reagiert die Schnittstelle korrekt, wenn ein Produkt nicht mehr verfügbar ist? Diese Kommunikation kann unabhängig vom Rest des Systems mit Software wie Postman oder mit eigenen Scripts getestet werden.
End-to-End Testing
End-to-End Tests simulieren vollständige Abläufe aus der Perspektive aller Nutzenden die mit der Applikation oder Software in Berührung kommen. Mehrere User Stories werden zusammenhängend getestet, um das Zusammenspiel des gesamten Systems zu kontrollieren und sicherzustellen, dass Daten über verschiedene Systemgrenzen hinweg korrekt fliessen. Diese Tests kommen in der Regel gegen Ende eines Entwicklungszyklus zum Einsatz.
Aus unserem Warenkorb-Beispiel wird nun ein vollständiger Ablauf: Produkt suchen, in den Warenkorb legen, Checkout abschliessen, Bestellbestätigung erhalten - das sind alles Teile die irgend ein User Interface (UI) betreffen, mit dem ein*e Enduser*in arbeitet. Das ist aber nicht alles: In diesem Beispiel gehört zum End-to-End Test beispielsweise auch, ob das ERP dann die korrekte Rüstliste für Mitarbeitende im Lager generiert. Ein End-to-End Test prüft also, ob die Prozesse von Anfang bis Ende wie vorgesehen funktionieren.