Testen von Express-APIs mit Supertest

Einführung

Hallo, ich bin Ilya, ein Full-Stack-Entwickler, der Node.js auf dem Server und Ember.js auf dem Client verwendet. In letzter Zeit hatte ich viel Spaß beim Testen meiner Express-APIs, und ich wollte nur zeigen, wie unterhaltsam und einfach es sein kann. Ich hoffe, Sie genießen das so sehr, wie ich es genossen habe, es zu schreiben!

Einstieg

Für dieses Tutorial beginnen wir mit einem einfachen Äußern API, und wir werden eine Testumgebung einrichten und einige Integrationstests mit unserer API durchführen Supertest und Band. Supertest ist eine Bibliothek, die speziell zum Testen von http-Servern von nodejs erstellt wurde, und Tape ist eine Assertion-Bibliothek, die wir zum Einrichten unserer Teststruktur verwenden werden.

Ich habe eine erstellt Repository auf Github, wo Sie eine voll funktionsfähige Anwendung mit der API und den Tests finden. Dies ist der Code, auf den ich in diesem Tutorial verweisen werde.

Lass uns anfangen! Wir beginnen mit der Installation aller unserer Abhängigkeiten:

npm install --save express
npm install --save-dev supertest tape

Jetzt erstellen wir unsere Projektstruktur, etwa so:

my-project/
  |_ package.json
  |_ index.js
  |_ server/
  | |_index.js 
  |_ test/
     |_ index.js

Dies ist meine Standardprojektstruktur beim Erstellen von Express-Apps. Jetzt schreiben wir diese App!

Unsere API

Beginnen wir mit server/index.js wo wir eine supereinfache API schreiben werden, die mit einigen Benutzerdaten funktioniert.

'use strict';

var express = require('express');
var app = express();
var users = ['John', 'Betty', 'Hal'];

app.get('/api/users', function (req, res) {
  res.json(users);
});

module.exports = app;

Hinweis: Normalerweise rufen Sie eine Datenbank auf, aber für dieses Tutorial verwende ich ein einfaches Fixture.

Nun, falls Sie es bemerken, ich rufe nicht an app.listen(..) überall, das liegt daran Supertest dauert ein app -Objekt und benötigt Ihre App nicht, um auf einem Port zu lauschen. Damit unsere App ausgeführt werden kann, fügen wir etwas Code zu unserer hinzu index.js Datei, die die Hauptdatei ist, die beim Aufruf aufgerufen wird npm start.

'use strict';

var server = require('./server');
var port = process.env.PORT || 3000;

server.listen(port, function () {
  console.log('Server running on port %d', port);
});

Jetzt benötigen wir unsere App von oben, und wir hören sie dort an. Dies gibt uns die Möglichkeit, unseren Server anzufordern und an Supertest zu übergeben. Also, wenn wir jetzt rannten npm start wir sollten so etwas sehen:

Server running on port 3000

**
Hinweis: ** Wenn npm start nichts tut, fügen Sie Ihrer package.json ein Startskript hinzu, siehe hier.

Das ist wunderbar und aufregend, aber woher wissen wir, dass unsere App funktioniert? Nun, wir könnten uns besuchen localhost:3000/api/users und wir sehen die resultierenden Benutzer. Vielleicht gehen Sie voran und versuchen Sie das jetzt, ich werde warten 😃

Sind wir zufrieden?

Ich hoffe, Ihre API hat funktioniert, aber wollen wir das wirklich jedes Mal tun, wenn wir eine Änderung vornehmen? Nein, denn wir müssen Probleme lösen und Apps entwickeln, die diese Probleme lösen.

Hier kommt der Supertest ins Spiel, aber bevor wir das tun können, richten wir unseren ersten Dummy-Test ein, wir werden dies tun test/index.js.

'use strict';

var test = require('tape');

test('First test!', function (t) {
  t.end();
});

Nun, dies ist der einfachste Test, weil er nichts bewirkt! Hier verwenden wir Klebeband, um einen Test zu erstellen, und wir teilen ihm mit, dass der Test abgeschlossen ist. Die API für Band ist sehr einfach und sollte relativ einfach zu verstehen sein.

Wir können diesen Test ausführen, wenn wir unser Testskript in ändern package.json zu node testdie laufen wird test/index.js mit Knoten. Also jetzt, wenn wir laufen npm testsehen wir so etwas wie:

TAP version 13
# First test!

1..0
# tests 0
# pass  0

# ok

Das sieht ungefähr richtig aus und unser Test hat bestanden, aber es ist irgendwie hässlich und unlesbar. Damit können wir aufpeppen npm install --save-dev tap-spec und durch Ändern unseres Testskripts in node test | tap-spec.

Probier es aus

Nachdem wir nun einen Test ausführen können, richten wir den API-Test ein. Dazu fügen wir supertest hinzu und importieren unsere App.

var request = require('supertest');
var app = require('../server');

Das ist alles, was wir brauchen, bevor wir unseren Test schreiben.

test('Correct users returned', function (t) {
  request(app)
    .get('/api/users')
    .expect('Content-Type', /json/)
    .expect(200)
    .end(function (err, res) {
      t.end();
    });
}); 

Wenn wir diesen Test so wie er ist ausführen, sollten wir ein bestandenes Ergebnis haben (obwohl Sie sehen werden, dass es 0 von 0 Tests ist, da wir nichts mit Band bestätigt haben), und das ist gut, weil wir nur von diesem Code ausgehen wissen, dass unsere Anfrage erfolgreich war 200 Statuscode, und wir bekommen json zurück, genau wie erwartet, seit wir es verwendet haben res.json.

Mal sehen, ob unser Ergebnis wie erwartet ist. Dazu prüfen wir, ob unsere Benutzer die richtigen Benutzer sind. Wir tun dies innerhalb des Rückrufs, an den wir übergeben haben enddie als Fehler oder unsere Antwort zurückgegeben wird.

'use strict';

var test = require('tape');
var request = require('supertest');
var app = require('../server');

test('Correct users returned', function (t) {
  request(app)
    .get('/api/users')
    .expect('Content-Type', /json/)
    .expect(200)
    .end(function (err, res) {
      var expectedUsers = ['John', 'Betty', 'Hal'];

      t.error(err, 'No error');
      t.same(res.body, expectedUsers, 'Users as expected');
      t.end();
    });
});

Jetzt kommen wir irgendwo hin!

Wir haben jetzt zwei Behauptungen des Ergebnisses, das wir haben. Zuerst testen wir, dass kein Fehler vorliegt, indem wir verwenden t.error(). Anschließend bestätigen wir, dass unsere Benutzer tatsächlich Recht haben; dafür verwenden wir t.same()und wir vergleichen das Ergebnis, das in gespeichert ist res.bodywie erwartet.

Wir sollten jetzt Folgendes sehen, wenn wir laufen npm test:

Correct users returned

    ✓ No error
    ✓ Users as expected



  total:     2
  passing:   2
  duration:  135ms

  All tests pass!

Herzlichen Glückwunsch, Sie haben Ihren ersten API-Test geschrieben!

Von hier aus können Sie kreativ werden und Express-Router und Middleware (mit ein wenig Bootstrapping) testen und daran denken, die zu besuchen Superagent Dokumentation, da Sie diese Methoden mit Supertest verwenden können (Supertest basiert auf Superagent).

Der vollständige Code befindet sich in der Test-Express-API Repository.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *