Slovenščina

Celovit vodnik po integracijskem testiranju z osredotočenostjo na testiranje API-jev s Supertestom, ki zajema nastavitev, najboljše prakse in napredne tehnike za robustno testiranje aplikacij.

Integracijsko testiranje: obvladovanje testiranja API-jev s Supertestom

Na področju razvoja programske opreme je ključnega pomena zagotoviti, da posamezne komponente delujejo pravilno v osami (enotno testiranje). Vendar je enako pomembno preveriti, ali te komponente brezhibno delujejo skupaj. Tu nastopi integracijsko testiranje. Integracijsko testiranje se osredotoča na preverjanje interakcije med različnimi moduli ali storitvami znotraj aplikacije. Ta članek se poglobi v integracijsko testiranje, s posebnim poudarkom na testiranju API-jev s Supertestom, zmogljivo in uporabniku prijazno knjižnico za testiranje HTTP trditev v Node.js.

Kaj je integracijsko testiranje?

Integracijsko testiranje je vrsta testiranja programske opreme, ki združuje posamezne module programske opreme in jih testira kot skupino. Njegov cilj je odkriti napake v interakcijah med integriranimi enotami. Za razliko od enotnega testiranja, ki se osredotoča na posamezne komponente, integracijsko testiranje preverja pretok podatkov in nadzora med moduli. Pogosti pristopi k integracijskemu testiranju vključujejo:

V kontekstu API-jev integracijsko testiranje vključuje preverjanje, ali različni API-ji pravilno delujejo skupaj, ali so podatki, ki se prenašajo med njimi, skladni in ali celoten sistem deluje, kot je pričakovano. Predstavljajte si na primer aplikacijo za e-trgovino z ločenimi API-ji za upravljanje izdelkov, avtentikacijo uporabnikov in obdelavo plačil. Integracijsko testiranje bi zagotovilo, da ti API-ji pravilno komunicirajo, kar uporabnikom omogoča brskanje po izdelkih, varno prijavo in dokončanje nakupov.

Zakaj je integracijsko testiranje API-jev pomembno?

Integracijsko testiranje API-jev je ključnega pomena iz več razlogov:

Razmislite o globalni platformi za rezervacije potovanj. Integracijsko testiranje API-jev je ključnega pomena za zagotavljanje nemotene komunikacije med API-ji, ki obravnavajo rezervacije letov, hotelske rezervacije in plačilne prehode iz različnih držav. Neuspešna integracija teh API-jev bi lahko povzročila napačne rezervacije, neuspešna plačila in slabo uporabniško izkušnjo, kar bi negativno vplivalo na ugled in prihodke platforme.

Predstavljamo Supertest: zmogljivo orodje za testiranje API-jev

Supertest je visokonivojska abstrakcija za testiranje HTTP zahtevkov. Zagotavlja priročen in tekoč API za pošiljanje zahtevkov vaši aplikaciji in preverjanje odgovorov. Supertest, zgrajen na vrhu Node.js, je posebej zasnovan za testiranje HTTP strežnikov Node.js. Izjemno dobro deluje s priljubljenimi testnimi ogrodji, kot sta Jest in Mocha.

Ključne značilnosti Supertesta:

Nastavitev testnega okolja

Preden začnemo, nastavimo osnovno testno okolje. Predvidevali bomo, da imate nameščen Node.js in npm (ali yarn). Kot testno ogrodje bomo uporabili Jest, za testiranje API-jev pa Supertest.

  1. Ustvarite Node.js projekt:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. Namestite odvisnosti:
npm install --save-dev jest supertest
npm install express  # Ali vaše priljubljeno ogrodje za ustvarjanje API-ja
  1. Konfigurirajte Jest: V datoteko package.json dodajte naslednje:
{
  "scripts": {
    "test": "jest"
  }
}
  1. Ustvarite preprosto končno točko API-ja: Ustvarite datoteko z imenom app.js (ali podobno) z naslednjo kodo:
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 testiranje

Pisanje prvega Supertest testa

Zdaj, ko imamo nastavljeno okolje, napišimo preprost Supertest test za preverjanje naše končne točke API-ja. V korenski mapi projekta ustvarite datoteko z imenom app.test.js (ali podobno):

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!');
  });
});

Razlaga:

Za zagon testa v terminalu zaženite naslednji ukaz:

npm test

Če je vse pravilno nastavljeno, bi morali videti, da je test uspešno opravljen.

Napredne tehnike Supertesta

Supertest ponuja širok nabor funkcij za napredno testiranje API-jev. Raziščimo nekatere izmed njih.

1. Pošiljanje teles zahtevkov

Za pošiljanje podatkov v telesu zahtevka lahko uporabite metodo .send(). Na primer, ustvarimo končno točko, ki sprejema JSON podatke:

app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  // Simulacija ustvarjanja uporabnika v bazi podatkov
  const user = { id: Date.now(), name, email };
  res.status(201).json(user);
});

Tako lahko testirate to končno točko s Supertestom:

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);
  });
});

Razlaga:

2. Nastavljanje glav

Za nastavitev glav po meri v vaših zahtevkih lahko uporabite metodo .set(). To je uporabno za nastavljanje avtentikacijskih žetonov, vrst vsebine ali drugih glav po meri.

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 () => {
    // Simulacija pridobivanja veljavnega žetona
    const token = 'valid-token';

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

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

Razlaga:

3. Upravljanje piškotkov

Supertest lahko upravlja tudi piškotke. Piškotke lahko nastavite z metodo .set('Cookie', ...) ali pa uporabite lastnost .cookies za dostop in spreminjanje piškotkov.

4. Testiranje nalaganja datotek

Supertest se lahko uporablja za testiranje končnih točk API-ja, ki obravnavajo nalaganje datotek. Za pripenjanje datotek k zahtevku lahko uporabite metodo .attach().

5. Uporaba knjižnic za preverjanje (Chai)

Čeprav je vgrajena knjižnica za trditve v Jestu zadostna za mnoge primere, lahko s Supertestom uporabite tudi močnejše knjižnice za trditve, kot je Chai. Chai ponuja bolj izrazno in prilagodljivo sintakso za trditve. Za uporabo Chai-a ga morate namestiti:

npm install --save-dev chai

Nato lahko Chai uvozite v svojo testno datoteko in uporabite njegove trditve:

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!');
  });
});

Opomba: Morda boste morali konfigurirati Jest za pravilno delovanje s Chai-em. To pogosto vključuje dodajanje nastavitvene datoteke, ki uvozi Chai in ga konfigurira za delo z globalnim expect v Jestu.

6. Ponovna uporaba agentov

Za teste, ki zahtevajo nastavitev določenega okolja (npr. avtentikacija), je pogosto koristno ponovno uporabiti agenta Supertest. S tem se izognete odvečni kodi za nastavitev v vsakem testnem primeru.

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

  beforeAll(() => {
    agent = request.agent(app); // Ustvarite trajnega agenta
    // Simulacija avtentikacije
    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 () => {
    // Tukaj izvedite druga avtenticirana dejanja
  });
});

V tem primeru ustvarimo agenta Supertest v kljuki beforeAll in ga avtenticiramo. Naslednji testi znotraj bloka describe lahko nato ponovno uporabijo tega avtenticiranega agenta, ne da bi se morali za vsak test ponovno avtenticirati.

Najboljše prakse za integracijsko testiranje API-jev s Supertestom

Za zagotovitev učinkovitega integracijskega testiranja API-jev upoštevajte naslednje najboljše prakse:

Pogoste napake, ki se jim je treba izogibati

Zaključek

Integracijsko testiranje API-jev je bistven del procesa razvoja programske opreme. Z uporabo Supertesta lahko enostavno pišete celovite in zanesljive integracijske teste API-jev, ki pomagajo zagotoviti kakovost in stabilnost vaše aplikacije. Ne pozabite se osredotočiti na testiranje celotnih delovnih tokov, uporabo realističnih podatkov, izolacijo testov in avtomatizacijo testnega procesa. Z upoštevanjem teh najboljših praks lahko bistveno zmanjšate tveganje za težave z integracijo in zagotovite bolj robusten in zanesljiv izdelek.

Ker API-ji še naprej poganjajo sodobne aplikacije in arhitekture mikrostoritev, bo pomen robustnega testiranja API-jev, zlasti integracijskega testiranja, le še naraščal. Supertest razvijalcem po vsem svetu ponuja zmogljiv in dostopen nabor orodij za zagotavljanje zanesljivosti in kakovosti njihovih interakcij z API-ji.