Die Automatisierung des Testens von REST-APIs ist einer der schnellsten und effektivsten Wege, die Geschäftslogik einer Serveranwendung zu kontrollieren, wodurch die Korrektheit der Antworten ohne UI validiert werden kann.
Historie der Frage: Früher lag der Schwerpunkt im Testen auf der Benutzeroberfläche, aber mit der Entwicklung der Mikrodienstarchitektur und dem Anstieg der Komplexität der Beziehungen zwischen den Komponenten wurde es wichtig, die Interaktion „über APIs“ zu testen.
Problem: REST-APIs können sich häufig ändern: Schemas, Parameter, Anforderungs- und Antwortformate ändern sich. Außerdem gibt es häufig Abhängigkeiten von externen Diensten, was die Erstellung isolierter und zuverlässiger Tests erschwert. In großen Projekten kann die Anzahl der Endpunkte Hunderte betragen.
Lösung: Es wird empfohlen, spezialisierte Bibliotheken (RestAssured, Postman/Newman, HTTP-Clients) zu verwenden, Testszenarien basierend auf den Geschäftsanforderungen zu modellieren und die Testumgebung mithilfe von Mocks/Stubs maximal zu isolieren. Es ist auch hilfreich, Testdaten automatisch zu generieren und eine Validierung basierend auf Schemas (z. B. JSON-Schema) zu verwenden.
Wesentliche Merkmale:
Kann man REST-APIs nur auf der Ebene des Antwortinhalts testen?
Nein, es ist notwendig, den vollständigen Vertrag zu validieren: Antwortcodes, Header, Struktur und sogar Antwortzeiten.
Reicht es aus, bei der Automatisierung von REST nur den "happy path" — positive Szenarien — zu testen?
Nein, man muss unbedingt Grenzfälle, Datenvalidierung, Fehlerbehandlung und nicht-standardmäßige Szenarien ("Edge Cases") testen.
Muss man für die Automatisierung eine separate Umgebung einrichten?
Wünschenswert, um den Einfluss der Tests auf reale Daten zu minimieren und stabile Ergebnisse zu erzielen. Tests können Ressourcen erstellen und modifizieren, was in einer Produktionsumgebung nicht immer zulässig ist.
Alle Tests sprechen auf die Produktions-API, arbeiten an denselben Ressourcen und reinigen keine Daten. Ein Test kann den Zustand „brechen“, der andere schlägt sofort fehl.
Vorteile:
Nachteile:
Es wurde eine separate Umgebung geschaffen, die Tests verwenden gemockte Dienste für Integrationstests und isolierte Testdaten, der Teardown nach jedem Test bringt die Umgebung in ihren ursprünglichen Zustand zurück.
Vorteile:
Nachteile: