Wie man eine Web-API testet
Ein API-Test schickt eine Anfrage und prüft die Antwort. Er schaut nicht auf den Code hinter der API. Er fragt nur, was ein Aufrufer fragen würde, und vergleicht die Antwort mit dem, was die API versprochen hat.
Sie schreiben ein paar Prüfungen von Hand, sehen eine scheitern und testen, was geschieht, wenn eine Anfrage zweimal geschickt wird.
Am Ende dieser Lektion
Notiz
Ich kann eine API mit guten Anfragen, schlechten Anfragen und Wiederholungen testen und sagen, was jede Prüfung beweist.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Testfall | eine Anfrage und die Antwort, die Sie erwarten |
| Erwarteter Status | der Statuscode, mit dem die API antworten soll |
| Testdaten | Zeilen, die nur für einen Test angelegt wurden, damit man sie findet und entfernt |
| Wiederholung | dieselbe Anfrage noch einmal schicken, weil die erste Antwort verloren ging |
| Idempotent | zweimal geschickt, bleibt alles wie nach dem ersten Mal |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Prüfung ist eine Anfrage und ein Status
Curl von Hand zu tippen und die Zahlen mit dem Auge zu lesen wird bei vielen Anfragen mühsam und fehleranfällig. Schreiben Sie die Prüfung einmal: einen Namen, den gewünschten Status und die Anfrage.
Geben Sie zuerst psql das Passwort und legen Sie die Tabelle buecher an. Definieren Sie dann in Ihrem Terminal eine kleine Funktion pruefe, die die Anfrage schickt und BESTANDEN oder DURCHGEFALLEN meldet.
psql das Passwort geben
export PGPASSWORD=shopHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tabelle buecher anlegen
psql -h db -U shop -c "drop table if exists buecher cascade; create table buecher (id serial primary key, titel text not null, jahr int not null, verfuegbar boolean not null default true); insert into buecher (titel, jahr, verfuegbar) values ('Karten der See', 1998, true), ('Fluesse Europas', 2004, false), ('Nachtzuege', 2011, true); notify pgrst, 'reload schema'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Funktion pruefe definieren
pruefe() { soll=$1; name=$2; shift 2; ist=$(curl -s -o /dev/null -w '%{http_code}' "$@"); if [ "$ist" = "$soll" ]; then echo "BESTANDEN $name"; else echo "DURCHGEFALLEN $name, erwartet $soll und bekommen $ist"; fi; }Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine gute Anfrage prüfen
pruefe 200 "Buecher auflisten" "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Etwas prüfen, das scheitern soll
pruefe 200 "absichtlich falsch" "http://api:3000/nichts"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Testen, was die API ablehnt
Die zweite Prüfung war absichtlich falsch, um zu beweisen, dass die Funktion DURCHGEFALLEN sagen kann. Eine Prüfung, die immer BESTANDEN druckt, ist schlechter als keine.
Eine gute Testreihe verwendet auf schlechte Anfragen so viel Zeit wie auf gute. Jede sollte als 4xx mit dem richtigen Code zurückkommen und die Daten nicht ändern.
Ein Buch ohne Titel prüfen
pruefe 400 "kein Titel" -X POST -H "Content-Type: application/json" -d '{"jahr":2019}' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Inhalt prüfen, der kein JSON ist
pruefe 400 "kaputtes JSON" -X POST -H "Content-Type: application/json" -d 'das ist kein json' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Anlegen eines Testbuchs prüfen
pruefe 201 "Buch anlegen" -X POST -H "Content-Type: application/json" -d '{"id":900,"titel":"Testbuch","jahr":2020}' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dieselbe id noch einmal prüfen
pruefe 409 "dieselbe id nochmals" -X POST -H "Content-Type: application/json" -d '{"id":900,"titel":"Testbuch","jahr":2020}' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Inhalt prüfen, nicht nur den Status
curl -s "http://api:3000/buecher?id=eq.900" | grep -q '"titel":"Testbuch"' && echo "BESTANDEN der Inhalt hat den Titel" || echo "DURCHGEFALLEN der Inhalt hat den Titel"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine zweimal geschickte Anfrage testen
Netze verlieren Antworten, also schicken Clients dieselbe Anfrage noch einmal. Eine Anfrage ist idempotent, wenn zweimaliges Senden die Daten so lässt, wie sie nach dem ersten Mal waren.
Testen Sie das durch Zählen von Zeilen. Zuerst eine Änderung, die einen Wert setzt, dann ein POST ohne id, das jedes Mal ein neues Buch anlegen sollte.
Dieselbe Änderung zweimal schicken
for i in 1 2; do curl -s -o /dev/null -w "%{http_code}\n" -X PATCH -H "Content-Type: application/json" -d '{"verfuegbar":false}' "http://api:3000/buecher?id=eq.1"; doneHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dasselbe neue Buch zweimal schicken
for i in 1 2; do curl -s -o /dev/null -X POST -H "Content-Type: application/json" -d '{"titel":"Zweimal","jahr":2020}' "http://api:3000/buecher"; doneHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Bücher mit dem Titel Zweimal zählen
psql -h db -U shop -At -c "select count(*) from buecher where titel = 'Zweimal'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Anlegen sicher wiederholbar machen
Zwei Bücher namens Zweimal heißen, dass eine Wiederholung ein Duplikat erzeugte. Wer die id selbst wählt, kann das Anlegen sicher machen. Schicken Sie dieselbe id mit einem Header, der sagt: "Ist sie schon da, aktualisiere sie".
Der erste Aufruf antwortet 201 und der zweite 200. Beide hinterlassen eine Zeile.
Ein sicheres Anlegen zweimal schicken
for i in 1 2; do curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -H "Prefer: resolution=merge-duplicates" -d '{"id":902,"titel":"Einmal","jahr":2020}' "http://api:3000/buecher"; doneHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zeilen mit dieser id zählen
psql -h db -U shop -At -c "select count(*) from buecher where id = 902"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: welche Wiederholungen sicher sind
| Zweimal geschickte Anfrage | Zeilen nach dem zweiten Mal | Sicher wiederholbar? |
|---|---|---|
| PATCH eines Buchs auf verfuegbar false | Dasselbe wie nach dem ersten Mal | Ja, es setzt einen Wert |
| POST eines Buchs ohne id | Eine Zeile mehr als nach dem ersten Mal | Nein, es erzeugt ein Duplikat |
| POST mit id und merge-duplicates | Dasselbe wie nach dem ersten Mal | Ja, die id benennt die Zeile |
| DELETE von Buch 900 | Nach dem ersten weg, danach weiterhin weg | Ja, doch das Lab antwortet beide Male 204 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Testzeilen entfernen
psql -h db -U shop -c "delete from buecher where id >= 900 or titel = 'Zweimal'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele testen nur die gute Anfrage und sehen nie ein Scheitern. Testen Sie, was abgelehnt wird. Räumen Sie auch Ihre eigenen Testzeilen auf. Sonst findet der zweite Lauf die Daten des ersten und scheitert aus einem Grund, der mit der API nichts zu tun hat.