Čeština

Komplexní průvodce integračním testováním se zaměřením na testování API pomocí Supertestu, který pokrývá nastavení, osvědčené postupy a pokročilé techniky.

Integrační testování: Zvládnutí testování API pomocí Supertestu

V oblasti vývoje softwaru je zásadní zajistit, aby jednotlivé komponenty fungovaly správně izolovaně (jednotkové testování). Stejně důležité je však ověřit, že tyto komponenty bezproblémově spolupracují. Zde přichází na řadu integrační testování. Integrační testování se zaměřuje na ověřování interakce mezi různými moduly nebo službami v rámci aplikace. Tento článek se podrobně zabývá integračním testováním, konkrétně se zaměřením na testování API pomocí Supertestu, výkonné a uživatelsky přívětivé knihovny pro testování HTTP v Node.js.

Co je integrační testování?

Integrační testování je typ testování softwaru, který kombinuje jednotlivé softwarové moduly a testuje je jako skupinu. Jeho cílem je odhalit chyby v interakcích mezi integrovanými jednotkami. Na rozdíl od jednotkového testování, které se zaměřuje na jednotlivé komponenty, integrační testování ověřuje tok dat a řízení mezi moduly. Mezi běžné přístupy k integračnímu testování patří:

V kontextu API zahrnuje integrační testování ověření, že různá API spolu správně fungují, že data předávaná mezi nimi jsou konzistentní a že celkový systém funguje podle očekávání. Představte si například e-commerce aplikaci s oddělenými API pro správu produktů, autentizaci uživatelů a zpracování plateb. Integrační testování by zajistilo, že tato API správně komunikují, což uživatelům umožňuje procházet produkty, bezpečně se přihlašovat a dokončovat nákupy.

Proč je integrační testování API důležité?

Integrační testování API je klíčové z několika důvodů:

Vezměme si globální platformu pro rezervaci cestování. Integrační testování API je prvořadé pro zajištění plynulé komunikace mezi API pro rezervace letů, hotelů a platebními bránami z různých zemí. Nesprávná integrace těchto API by mohla vést k nesprávným rezervacím, selhání plateb a špatné uživatelské zkušenosti, což by negativně ovlivnilo reputaci a příjmy platformy.

Představujeme Supertest: Výkonný nástroj pro testování API

Supertest je abstrakce na vysoké úrovni pro testování HTTP požadavků. Poskytuje pohodlné a plynulé (fluent) API pro odesílání požadavků na vaši aplikaci a ověřování odpovědí. Supertest, postavený na Node.js, je speciálně navržen pro testování HTTP serverů v Node.js. Skvěle spolupracuje s populárními testovacími frameworky jako jsou Jest a Mocha.

Klíčové vlastnosti Supertestu:

Nastavení testovacího prostředí

Než začneme, nastavme si základní testovací prostředí. Předpokládáme, že máte nainstalovaný Node.js a npm (nebo yarn). Jako testovací framework použijeme Jest a pro testování API Supertest.

  1. Vytvořte Node.js projekt:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. Nainstalujte závislosti:
npm install --save-dev jest supertest
npm install express  # Nebo váš preferovaný framework pro vytvoření API
  1. Nakonfigurujte Jest: Přidejte následující do vašeho souboru package.json:
{
  "scripts": {
    "test": "jest"
  }
}
  1. Vytvořte jednoduchý API endpoint: Vytvořte soubor s názvem app.js (nebo podobným) s následujícím kódem:
const express = require('express');
const app = express();
const port = 3000;

app.get('/hello', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

module.exports = app; // Export pro testování

Napsání prvního testu v Supertestu

Nyní, když máme nastavené prostředí, napišme jednoduchý test v Supertestu pro ověření našeho API endpointu. Vytvořte soubor s názvem app.test.js (nebo podobným) v kořenovém adresáři vašeho projektu:

const request = require('supertest');
const app = require('./app');

describe('GET /hello', () => {
  it('responds with 200 OK and returns "Hello, World!"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).toBe(200);
    expect(response.text).toBe('Hello, World!');
  });
});

Vysvětlení:

Pro spuštění testu spusťte v terminálu následující příkaz:

npm test

Pokud je vše správně nastaveno, měli byste vidět, že test prošel.

Pokročilé techniky v Supertestu

Supertest nabízí širokou škálu funkcí pro pokročilé testování API. Prozkoumejme některé z nich.

1. Odesílání těl požadavků

Pro odeslání dat v těle požadavku můžete použít metodu .send(). Vytvořme si například endpoint, který přijímá data ve formátu JSON:

app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  // Simulace vytvoření uživatele v databázi
  const user = { id: Date.now(), name, email };
  res.status(201).json(user);
});

Takto můžete tento endpoint otestovat pomocí Supertestu:

describe('POST /users', () => {
  it('creates a new user', async () => {
    const userData = {
      name: 'John Doe',
      email: 'john.doe@example.com',
    };

    const response = await request(app)
      .post('/users')
      .send(userData)
      .expect(201);

    expect(response.body).toHaveProperty('id');
    expect(response.body.name).toBe(userData.name);
    expect(response.body.email).toBe(userData.email);
  });
});

Vysvětlení:

2. Nastavení hlaviček

Pro nastavení vlastních hlaviček ve vašich požadavcích můžete použít metodu .set(). To je užitečné pro nastavení autentizačních tokenů, typů obsahu nebo jiných vlastních hlaviček.

describe('GET /protected', () => {
  it('requires authentication', async () => {
    const response = await request(app).get('/protected').expect(401);
  });

  it('returns 200 OK with a valid token', async () => {
    // Simulace získání platného tokenu
    const token = 'valid-token';

    const response = await request(app)
      .get('/protected')
      .set('Authorization', `Bearer ${token}`)
      .expect(200);

    expect(response.text).toBe('Protected Resource');
  });
});

Vysvětlení:

3. Práce se soubory cookie

Supertest si také umí poradit se soubory cookie. Můžete nastavit cookies pomocí metody .set('Cookie', ...), nebo můžete použít vlastnost .cookies pro přístup a úpravu cookies.

4. Testování nahrávání souborů

Supertest lze použít k testování API endpointů, které zpracovávají nahrávání souborů. Pro připojení souborů k požadavku můžete použít metodu .attach().

5. Použití knihoven pro ověření (Chai)

Ačkoliv vestavěná knihovna pro ověření v Jestu je v mnoha případech dostačující, můžete se Supertestem použít i výkonnější knihovny jako Chai. Chai poskytuje expresivnější a flexibilnější syntaxi pro ověřování. Chcete-li použít Chai, musíte jej nainstalovat:

npm install --save-dev chai

Poté můžete Chai importovat do svého testovacího souboru a používat jeho ověření:

const request = require('supertest');
const app = require('./app');
const chai = require('chai');
const expect = chai.expect;

describe('GET /hello', () => {
  it('responds with 200 OK and returns "Hello, World!"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).to.equal(200);
    expect(response.text).to.equal('Hello, World!');
  });
});

Poznámka: Možná budete muset nakonfigurovat Jest, aby s Chai správně fungoval. To často zahrnuje přidání konfiguračního souboru, který importuje Chai a nastaví ho pro práci s globálním expect v Jestu.

6. Opakované použití agentů

Pro testy, které vyžadují nastavení specifického prostředí (např. autentizace), je často výhodné znovu použít agenta Supertestu. Tím se vyhnete redundantnímu kódu pro nastavení v každém testovacím případu.

describe('Authenticated API Tests', () => {
  let agent;

  beforeAll(() => {
    agent = request.agent(app); // Vytvoření perzistentního agenta
    // Simulace autentizace
    return agent
      .post('/login')
      .send({ username: 'testuser', password: 'password123' });
  });

  it('can access a protected resource', async () => {
    const response = await agent.get('/protected').expect(200);
    expect(response.text).toBe('Protected Resource');
  });

  it('can perform other actions that require authentication', async () => {
    // Zde proveďte další akce vyžadující autentizaci
  });
});

V tomto příkladu vytvoříme agenta Supertestu v hooku beforeAll a autentizujeme ho. Následné testy v rámci bloku describe mohou poté tohoto autentizovaného agenta znovu použít, aniž by se musely pro každý test znovu autentizovat.

Osvědčené postupy pro integrační testování API pomocí Supertestu

Pro zajištění efektivního integračního testování API zvažte následující osvědčené postupy:

Časté chyby, kterým je třeba se vyhnout

Závěr

Integrační testování API je nezbytnou součástí procesu vývoje softwaru. Pomocí Supertestu můžete snadno psát komplexní a spolehlivé integrační testy API, které pomáhají zajistit kvalitu a stabilitu vaší aplikace. Nezapomeňte se zaměřit na testování end-to-end pracovních postupů, používání realistických dat, izolaci testů a automatizaci testovacího procesu. Dodržováním těchto osvědčených postupů můžete výrazně snížit riziko integračních problémů a dodat robustnější a spolehlivější produkt.

Vzhledem k tomu, že API stále více pohánějí moderní aplikace a architektury mikroslužeb, význam robustního testování API, a zejména integračního testování, bude jen nadále růst. Supertest poskytuje vývojářům po celém světě výkonnou a dostupnou sadu nástrojů pro zajištění spolehlivosti a kvality jejich API interakcí.