REST-APIs testen: was neben dem Happy Path geprüft gehört
Statuscodes, Berechtigungen und Grenzwerte lassen sich in derselben Sammlung abdecken wie der erfolgreiche Aufruf. Es fehlt meistens nicht das Werkzeug, sondern die Liste.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Geprüft wird, was die Beschreibung verspricht, nicht was Aufrufer tun
Die typische Testsammlung für eine Schnittstelle folgt der Dokumentation: Für jeden Endpunkt gibt es einen Aufruf mit gültigen Daten, und geprüft wird, ob 200 zurückkommt und ob im Ergebnis die erwarteten Felder stehen. Das deckt genau den Fall ab, an den die Entwicklung ohnehin gedacht hat, und lässt alle anderen offen. Fehler entstehen aber nicht dort, wo jemand nachgedacht hat, sondern in den Ecken.
Der zweite Punkt ist die Vermischung von fachlicher Prüfung und Zugangsprüfung. Weil in der Sammlung meistens ein einziger Token hinterlegt ist, laufen alle Tests mit denselben Rechten. Damit ist die wichtigste Frage systematisch ausgeblendet, nämlich ob ein Konto Daten sehen oder ändern kann, die ihm nicht gehören. Genau diese Lücke führt die OWASP-Liste der API-Risiken seit Jahren an.
Der dritte Punkt ist die Trennung von Test und Auslieferung. Eine Sammlung, die nur auf dem Rechner einer Person läuft, verhindert keine Regression. Sobald die Schnittstelle sich ändert, merkt es niemand, bis ein Aufrufer eine Fehlermeldung schickt. Der Schritt von der manuellen Sammlung zum Lauf in der Pipeline ist technisch klein und wird trotzdem selten gegangen.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Der Ablauf, Schritt für Schritt
Sechs Stationen von der Beschreibung bis zum Lauf in der Pipeline. Die Reihenfolge ist nicht beliebig: Wer die Berechtigungsprüfung ans Ende schiebt, baut die ganze Sammlung mit einem einzigen Token auf und muss sie danach umbauen.
- 1
Den Vertrag beschaffen und gegenlesen
Hol die OpenAPI-Beschreibung der Schnittstelle und lies sie gegen die Wirklichkeit. Schon dieser Schritt liefert regelmäßig Funde: undokumentierte Felder, Pflichtangaben, die in der Beschreibung optional sind, Statuscodes, die im Betrieb auftreten und nirgends stehen. Wenn es keine Beschreibung gibt, erzeugt ihr sie aus dem Code, sonst fehlt die gemeinsame Bezugsgröße für alles Weitere.
Geschafft, wenn: Eine Beschreibung, gegen die sich Antworten automatisch auf Schemakonformität prüfen lassen.
- 2
Umgebungen und Konten trennen
Leg getrennte Umgebungen für Entwicklung, Test und Abnahme an, mit je eigener Basisadresse und eigenen Zugangsdaten. Richte mindestens drei Konten ein: ein reguläres, ein zweites reguläres ohne Bezug zum ersten und eines mit Verwaltungsrechten. Zugangsdaten gehören nicht in die Collection selbst, sondern in Umgebungsvariablen oder in einen Secrets Store, sonst landen sie in der Versionsverwaltung.
Geschafft, wenn: Dieselbe Sammlung läuft ohne Änderung gegen jede Umgebung und mit jedem der drei Konten.
- 3
Den erfolgreichen Weg als Gerüst bauen
Bau je Ressource den vollständigen Lebenszyklus: anlegen, lesen, ändern, löschen. Sichert dabei nicht nur den Statuscode zu, sondern auch das Schema der Antwort, die wichtigsten Feldwerte und die Antwortzeit. Die erzeugte Kennung wandert in eine Variable, sodass die folgenden Aufrufe darauf zugreifen. Damit habt ihr das Gerüst, an das alle Fehlerfälle andocken.
Geschafft, wenn: Ein durchgehender Ablauf je Ressource, der ohne manuelle Eingaben durchläuft.
- 4
Fehlerfälle systematisch ergänzen
Geh je Endpunkt die Liste durch: Pflichtfeld fehlt, Typ falsch, Wert außerhalb des erlaubten Bereichs, unbekanntes Feld mitgeschickt, ungültiges JSON, falscher Inhaltstyp, fehlender Token, abgelaufener Token, nicht vorhandene Kennung. Prüf jedes Mal den Statuscode und das Fehlerformat. Genau hier zeigt sich, ob die Schnittstelle einheitlich antwortet oder ob jeder Endpunkt sein eigenes Verhalten hat.
Geschafft, wenn: Eine Fehlermatrix je Endpunkt, aus der auch die Dokumentation für Aufrufer gespeist werden kann.
- 5
Berechtigungen über Kreuz prüfen
Nimm die Kennungen, die Konto A erzeugt hat, und ruf sie mit dem Token von Konto B ab, ändere und lösche sie. Erwartet wird eine Ablehnung, und zwar in allen drei Fällen. Wiederhol das für Felder, die nur die Verwaltung setzen darf, und für Endpunkte, die nur Verwaltungskonten aufrufen dürfen. Diese drei Prüfungen decken die Punkte eins, drei und fünf der OWASP-Liste ab und finden erfahrungsgemäß am meisten.
Geschafft, wenn: Für jede Ressource ein dokumentierter Nachweis, dass fremder Zugriff abgelehnt wird.
- 6
Die Sammlung in die Pipeline heben
Führ die Collection über die Kommandozeile aus, entweder mit dem mitgelieferten Werkzeug für Collections oder mit einem Runner wie Newman, und häng sie in eure Build-Kette. Ein schneller Teil läuft bei jeder Änderung, der vollständige Durchlauf vor der Auslieferung. Das Ergebnis gehört als Bericht in den Build, nicht in ein Postfach.
Geschafft, wenn: Eine Änderung an der Schnittstelle bricht den Build, bevor sie einen Aufrufer erreicht.
Fünf Ebenen einer vollständigen API-Prüfung
- 01 Vertrag: Stimmen Pflichtfelder, Typen und dokumentierte Codes mit der Beschreibung überein?
- 02 Fachlichkeit: Liefert der Endpunkt für gültige und für ungültige Eingaben das richtige Ergebnis?
- 03 Berechtigung: Kann ein Konto etwas sehen oder ändern, das ihm nicht gehört?
- 04 Robustheit: Was passiert bei leeren, sehr großen und sehr vielen Anfragen?
- 05 Regression: Läuft die Sammlung bei jeder Änderung automatisch, nicht nur auf einem Rechner?
Was eine vollständige Prüfliste enthält
Sechs Bereiche, die zusammen den größten Teil dessen abdecken, was in der Praxis schiefgeht. Sie lassen sich in derselben Sammlung ablegen wie die erfolgreichen Aufrufe und in derselben Pipeline ausführen.
Der Vertrag als Ausgangspunkt
Eine maschinenlesbare Beschreibung der Schnittstelle nach OpenAPI ist die Grundlage für alles Weitere. Aus ihr ergeben sich Pflichtfelder, Typen, erlaubte Werte und dokumentierte Statuscodes. Wenn es sie nicht gibt, ist das der erste Befund: Ohne Vertrag prüfst du gegen deine Erwartung und nicht gegen eine Zusage.
Statuscodes nach Bedeutung prüfen, nicht nach Zahl
Die Semantik der Statuscodes ist in RFC 9110 festgelegt, und die häufigsten Verwechslungen sind teuer: 401 für fehlende Anmeldung gegen 403 für fehlende Berechtigung, 400 für kaputtes Format gegen 422 für inhaltlich unzulässige Daten, 404 für nicht vorhanden gegen 403 für nicht erlaubt. Prüft für jeden Endpunkt, welcher Code in welchem Fall kommt, und ob die Antwort dazu passt.
Fehlerantworten in einem einheitlichen Format
RFC 9457 beschreibt ein maschinenlesbares Format für Fehlerantworten mit den Feldern type, status, title, detail und instance, ausgeliefert als application/problem+json. Wenn eure Schnittstelle das benutzt, lässt sich der Fehlerfall genauso zusichern wie der Erfolgsfall. Wenn nicht, prüft mindestens, ob das Format über alle Endpunkte hinweg gleich ist.
Jede Prüfung mit zwei Konten fahren
Leg zwei Konten an, die einander nichts angehen, und ruf mit dem einen die Ressourcen des anderen ab. Das deckt die Kategorie ab, die in der OWASP-Liste an erster Stelle steht: eine fehlende Berechtigungsprüfung auf Objektebene. Dasselbe gilt auf Feldebene, also ob ein Konto Felder lesen oder setzen kann, die ihm nicht zustehen, und auf Funktionsebene bei Verwaltungsendpunkten.
Grenzwerte und Mengen ausdrücklich abdecken
Leere Liste, ein Element, die maximale Seitengröße, eine Seitengröße darüber, negative Werte, sehr lange Zeichenketten, Sonderzeichen und Zeichen außerhalb der lateinischen Schrift. Dazu die Frage, was passiert, wenn ein Aufrufer sehr viele Anfragen in kurzer Zeit stellt. Unbegrenzter Ressourcenverbrauch steht in der OWASP-Liste als eigener Punkt, weil er in der Praxis regelmäßig übersehen wird.
Wiederholung und Reihenfolge prüfen
Was passiert, wenn derselbe schreibende Aufruf zweimal ankommt, weil ein Netz gestottert hat? Entsteht ein zweiter Datensatz oder greift eine Absicherung über einen Idempotenzschlüssel? Und was passiert, wenn zwei Änderungen an derselben Ressource gleichzeitig eintreffen? Diese Fälle treten im Betrieb sicher auf und stehen fast nie in der Testsammlung.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Der Vertrag ist der Testplan
Eine OpenAPI-Beschreibung enthält alles, was für die formale Prüfung nötig ist: Pfade, Methoden, Parameter, Pflichtfelder, Typen, erlaubte Wertebereiche, Antwortschemata und die dokumentierten Statuscodes. Daraus lassen sich Testfälle nicht vollständig ableiten, aber die Randfälle: Für jedes Pflichtfeld gibt es einen Test ohne dieses Feld, für jeden Zahlenbereich einen Test an der Grenze, für jede Aufzählung einen Test mit einem Wert außerhalb.
Der zweite Nutzen ist die automatische Prüfung der Antwort gegen das Schema. Statt einzelne Felder zu vergleichen, prüft ihr, ob die gesamte Antwort dem hinterlegten Schema entspricht. Damit fallen auch die Änderungen auf, an die niemand gedacht hat: ein Feld, das plötzlich fehlt, ein Typ, der von Zahl auf Zeichenkette gewechselt ist, ein Nullwert an einer Stelle, die keinen zulässt.
Was der Vertrag nicht enthält, ist die Fachlichkeit. Dass ein Rabatt nie über hundert Prozent liegen darf, dass eine Frist nicht in der Vergangenheit enden kann, dass eine Stornierung nach dem Versand abgelehnt wird, all das steht in keinem Schema. Diese Fälle kommen aus dem Gespräch mit dem Fachbereich und aus den Verfahren des Testentwurfs, und sie sind der Teil, der die Schnittstelle wirklich absichert.
Statuscodes und Fehlerformate: wo die meisten Schnittstellen schludern
RFC 9110 legt die Bedeutung der Statuscodes fest, und die Abweichungen davon sind erstaunlich beständig. Die häufigste ist der Sammelcode 200 für alles, mit einem Feld im Rumpf, das den eigentlichen Fehler transportiert. Für Aufrufer ist das die unangenehmste Variante, weil jede Zwischenschicht, jeder Zwischenspeicher und jede Überwachung den Aufruf für erfolgreich hält.
Die zweite Abweichung betrifft die Unterscheidung von 401 und 403. Fehlt die Anmeldung oder ist der Token abgelaufen, gehört 401 zurück. Ist die Anmeldung in Ordnung, die Berechtigung aber nicht, gehört 403 zurück. Wer beide zusammenwirft, macht Aufrufern die Fehlerbehandlung unmöglich, denn nur im ersten Fall hilft ein neuer Token. Verwandt ist die Frage, ob eine fremde Ressource mit 403 oder mit 404 beantwortet wird. Beides ist vertretbar, 404 verrät weniger über die Existenz fremder Daten, aber es muss durchgängig gleich gehandhabt werden.
Die dritte Stelle ist die Unterscheidung zwischen kaputter Anfrage und unzulässigem Inhalt. Ein 400 sagt, dass die Anfrage formal nicht verarbeitbar war, etwa bei ungültigem JSON. Ein 422 sagt, dass sie formal in Ordnung war, der Inhalt aber gegen eine Regel verstößt. Für Aufrufer ist das ein wichtiger Unterschied, weil nur der zweite Fall ihnen sagt, dass sie die Daten korrigieren müssen und nicht ihren Aufruf.
Für den Rumpf der Fehlerantwort gibt es mit RFC 9457 ein festgelegtes Format. Es definiert die Felder type, status, title, detail und instance und schreibt den Medientyp application/problem+json vor. Wer das übernimmt, kann Fehlerfälle in der Testsammlung genauso hart zusichern wie Erfolgsfälle, und Aufrufer können auf den Typ reagieren, statt Zeichenketten zu vergleichen.
Berechtigungen sind der Bereich mit den meisten echten Funden
Die OWASP API Security Top 10 in der Fassung von 2023 führt an erster Stelle Broken Object Level Authorization, also die fehlende Prüfung, ob das anfragende Konto auf genau dieses Objekt zugreifen darf. Der Fall ist banal und trotzdem verbreitet: Eine Kennung steht in der URL, der Endpunkt prüft, ob überhaupt jemand angemeldet ist, und liefert dann aus. Wer die eigene Kennung um eins erhöht, bekommt fremde Daten.
Zwei weitere Punkte derselben Liste gehören in dieselbe Prüfung. Broken Object Property Level Authorization betrifft die Feldebene: Ein Konto darf ein Objekt sehen, aber nicht alle seine Felder, oder es darf es ändern, aber nicht das Feld, das den Preis oder die Rolle setzt. Broken Function Level Authorization betrifft ganze Endpunkte, typischerweise Verwaltungsfunktionen, die nur deshalb nicht auffallen, weil die Oberfläche den Knopf ausblendet.
Die praktische Umsetzung ist einfach und wird trotzdem selten gemacht: In jeder Sammlung liegen die Kennungen, die Konto A erzeugt hat, in Variablen. Für die Kreuzprüfung tauscht ihr nur den Token gegen den von Konto B und erwartet eine Ablehnung. Das lässt sich für alle Ressourcen in einem Durchlauf fahren, und es ist der Test, der in Erstprüfungen am häufigsten anschlägt.
Robustheit: Menge, Wiederholung und Nebenläufigkeit
Unbegrenzter Ressourcenverbrauch steht als eigener Punkt in der OWASP-Liste, und im Test bedeutet er zwei Fragen. Erstens: Was passiert bei einer Abfrage ohne Begrenzung, wenn dahinter hunderttausend Datensätze liegen? Eine Schnittstelle ohne verpflichtende Seitengröße lässt sich mit einem einzigen Aufruf in die Knie zwingen. Zweitens: Was passiert bei sehr vielen Aufrufen in kurzer Zeit? Wenn keine Begrenzung greift, ist das ein Befund, und wenn eine greift, gehört geprüft, ob sie mit 429 und einem Hinweis auf die Wartezeit antwortet.
Die Wiederholung schreibender Aufrufe ist der Fall, der im Betrieb sicher auftritt und im Test fast nie steht. Ein Aufrufer schickt eine Bestellung, das Netz stottert, er versucht es erneut. Wenn die Schnittstelle keinen Idempotenzschlüssel unterstützt, entstehen zwei Bestellungen, und dieser Fehler fällt niemandem in der Entwicklung auf, weil dort das Netz funktioniert. Der Test dafür ist ein Zweizeiler: denselben Aufruf zweimal schicken und zählen.
Nebenläufigkeit ist der dritte Bereich. Zwei Änderungen an derselben Ressource, die gleichzeitig eintreffen, dürfen sich nicht gegenseitig überschreiben. Der übliche Mechanismus dafür ist eine Versionsangabe über ETag und If-Match, sodass die zweite Änderung mit einem Konflikt abgelehnt wird. Wenn eure Schnittstelle das anbietet, gehört es geprüft. Wenn nicht, ist die stille Überschreibung ein Befund, den ihr an die Entwicklung meldet.
Was diese Prüfung nicht abdeckt
Sie ist kein Lasttest. Antwortzeiten unter normalen Bedingungen lassen sich in der Sammlung mit zusichern, aber die Frage, wie sich die Schnittstelle bei tausend gleichzeitigen Aufrufen verhält, braucht ein Werkzeug für Lastprofile und eine Umgebung, die der Produktion ähnelt. Wer beides vermischt, bekommt ungenaue Zahlen und langsame Testläufe.
Sie ist auch kein vollständiger Sicherheitstest. Die Prüfung entlang der OWASP-Liste deckt die Kategorien ab, die sich mit fachlichem Wissen und einem zweiten Konto finden lassen, und das ist der größere Teil der praktisch ausgenutzten Fälle. Was sie nicht abdeckt, sind Injection-Angriffe über verschachtelte Strukturen, Angriffe auf die Bibliotheken dahinter und Schwächen in der Infrastruktur. Dafür braucht es eine eigene Untersuchung mit anderen Werkzeugen.
Und sie ersetzt keine Vertragstests zwischen Diensten. Wenn drei andere Dienste eure Schnittstelle aufrufen, sagt eure eigene Sammlung nur, dass ihr eure Zusagen einhaltet, wie ihr sie verstanden habt. Ein Vertragstest, den der aufrufende Dienst beisteuert, sagt euch, was er tatsächlich erwartet, und das ist regelmäßig etwas anderes.
Dazu passende Kurse
Weil sich die Fehlermatrix am schnellsten an einer echten Schnittstelle aufbaut, sind Kurse zum Prüfen von Schnittstellen der kürzere Weg als das Durcharbeiten der Werkzeugdokumentation.
Die Kreuzprüfung der Berechtigungen ist der Übergang von Testarbeit zu Sicherheitsarbeit, und dafür gibt es Kurse zur sicheren Prüfung von Web-Schnittstellen .
Wie sicher bist du beim Thema wirklich?
Lesen fühlt sich schnell nach Können an. Ein kurzer Test zeigt dir, was davon schon sitzt und wo sich ein Kurs lohnt. Kostenlos, ohne Anmeldung, mit einer Erklärung zu jeder Antwort.
Wo du genau das übst
Sehr umfangreicher Überblick über Zusammenhänge und Anwendungsbereiche. Sehr zu empfehlen.
Effektives, gemeinsames Erarbeiten der Aufgaben mit vielen praktischen Tipps.
Sehr guter Trainer und gute Aufbereitung der Inhalte und auch eingehen auf Fragen der Beteiligten.
Häufige Fragen
Brauchen wir eine OpenAPI-Beschreibung, um sinnvoll testen zu können?
Gehören API-Tests ins Testteam oder in die Entwicklung?
Wie testen wir Endpunkte, die Daten in einem Fremdsystem verändern?
Wie viele Fehlerfälle sind je Endpunkt angemessen?
Reicht Postman, oder brauchen wir ein zusätzliches Werkzeug?
Deine Ansprechpartner
Du bist dir nicht sicher, welcher Kurs oder welches Level zu dir passt? Wir beraten dich persönlich und kostenlos.
Yves Hoppe
Weiterbildung & Beratung
Hilft dir, aus dem Programmierung-Programm den passenden Kurs für deinen Stand zu finden.
Norbert Jansen
Beratung & Inhouse
Plant mit dir Inhouse-Trainings, die auf eure Abläufe und euren Datenbestand zugeschnitten sind.
Aus einzelnen Aufrufen eine belastbare Testbasis machen
Der Aufbau mit Collections, Umgebungen, Assertions und Ausführung über die Kommandozeile ist Inhalt der Postman-Schulung bei cmt. Wer danach gezielt entlang der OWASP-Liste prüfen will, findet die Fortsetzung im Kurs zur Sicherheitsprüfung von REST-Schnittstellen.
Passt dazu
- Wie viele Unit-, Integrations- und Oberflächentests euer Projekt braucht
- Wann sich Testautomatisierung rechnet und wann sie Geld verbrennt
- Flaky Tests: warum dieselbe Suite mal grün und mal rot ist
- Anforderungen so aufschreiben, dass Entwicklung und Test dasselbe verstehen