API-Testen
REST, JSON, Statuscodes, Pagination, Versionierung, Contract-Tests. Berechenbare Lösungen per Programm geprüft.
- PUT oder PATCH ★☆☆ REST · HTTP-Methoden ✓ gelöst
Bei einem Kunden soll nur die Telefonnummer geändert werden, alle anderen Felder bleiben.
Welche Methode passt dazu?
Lösung anzeigen
Richtig: PATCH – ändert nur die mitgeschickten Felder
PUT ersetzt die ganze Ressource: Fehlende Felder können dabei geleert werden. PATCH ändert nur, was mitgeschickt wird. Guter Test: per PUT nur die Telefonnummer senden und prüfen, was mit den übrigen Feldern passiert.
- GET ändert Daten ★★☆ REST · HTTP-Methoden ✓ gelöst
Eine API bietet den Aufruf GET /newsletter/abmelden?email=… an, der den Nutzer sofort abmeldet.
Was ist daran problematisch?
Lösung anzeigen
Richtig: GET soll nur lesen; Vorschau-Funktionen oder Virenscanner, die Links aufrufen, melden Nutzer unbeabsichtigt ab
GET gilt als „sicher“, also ohne Nebenwirkung. Mailprogramme, Link-Vorschauen und Suchmaschinen rufen solche Links automatisch auf. Ein Klick-Link sollte deshalb erst eine Bestätigungsseite zeigen, die eigentliche Abmeldung läuft per POST.
- Statuscode bei Eingabefehler ★☆☆ HTTP · Fehlerbehandlung ✓ gelöst
Ein Client sendet beim Anlegen eines Kunden eine ungültige E-Mail-Adresse.
Welcher Statuscode ist angemessen?
Lösung anzeigen
Richtig: 400 Bad Request (oder 422) mit einer Beschreibung des Fehlers
Fehler, die der Client verursacht, gehören in den 4xx-Bereich. 500 heißt „der Server hat ein Problem“ und löst oft falschen Alarm im Monitoring aus. 200 mit Fehlertext verwirrt jeden Client, der nur den Status prüft. Ein häufiger Befund in API-Tests.
- Seitenweise abrufen ★☆☆ Pagination ✓ gelöst
Eine API liefert 20 Einträge pro Seite. Insgesamt gibt es 95 Kunden.
Wie viele Seiten gibt es, und wie viele Einträge hat die letzte?
Lösung anzeigen
Richtig: 5 Seiten, die letzte mit 15 Einträgen
95 / 20 = 4,75, also 5 Seiten; auf der letzten bleiben 95 − 80 = 15. Gute Pagination-Tests: genau 0, 1, 20, 21 Einträge, die letzte Seite, eine Seite hinter der letzten und eine negative Seitenzahl.
- Gültiges JSON ★☆☆ JSON ✓ gelöst
Vier Antworten einer API sollen auf gültiges JSON geprüft werden.
Welche ist gültiges JSON?
Lösung anzeigen
Richtig: {"name": "Anna", "alter": 56}
JSON verlangt doppelte Anführungszeichen für Texte und Schlüssel und erlaubt kein Komma nach dem letzten Element. Was in JavaScript-Code funktioniert, ist deshalb noch kein gültiges JSON. Strenge Parser lehnen die anderen drei ab.
- Große IDs in JSON ★★★ JSON · Datentypen ✓ gelöst
Eine API liefert {"id": 9007199254740993}. Im Browser (JavaScript) kommt 9007199254740992 an.
Was ist die Ursache, und was ist die übliche Lösung?
Lösung anzeigen
Richtig: JavaScript speichert Zahlen als double und verliert ab 2⁵³ Genauigkeit; große IDs als Text übertragen
In JavaScript sind alle Zahlen double. Ganzzahlen sind nur bis 2⁵³ (9.007.199.254.740.992) exakt. Java-long-IDs liegen schnell darüber. Deshalb liefern viele APIs IDs als String. Testidee: IDs nahe und über 2⁵³ verwenden.
- Contract-Tests ★★☆ Contract-Tests · Microservices ✓ gelöst
Ein Bestelldienst ruft einen Lagerdienst auf. Beide Teams entwickeln unabhängig voneinander.
Wozu dienen Contract-Tests (z. B. mit Pact)?
Lösung anzeigen
Richtig: Sie prüfen, ob beide Seiten die vereinbarte Schnittstelle einhalten, ohne alles gemeinsam starten zu müssen
Der Aufrufer beschreibt, welche Anfragen er stellt und welche Antworten er erwartet. Der Anbieter prüft in seinem Build, ob er das liefert. So fällt eine Änderung, die den Aufrufer bricht, schon vor dem Deployment auf.
- Content-Type ★☆☆ HTTP · Header ✓ gelöst
Ein Client sendet einen Kunden als JSON im Rumpf einer POST-Anfrage.
Welcher Header-Wert gehört dazu?
Lösung anzeigen
Richtig: Content-Type: application/json
Content-Type beschreibt das Format dessen, was gesendet wird. Accept sagt, was man zurückhaben möchte. Fehlt der richtige Content-Type, lehnen viele Server mit 415 Unsupported Media Type ab. Ein guter Negativtest.
- 304 Not Modified ★★☆ HTTP · Caching ✓ gelöst
Ein Client fragt eine Ressource mit dem Header If-None-Match und einem ETag an. Die Antwort ist 304 ohne Inhalt.
Was bedeutet das?
Lösung anzeigen
Richtig: Die Ressource hat sich nicht geändert, der Client kann seine zwischengespeicherte Kopie verwenden
Das ETag ist eine Art Fingerabdruck der Ressource. Stimmt er noch, spart der Server die Übertragung. Testidee: Ressource ändern und prüfen, ob sich das ETag ändert. Bleibt es gleich, sehen Clients veraltete Daten.
- Breaking Change ★★☆ Versionierung ✓ gelöst
Eine öffentliche API in Version 1 soll erweitert werden, ohne bestehende Clients zu stören.
Welche Änderung bricht bestehende Clients?
Lösung anzeigen
Richtig: Das Feld "telefon" in "telefonnummer" umbenennen
Umbenennen ist für Clients dasselbe wie Löschen plus Neuanlegen, alte Clients finden "telefon" nicht mehr. Hinzufügen ist meist unkritisch, vorausgesetzt, Clients ignorieren unbekannte Felder. Auch das sollte man testen.
- Zeitangaben in APIs ★★☆ Datum · Formate ✓ gelöst
Ein Termin wird über eine API übertragen.
Welches Format ist am eindeutigsten?
Lösung anzeigen
Richtig: 2026-10-26T14:34:00+01:00
ISO 8601 mit Zeitzonenversatz ist eindeutig und maschinenlesbar. Die deutschen und US-Formate sind leicht zu verwechseln (10/11 = 10. November oder 11. Oktober?). Ohne Zeitzone bleibt offen, welche 14:34 gemeint sind.
- Zu schwacher API-Test ★☆☆ Testqualität ✓ gelöst
Testcode: Response r = api.get("/kunden/42"); assertEquals(200, r.status());Was fehlt diesem Test am meisten?
Lösung anzeigen
Richtig: Eine Prüfung des Inhalts, z. B. Name, ID und Aufbau der Antwort
Status 200 heißt nur, dass irgendetwas zurückkam. Ein leerer Kunde, ein falscher Kunde oder eine Fehlermeldung mit Status 200 würden den Test bestehen. Ein API-Test sollte mindestens die wichtigen Felder oder das Schema prüfen.
- null oder weggelassen ★★★ JSON · PATCH ✓ gelöst
PATCH /kunden/42 mit {"telefon": null} im Vergleich zu PATCH mit {} (Feld weggelassen).
Was ist üblicherweise der Unterschied?
Lösung anzeigen
Richtig: null löscht die Telefonnummer, weglassen lässt sie unverändert
Bei PATCH muss eine API zwischen „nicht ändern“ und „leeren“ unterscheiden. In Java ist das tückisch, weil beim Einlesen beides oft zu null wird. Ein klassischer Testfall, der genau diesen Unterschied prüft.
- Wann wiederholen ★★☆ Robustheit · Fehlerbehandlung ✓ gelöst
Ein Client soll bei Fehlern automatisch einen zweiten Versuch starten.
Bei welchem Status ist eine automatische Wiederholung sinnvoll?
Lösung anzeigen
Richtig: 503 Service Unavailable
503 meldet ein vorübergehendes Problem, ein späterer Versuch kann klappen (am besten mit wachsenden Abständen). Bei 400, 401 oder 404 ist die Anfrage selbst falsch, eine Wiederholung erzeugt nur zusätzliche Last.
- Erfolgreiches Löschen ★☆☆ HTTP · REST ✓ gelöst
DELETE /kunden/42 war erfolgreich. Die Antwort enthält keinen Inhalt.
Welcher Status passt am besten?
Lösung anzeigen
Richtig: 204 No Content
204 heißt: erfolgreich, aber nichts zurückzugeben. 200 mit Inhalt geht auch. Interessanter Folgetest: Was liefert ein zweites DELETE auf denselben Kunden? Meist 404, und das sollte dokumentiert sein.
- Blättern bei neuen Daten ★★★ Pagination · Konsistenz ✓ gelöst
Ein Client lädt Bestellungen seitenweise, neueste zuerst, mit ?page=1, ?page=2 … Während er blättert, kommen neue Bestellungen hinzu.
Was kann passieren?
Lösung anzeigen
Richtig: Einträge erscheinen doppelt, weil sich alles nach hinten verschiebt
Kommt vorne ein neuer Eintrag hinzu, rutscht der letzte von Seite 1 auf Seite 2 und wird erneut geliefert. Beim Löschen fehlen umgekehrt Einträge. Abhilfe: Cursor-basiertes Blättern („gib mir die nächsten 20 nach Bestellung 4711“).
- Externe API simulieren ★★☆ Test Doubles · Integrationstests ✓ gelöst
Eine Anwendung ruft den Zahlungsdienst eines Anbieters auf. Im Test soll auch geprüft werden, was bei Timeouts und Fehlern passiert.
Wie testet man das am besten?
Lösung anzeigen
Richtig: Einen simulierten Dienst (z. B. WireMock) starten, der gezielt Fehler, Verzögerungen und Sonderfälle liefert
Ein simulierter Dienst kann auf Knopfdruck 500, langsame Antworten oder kaputtes JSON liefern. Gerade die Fehlerfälle, die beim echten Dienst selten sind, lassen sich so zuverlässig und wiederholbar testen.
- JSON Schema ★★☆ JSON · Validierung ✓ gelöst
Ein JSON Schema für Kunden enthält: "required": ["id", "name"]
Was prüft diese Angabe?
Lösung anzeigen
Richtig: Dass die Felder id und name vorhanden sind
required prüft nur das Vorhandensein. "name": "" besteht die Prüfung. Für Mindestlängen braucht es minLength, für das Verbot weiterer Felder additionalProperties: false. Typische Lücke in automatischen API-Prüfungen.
- Zu großes Limit ★★☆ Pagination · Robustheit ✓ gelöst
Eine API erlaubt den Parameter ?limit=… für die Seitengröße. Standard ist 20.
Was sollte bei ?limit=1000000 passieren?
Lösung anzeigen
Richtig: Die API begrenzt auf ein festgelegtes Maximum oder lehnt mit 400 ab
Ohne Obergrenze kann ein einziger Aufruf den Server lahmlegen. Ob kappen oder ablehnen, muss festgelegt und dokumentiert sein. Ein Test mit einem sehr großen Wert gehört zu jeder Pagination-Prüfung.
- Sonderzeichen in der URL ★★☆ URL · Encoding ✓ gelöst
Ein Client sucht nach einer Straße: GET /adressen?strasse=Müller Str
Wie muss der Wert in der URL kodiert werden (UTF-8)?
Lösung anzeigen
Richtig: M%C3%BCller%20Str
Leerzeichen und Umlaute müssen in URLs prozentkodiert werden. ü wird in UTF-8 zu den Bytes C3 BC, also %C3%BC. %FC wäre die alte Latin-1-Kodierung, die auf dem Server wieder zu kaputten Umlauten führt.