Moderne Software wäre ohne HTTP-APIs nicht möglich. In einer Microservice-Architektur verbinden sie Front-End- und Back-End-Komponenten oder verschiedene Back-End-Komponenten. Entwickler verlassen sich auch auf APIs von Drittanbietern für wesentliche Produktfunktionen wie Zahlung und Kommunikation. Jede API ist ein Vertrag, den beide Seiten buchstabengetreu befolgen müssen, um in Verbindung zu bleiben. Im Fall von APIs bedeutet das, dass Statuscodes, Header und Antworttexte immer mit der API-Dokumentation übereinstimmen müssen. Für einen API-Anbieter sind Funktionstests von entscheidender Bedeutung, um sicherzustellen, dass er dauerhaft das halten kann, was er verspricht. Sogar API-Konsumenten entscheiden sich möglicherweise dafür, Tests für APIs von Drittanbietern durchzuführen. Unabhängig davon, ob Sie interne oder externe APIs testen möchten, benötigen Sie gute Tools. In diesem Artikel wird SuperTest vorgestellt, eine Node.js-Testbibliothek für HTTP-APIs. Wir besprechen die Bibliothek im Allgemeinen und geben Ihnen dann Schritt-für-Schritt-Anleitungen für die Erstellung Ihres ersten API-Tests.
Was ist SuperTest?
SuperTestist einNode.jsBibliothek, die Entwicklern beim Testen von APIs hilft. Es erweitert eine weitere Bibliothek namens Superagent, einen JavaScript-HTTP-Client für Node.js und den Browser. Entwickler können SuperTest als eigenständige Bibliothek oder mit JavaScript-Test-Frameworks wie Mocha oder verwendenIst.
Erweitern Sie Ihre Testabdeckung
Schnelle und flexible Erstellung von KI-gestützten End-to-End-Tests – skalierbar.
Erste Schritte mit SuperTest
SuperTest ist erhältlich beiNPM. Sie können es installieren, indem Sie den folgenden Befehl in Ihre Konsole eingeben:
npm install supertest --save-dev
In Ihrem JavaScript-Code können Sie mit diesem Code ein Anforderungsobjekt von SuperTest abrufen:
const request = require('supertest');
Wenn Sie eine Anfrage stellen, können Sie diese auf zwei verschiedene Arten initialisieren. Sie können eine externe API oder eine interne API testen, die bereits bereitgestellt und ausgeführt wird (zumindest in einer Staging-Umgebung), indem Sie die URL als Parameter angeben. Hier ist ein Beispiel für eine externe API-Anfrage. Wir nutzen die ÖffentlichkeitHunde-APIdas Open-Source-Bilder von Hunden bietet. Es handelt sich um eine einfache API, die keine Registrierung erfordert und sich daher perfekt für Demonstrationen der Verwendung externer APIs eignet:
const request = require('supertest');request('https://dog.ceo') .get('/api/breeds/image/random') .end(function(err, res) { if (err) throw err; console.log(res.body); });
Dererhalten()Die Methode teilt SuperTest mit, dass wir das HTTP-GET-Verb verwenden. Sie können zusätzliche Methoden in den Aufruf einbinden, um die Authentifizierung, benutzerdefinierte HTTP-Header oder -Texte usw. festzulegen. Dies ist für dieses Beispiel jedoch nicht erforderlich. DerEnde()Die Methode schließt die Anfrage ab und ruft den API-Server auf. Als Parameter benötigt es eine Callback-Funktion zur Verarbeitung der Antwort.
Wie wäre es mit der anderen Möglichkeit, Ihre Anfrage zu initialisieren? Sie können das App-Objekt auch übergeben, wenn Sie Ihre API mit einem Node.js-Framework wie Express erstellt haben. Im letzteren Fall startet SuperTest bei Bedarf einen Testserver und sendet dort automatisch Anfragen. Hier ist ein Beispiel für die Erstellung einer Express-App mit einem Endpunkt (inspiriert von der Dog-API) und die anschließende Anforderung desselben Endpunkts:
const request = require('supertest');const app = require('express')();app.get('/api/breeds/image/random', function(req, res) { res.status(200) .json({ message : 'https://example.com/', status : 'success' });});request(app) .get('/api/breeds/image/random') .end(function (err, res) { if (err) throw err; console.log(res.body); });
Abgesehen von den Parametern fürAnfrage(), der Rest des Codes ist derselbe. Im weiteren Verlauf dieses Artikels demonstrieren wir SuperTest mit der Dog API. Sie können diese Tests später für Ihre APIs anpassen.
Reaktionserwartungen festlegen
Im vorherigen Abschnitt haben Sie gesehen, wie Sie eine HTTP-Anfrage erstellen. Bisher haben Sie jedoch nur die geerbte Superagent-Funktionalität verwendet. Eine HTTP-Anfrage zu stellen ist noch nicht dasselbe wie sie zu testen. Sie müssen Ihre Erwartungen an einen funktionalen API-Test festlegen und bestätigen, dass die API wie erwartet reagiert. Um dies zu überprüfen, erweitert SuperTest Superagent mit demerwarten()Methode. Mit dieser vielseitigen Methode können Sie verschiedene Aspekte der API-Antwort testen.
HTTP-APIs geben verschiedene Statuscodes zurück. Codes im Bereich 4xx weisen auf Clientfehler hin, und Codes im Bereich 5xx weisen auf Serverfehler hin. Für eine erfolgreiche API-Anfrage erwarten Sie im Allgemeinen 200. Manchmal sind es stattdessen 201 oder 204 (diese Informationen finden Sie in der API-Dokumentation). Erweitern wir unsere Testanfrage mit der Erwartung, dass sie 200 zurückgibt:
request('https://dog.ceo') .get('/api/breeds/image/random') .expect(200) .end(function(err, res) { if (err) throw err; }) ;
Wie du sehen kannst,erwarten()Anrufe kommen immer vorherEnde().
Die meisten modernen HTTP-APIs geben JSON-Antworten zurück. Die Dog-API ist keine Ausnahme. Für diese Antworten ist der Wert derInhaltstypHeader sollte seinapplication/json. Fügen wir eine weitere Erwartung hinzu:
request('https://dog.ceo') .get('/api/breeds/image/random') .expect(200) .expect('Content-Type', 'application/json') .end(function (err, res) { if (err) throw err; });
Der obige Code sollte erfolgreich ausgeführt werden, ohne Ausnahmen auszulösen. Du kannst es versuchenerwarten()etwas anderes, um zu sehen, wie der Test fehlschlägt.
Überprüfen der Antwortkörper
Ein häufiger Fehler bei funktionalen API-Tests besteht darin, dass Entwickler nur nach HTTP-Statuscodes und -Headern suchen. Solche oberflächlichen Tests werden als Rauchtests bezeichnet. Es hilft dabei, die Mindesterwartungen festzulegen, dass die API aktiv ist und überhaupt antwortet, aber es ist auch wichtig, nach Antwortkörpern zu suchen. API-Konsumenten erwarten bestimmte Eigenschaften im JSON-Objekt, daher sollten diese vorhanden sein. Die Dog-API gibt eine Nachricht und eine Statuseigenschaft zurück. Überprüfen wir also, ob diese vorhanden sind:
request('https://dog.ceo') .get('/api/breeds/image/random') .expect(200) .expect('Content-Type', 'application/json') .expect(function (res) { if (!res.body.hasOwnProperty('status')) throw new Error("Expected 'status' key!"); if (!res.body.hasOwnProperty('message')) throw new Error( "Erwarteter 'Nachrichten'-Schlüssel!"); }) .end(function(err, res) { if (err) throw err; });
Wie Sie sehen, können wir anrufenerwarten()mit einer Callback-Funktion und schreiben Sie Code, der die Antwort prüft. Dies ist der einzige Ansatz zur Analyse einer JSON-Antwort. Allerdings sieht es etwas langatmig aus. Eine Möglichkeit, diesen Code zu verbessern, ist die Verwendung vonbehaupten()Funktion. Sie müssen eine „require“-Anweisung hinzufügen, um Assert zu verwenden, aber Sie müssen nichts installieren, da dies der Fall istein in Node.js integriertes Modul.
const request = require('supertest');const Assert = require('assert');request('https://dog.ceo') .get('/api/breeds/image/random') .expect(200 ). ); }) .end(function(err, res) { if (err) throw err; });
Natürlich können Sie auch andere Assertionsbibliotheken verwenden, zChai.js. Es gibt auch verschiedene Möglichkeiten, in SuperTest integrierte Antworttexte zu überprüfen. Sie können eine Zeichenfolge oder einen regulären Ausdruck an übergebenerwarten()Methode. Eine Zeichenfolge muss mit dem gesamten Text übereinstimmen, während Sie einen regulären Ausdruck verwenden können, um Teile davon zu überprüfen. Hier ist ein weiteres Beispiel:
request('https://dog.ceo') .get('/api/breeds/image/random') .expect(200) .expect('Content-Type', 'application/json') .expect(/ {"message":.*, "status": "success"}/) .end(function(err, res) { if (err) throw err; });
Kombination von SuperTest und Mokka
Sie können SuperTest-Code darin schreibenMokkaTestrahmen. Sie können verwendenbeschreiben()UndEs()um Ihre Tests zu strukturieren. Wenn Sie schon einmal Mokka verwendet haben, sollten Sie mit diesen Methoden vertraut sein. Dann, drinnenEs()verwenden Sie denselben Anforderungscode, den wir zuvor besprochen haben. Es gibt nur einen spezifischen Unterschied: Sie müssen das fallen lassenEnde(). Fügen Sie stattdessen Mokka hinzuErledigtbis zum letztenerwarten()als zusätzlichen Parameter aufrufen. Hier ist ein Beispiel:
beschreiben('Zufälliges Hundebild', function() { it('antwortet mit der erwarteten JSON-Struktur', function(done) { request('https://dog.ceo') .get('/api/breeds/image/ random') .expect(200) .expect('Content-Type', 'application/json') .expect(/{"message":".*","status":"success"}/, done); });});
Entwerfen von Funktionstests
Nachdem Sie nun die Grundlagen des Testens von APIs kennen, lassen Sie uns kurz darüber sprechen, was Sie testen sollten. Bei internen APIs sollten Sie immer alle Endpunkte testen, die Sie verfügbar machen. Wie wir es in den obigen Beispielen getan haben, können Sie schreiben: „Unit-Tests” für einen Endpunkt. Sie können auch mehrere API-Aufrufe verketten, um Workflows mit zahlreichen API-Aufrufen zu testen. Es ist auch eine gute Idee, nicht nur den „glücklichen Weg“ auszuprobieren, sondern auch einige nicht vorhandene Endpunkte anzurufen oder ungültige Daten zu sendenerwarten()die gewünschte Fehlermeldung. Bei externen APIs können Sie alle von Ihnen genutzten Endpunkte testen, um sicherzustellen, dass Sie sich auf sie verlassen können.
Zusammenfassung
Dieser Artikel soll Ihnen den Einstieg in Ihren ersten API-Test mit SuperTest erleichtern, erhebt jedoch keinen Anspruch auf Vollständigkeit. Hier sind einige weitere Ressourcen aus dem Internet, die Sie nutzen können, um mehr zu erfahren:
- Kinderleichte API-Tests mit SuperTest, Mocha und Chai
- API-Tests mit Jest und SuperTest
- So testen Sie Ihre Express-API mit SuperTest
- API-Tests mit SuperTest
API-Tests sind ein Teil davoneine vollständige Teststrategie. Neben API-Tests sollten Sie End-to-End-Tests durchführen, die die Benutzeroberfläche Ihrer Anwendung und die jeweiligen APIs einbeziehen. Mit Testim verfügen Sie über eine komplette Plattform für End-to-End-Tests sowohl in Ihrem Browser als auch in der CloudTestim bietet die Möglichkeit, API-Tests als Teil Ihrer UI-Tests auszuführen.
Was Sie als nächstes lesen sollten
API-Tests: Ein Entwickler-Tutorial und ein vollständiger Leitfaden
Die 10 API-Testtools, ohne die Sie im Jahr 2021 nicht leben können
FAQs
What is supertest in API testing? ›
Supertest is a Node. js library that allows developers and testers to test the APIs. It enables developers and testers to write automated tests for routes and endpoints. Supertest can be used as a standalone library or with testing frameworks like Mocha and Jest.
Does testim support API testing? ›Testim allows you to create API tests with an easy-to-use graphical interface that can be automated. You can even run additional JavaScript code after an API call to validate the response or use the returned data for later tests.
What library does supertest make use of to perform requests? ›What Is SuperTest? SuperTest is a Node. js library that helps developers test APIs. It extends another library called superagent, a JavaScript HTTP client for Node.
How to easily test API? ›- Understand API requirements. ...
- Specify the API output status. ...
- Focus on small functional APIs. ...
- Organize API endpoints. ...
- Leverage automation capability for API testing. ...
- Choose a suitable automation tool. ...
- Choose suitable verification methods.