Hrvatski

Sveobuhvatan vodič za integracijsko testiranje s naglaskom na testiranje API-ja pomoću Supertesta, pokrivajući postavljanje, najbolje prakse i napredne tehnike.

Integracijsko testiranje: Ovladavanje testiranjem API-ja pomoću Supertesta

U svijetu razvoja softvera, osiguravanje ispravnog funkcioniranja pojedinačnih komponenti u izolaciji (jedinično testiranje) je ključno. Međutim, jednako je važno provjeriti rade li te komponente besprijekorno zajedno. Tu na scenu stupa integracijsko testiranje. Integracijsko testiranje fokusira se na provjeru interakcije između različitih modula ili servisa unutar aplikacije. Ovaj članak duboko uranja u integracijsko testiranje, s posebnim naglaskom na testiranje API-ja pomoću Supertesta, moćne i jednostavne biblioteke za testiranje HTTP tvrdnji u Node.js-u.

Što je integracijsko testiranje?

Integracijsko testiranje je vrsta testiranja softvera koja kombinira pojedinačne softverske module i testira ih kao grupu. Cilj mu je otkriti nedostatke u interakcijama između integriranih jedinica. Za razliku od jediničnog testiranja, koje se fokusira na pojedinačne komponente, integracijsko testiranje provjerava protok podataka i kontrolni tok između modula. Uobičajeni pristupi integracijskom testiranju uključuju:

U kontekstu API-ja, integracijsko testiranje uključuje provjeru ispravnog zajedničkog rada različitih API-ja, provjeru dosljednosti podataka koji se prenose između njih te provjeru funkcionira li cjelokupni sustav kako se očekuje. Na primjer, zamislite aplikaciju za e-trgovinu s odvojenim API-jima za upravljanje proizvodima, autentifikaciju korisnika i obradu plaćanja. Integracijsko testiranje osiguralo bi ispravnu komunikaciju tih API-ja, omogućujući korisnicima pregledavanje proizvoda, sigurnu prijavu i dovršetak kupnje.

Zašto je integracijsko testiranje API-ja važno?

Integracijsko testiranje API-ja ključno je iz nekoliko razloga:

Uzmimo za primjer globalnu platformu za rezervaciju putovanja. Integracijsko testiranje API-ja je od presudne važnosti kako bi se osigurala nesmetana komunikacija između API-ja koji obrađuju rezervacije letova, hotelske rezervacije i pristupnike za plaćanje iz različitih zemalja. Neuspješna integracija ovih API-ja mogla bi dovesti do netočnih rezervacija, neuspjeha plaćanja i lošeg korisničkog iskustva, što negativno utječe na ugled i prihod platforme.

Predstavljamo Supertest: Moćan alat za testiranje API-ja

Supertest je apstrakcija visoke razine za testiranje HTTP zahtjeva. Pruža praktičan i tečan API za slanje zahtjeva vašoj aplikaciji i postavljanje tvrdnji o odgovorima. Izgrađen na vrhu Node.js-a, Supertest je posebno dizajniran za testiranje Node.js HTTP poslužitelja. Izvanredno dobro radi s popularnim okvirima za testiranje kao što su Jest i Mocha.

Ključne značajke Supertesta:

Postavljanje testnog okruženja

Prije nego što počnemo, postavimo osnovno testno okruženje. Pretpostavit ćemo da imate instaliran Node.js i npm (ili yarn). Koristit ćemo Jest kao naš okvir za testiranje i Supertest za testiranje API-ja.

  1. Kreirajte Node.js projekt:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. Instalirajte ovisnosti:
npm install --save-dev jest supertest
npm install express  # Ili vaš preferirani okvir za izradu API-ja
  1. Konfigurirajte Jest: Dodajte sljedeće u svoju package.json datoteku:
{
  "scripts": {
    "test": "jest"
  }
}
  1. Kreirajte jednostavnu API krajnju točku (endpoint): Kreirajte datoteku pod nazivom app.js (ili slično) sa sljedećim kodom:
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; // Izvoz za potrebe testiranja

Pisanje prvog Supertest testa

Sada kada smo postavili okruženje, napišimo jednostavan Supertest test kako bismo provjerili našu API krajnju točku. Kreirajte datoteku pod nazivom app.test.js (ili slično) u korijenu vašeg projekta:

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

describe('GET /hello', () => {
  it('odgovara sa 200 OK i vraća \"Hello, World!\"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).toBe(200);
    expect(response.text).toBe('Hello, World!');
  });
});

Objašnjenje:

Da biste pokrenuli test, izvršite sljedeću naredbu u svom terminalu:

npm test

Ako je sve ispravno postavljeno, trebali biste vidjeti da test prolazi.

Napredne tehnike u Supertestu

Supertest nudi širok raspon značajki za napredno testiranje API-ja. Istražimo neke od njih.

1. Slanje tijela zahtjeva

Za slanje podataka u tijelu zahtjeva, možete koristiti metodu .send(). Na primjer, kreirajmo krajnju točku koja prihvaća JSON podatke:

app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  // Simulacija stvaranja korisnika u bazi podataka
  const user = { id: Date.now(), name, email };
  res.status(201).json(user);
});

Evo kako možete testirati ovu krajnju točku koristeći Supertest:

describe('POST /users', () => {
  it('stvara novog korisnika', 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);
  });
});

Objašnjenje:

2. Postavljanje zaglavlja

Za postavljanje prilagođenih zaglavlja u vašim zahtjevima, možete koristiti metodu .set(). Ovo je korisno za postavljanje autentifikacijskih tokena, vrsta sadržaja ili drugih prilagođenih zaglavlja.

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

  it('vraća 200 OK s važećim tokenom', async () => {
    // Simulacija dobivanja važećeg tokena
    const token = 'valid-token';

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

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

Objašnjenje:

3. Rukovanje kolačićima (Cookies)

Supertest također može rukovati kolačićima. Možete postaviti kolačiće koristeći metodu .set('Cookie', ...), ili možete koristiti svojstvo .cookies za pristup i izmjenu kolačića.

4. Testiranje prijenosa datoteka

Supertest se može koristiti za testiranje API krajnjih točaka koje obrađuju prijenos datoteka. Možete koristiti metodu .attach() za prilaganje datoteka zahtjevu.

5. Korištenje biblioteka za tvrdnje (Chai)

Iako je ugrađena biblioteka za tvrdnje u Jestu dovoljna za mnoge slučajeve, možete koristiti i moćnije biblioteke za tvrdnje poput Chaija sa Supertestom. Chai pruža izražajniju i fleksibilniju sintaksu za tvrdnje. Da biste koristili Chai, trebate ga instalirati:

npm install --save-dev chai

Zatim možete uvesti Chai u svoju testnu datoteku i koristiti njegove tvrdnje:

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

describe('GET /hello', () => {
  it('odgovara sa 200 OK i vraća \"Hello, World!\"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).to.equal(200);
    expect(response.text).to.equal('Hello, World!');
  });
});

Napomena: Možda ćete trebati konfigurirati Jest da ispravno radi s Chaijem. To često uključuje dodavanje datoteke za postavljanje koja uvozi Chai i konfigurira ga da radi s Jestovim globalnim expect.

6. Ponovno korištenje agenata

Za testove koji zahtijevaju postavljanje specifičnog okruženja (npr. autentifikacija), često je korisno ponovno koristiti Supertest agenta. Time se izbjegava suvišan kod za postavljanje u svakom testnom slučaju.

describe('Testovi autentificiranog API-ja', () => {
  let agent;

  beforeAll(() => {
    agent = request.agent(app); // Kreiranje postojanog agenta
    // Simulacija autentifikacije
    return agent
      .post('/login')
      .send({ username: 'testuser', password: 'password123' });
  });

  it('može pristupiti zaštićenom resursu', async () => {
    const response = await agent.get('/protected').expect(200);
    expect(response.text).toBe('Protected Resource');
  });

  it('može izvršiti druge radnje koje zahtijevaju autentifikaciju', async () => {
    // Ovdje izvršite druge autentificirane radnje
  });
});

U ovom primjeru, kreiramo Supertest agenta u beforeAll kuki i autentificiramo agenta. Sljedeći testovi unutar describe bloka mogu zatim ponovno koristiti ovog autentificiranog agenta bez potrebe za ponovnom autentifikacijom za svaki test.

Najbolje prakse za integracijsko testiranje API-ja pomoću Supertesta

Kako biste osigurali učinkovito integracijsko testiranje API-ja, razmotrite sljedeće najbolje prakse:

Uobičajene pogreške koje treba izbjegavati

Zaključak

Integracijsko testiranje API-ja ključan je dio procesa razvoja softvera. Korištenjem Supertesta možete jednostavno pisati sveobuhvatne i pouzdane testove integracije API-ja koji pomažu osigurati kvalitetu i stabilnost vaše aplikacije. Ne zaboravite se usredotočiti na testiranje cjelovitih radnih procesa, korištenje realnih podataka, izoliranje testova i automatizaciju procesa testiranja. Slijedeći ove najbolje prakse, možete značajno smanjiti rizik od problema s integracijom i isporučiti robusniji i pouzdaniji proizvod.

Kako API-ji nastavljaju pokretati moderne aplikacije i arhitekture mikroservisa, važnost robusnog testiranja API-ja, a posebno integracijskog testiranja, samo će rasti. Supertest pruža moćan i pristupačan skup alata za programere diljem svijeta kako bi osigurali pouzdanost i kvalitetu svojih API interakcija.