Testování vašeho Backend serveru Express.js

Nedávno jsem se učil o Node a sestavoval backend API server s Express. Express.js umožňuje použití vzoru MVC podobně jako Ruby on Rails pro vytváření RESTful CRUD API (pro mě je to dobrý přechod na učení). Zatímco jsem se učil, jak implementovat všechny části CRUD pomocí Express, chtěl jsem otestovat funkčnost, abych ověřil, že věci fungují správně. Tento blogový příspěvek vysvětlí, jak otestovat funkčnost CRUD tras ve vašem Express backend API s použitím rámce Jest a knihovny SuperTest.

Express Server

Předpokládám, že máte pro tento článek spuštěný Express server, ale níže je jednoduchá ukázková aplikace pro spuštění testů v tomto článku (níže budu sdílet některé další články o budování serveru Express). V níže uvedeném kódu najdete dva příklady GET koncové body, spolu s nějakým ukázkovým kódem, který vám poskytne představu o tom, jak by vaše trasa mohla ve SKUTEČNOSTI vypadat, až bude dále sestavena.

// server.js
import express from 'express';
const app = express();

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

  // Real code from my application below
  //  model.User.findAll().then (users => {
  //        res.status(200).json({ users });
  //     }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //  })
});

app.get('/users/3', function(req, res) {
  res.json({ user: 'user3' });

  // Real code from my application below
  // const { id } = req.params;
  //    model.User.findOne({
  //        where: { id: Number(id) }
  //    }).then(user=>{
  //        res.status(200).json({ user });
  //    }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //    })
});

export const server = app;

Při pohledu na výše uvedené trasy vidíme dvě GET požadavky:jeden pro VŠECHNY uživatele a jeden pro SELECT uživatele. Naše testy ověří, že každý GET požadavek vrátí stavový kód 200 , mají json content type a zahrňte vlastnost, kterou chceme vidět vrácenou (například users nebo user3 ).

Nastavení Jest &SuperTest

V první řadě musíme nastavit testovací prostředí. Níže jsou uvedeny kroky ke spuštění Jest a SuperTest.

1. Instalace našich závislostí
npm install jest --save-dev
npm install supertest --save-dev
npm install cross-env --save-dev
2. Nastavení testovacího prostředí

Pro nastavení testovacího prostředí musíme upravit package.json složky ve vaší aplikaci Express. Následující nastavení vám umožní spustit npm test v CLI, které provede reset testovací databáze, migraci a osazení vaší databáze pokaždé za účelem přesného testování.

  • Poznámka NODE_ENV=test se používá ke specifikaci testovacího prostředí.
// package.json
 "scripts": {
    ...
    "test": "cross-env NODE_ENV=test jest --testTimeout=10000",
    "pretest": "cross-env NODE_ENV=test npm run migrate:reset",
    "migrate:reset": "npx sequelize-cli db:migrate:undo:all && npm run migrate",
    "migrate": "npx sequelize-cli db:migrate && npx sequelize-cli db:seed:all",
  }

Potřebujeme, aby Jest ignoroval našich ./node_modules složku, takže musíme také přidat tento fragment kódu do package.json :

...
 "jest": {
    "testEnvironment": "node",
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ]
  },
...

OK, nyní zkuste spustit test s npm test v příkazovém řádku. Nyní, když máme naše testovací prostředí v provozu, měli bychom být schopni začít psát naše testy!

Psaní testů

Budeme pracovat v novém test.js a naším cílem je otestovat funkčnost dvou GET výše uvedené požadavky:
/users a /users/3 .

Importovat

Nejprve musíme importovat nějaké závislosti, abychom mohli otestovat náš Express server. Ty jsou v horní části našeho test.js soubor.

//test.js

const server = require('../index.js');
const supertest = require('supertest');
const requestWithSupertest = supertest(server);

Všimnete si, že používáme requestWithSupertest , která spojuje každý test se serverem.

Získejte všechny uživatele

První věc, kterou potřebujeme, je naše počáteční describe blok, ve kterém budou umístěny OBĚ naše testy. V tomto testu budeme kontrolovat, jak /user Funkce GET trasy.

describe('User Endpoints', () => {

  it('GET /user should show all users', async () => {
    const res = await requestWithSupertest.get('/users');
      expect(res.status).toEqual(200);
      expect(res.type).toEqual(expect.stringContaining('json'));
      expect(res.body).toHaveProperty('users')
  });

});

V kódu výše si všimnete, že jsme přidali await na requestWithSupertest.get('/users') , protože testujeme slib, který je třeba splnit, než se pohneme vpřed. Poté očekáváme, že uvidíme 200 stav, json typ obsahu a pro tělo odpovědi musí mít users vlastnictví. Tato tři očekávání splňují to, co jsme chtěli otestovat ve funkčnosti této trasy.

Získejte uživatele podle ID

Tak a máme napsaný první test. Nyní pro druhý test provedeme podobný test, tentokrát zaměřený na /users/3 trasa. Tento test má ukázat, jak můžete otestovat cestu GET cílového ID uživatele. Tento test bude také umístěn do stejného describe blok, který jsme definovali výše.

  it('GET /user/:id should show a user', async () => {
        const res = await requestWithSupertest.get('/users/3')
        expect(res.statusCode).toEqual(200)
        expect(res.body).toHaveProperty('user3')
    });
Spusťte testy

Úžasný! Napsali jsme dva testy, abychom ověřili funkčnost našich dvou ukázkových GET trasy. Nyní spusťte testy v příkazovém řádku:

npm test

V naší testovací sadě byste měli vidět dva úspěšné testy!

Závěr

Nyní máte prostředky k přidání testování do vašeho Express API! Doufejme, že výše uvedené příklady vám pomohou získat počáteční pochopení toho, jak nastavit a otestovat funkčnost vašeho Express serveru! Chtěl jsem rozšířit své znalosti o testování požadavků Express backend API, a takto jsem nastavil testy ve své vlastní aplikaci!

Některé další zdroje, které jsem použil, abych se naučil Express.js a jak testovat server, zahrnují
Příklad Node.js Rest API s Express, Sequelize a MySQL od bezkoder
Vytváření expresního API pomocí Sequelize CLI a Unit Testing! od Bruna Galvaa
Jak otestovat backend Express.js pomocí Jest a Supertest od Coderslang
Hopscotch.io – nástroj pro odesílání požadavků serveru a zobrazení odpovědí

Pomohl vám tento článek začít s testováním vašeho Express serveru? Odpovězte komentáři nebo doporučeními!