Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Eine HTTP-API testen

Nach dieser Lektion: Ich kann eine API mit guten Anfragen, schlechten Anfragen und Wiederholungen testen und sagen, was jede Prüfung beweist.

Lektion, 60 Min.16 BefehlePostgreSQL-und-PostgREST-Lab: eine Datenbank und eine REST-API im Browser

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

BegriffWas er bedeutet
Testfalleine Anfrage und die Antwort, die Sie erwarten
Erwarteter Statusder Statuscode, mit dem die API antworten soll
TestdatenZeilen, die nur für einen Test angelegt wurden, damit man sie findet und entfernt
Wiederholungdieselbe Anfrage noch einmal schicken, weil die erste Antwort verloren ging
Idempotentzweimal 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

Befehl
export PGPASSWORD=shop

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 Tabelle buecher anlegen

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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"; done

Hier 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

Befehl
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"; done

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 Bücher mit dem Titel Zweimal zählen

Befehl
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

Befehl
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"; done

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 Zeilen mit dieser id zählen

Befehl
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 AnfrageZeilen nach dem zweiten MalSicher wiederholbar?
PATCH eines Buchs auf verfuegbar falseDasselbe wie nach dem ersten MalJa, es setzt einen Wert
POST eines Buchs ohne idEine Zeile mehr als nach dem ersten MalNein, es erzeugt ein Duplikat
POST mit id und merge-duplicatesDasselbe wie nach dem ersten MalJa, die id benennt die Zeile
DELETE von Buch 900Nach dem ersten weg, danach weiterhin wegJa, doch das Lab antwortet beide Male 204

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Testzeilen entfernen

Befehl
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.

Über dieses Lab und seinen Quellcode: PostgreSQL-und-PostgREST-Lab: eine Datenbank und eine REST-API im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.