Powrót do strony głównej

Testowanie API: checklista i autotesty

Artykuł opisuje systematyczne podejście do testowania API: kategorie sprawdzeń, przykłady w Postman i Jest+axios, checklista, rola AI w generowaniu przypadków. Nadaje się dla middle/senior QA i dev.

Testy API: od Postman do generowania przypadków AI
Advertisement 728x90

Checklista testowania API: od kodów statusu po automatyzację z AI

Testowanie API wymaga systematycznego podejścia: weryfikacja kodów statusu, struktury odpowiedzi, wartości granicznych oraz uwierzytelniania. Postman idealnie nadaje się do testów ręcznych, a Jest + axios — do ciągłej integracji i wdrażania (CI/CD). Sztuczna inteligencja przyspiesza generowanie przypadków testowych na podstawie OpenAPI, analizę odpowiedzi oraz dane graniczne.

Kody statusu

Sprawdź, czy kod odpowiada scenariuszowi:

| Scenariusz | Oczekiwany kod |

Google AdInline article slot

|----------|---------------|

| Pomyślne utworzenie | 201 |

| Zasób nie znaleziony | 404 |

Google AdInline article slot

| Brak uprawnień | 403 |

| Niezautoryzowany | 401 |

| Nieprawidłowe dane | 400/422 |

Google AdInline article slot

| Błąd serwera | 500 |

Typowy problem: kod 200 z błędem w treści — narusza zasady REST.

Struktura odpowiedzi

  • Wszystkie pola wymagane są obecne.
  • Typy danych: liczba zamiast ciągu — błąd.
  • Obiekty zagnieżdżone nie mogą być null.
  • Tablice nie mogą być mylone z obiektami.

Wartości graniczne

Testuj przypadki brzegowe:

  • Puste ciało żądania.
  • Brak wymaganego pola.
  • Pusta wartość w polu.
  • Liczby: 0, ujemne, MAX_INT.
  • Ciągi: 1 znak, maksymalna długość, znaki specjalne, SQL/XSS.

Uwierzytelnianie i nagłówki

  • Bez tokenu: 401.
  • Wygasły token: 401.
  • Inny token: 403.
  • Użytkownik z prawem tylko do odczytu próbujący modyfikować: 403.

Nagłówki: Content-Type, CORS, limit szybkości.

Testowanie w Postman

Użyj zakładki Tests do skryptów JavaScript po otrzymaniu odpowiedzi.

Podstawowe aserty

// Status i czas
pm.test("Status 200", () => {
    pm.response.to.have.status(200);
});

pm.test("Odpowiedź <500ms", () => {
    pm.expect(pm.response.responseTime).to.be.below(500);
});

// Content-Type
pm.test("JSON", () => {
    pm.response.to.have.header("Content-Type", "application/json; charset=utf-8");
});

Struktura i typy

const response = pm.response.json();

pm.test("id istnieje", () => {
    pm.expect(response).to.have.property("id");
});

pm.test("id to liczba", () => {
    pm.expect(response.id).to.be.a("number");
});

pm.test("email nie jest pusty", () => {
    pm.expect(response.email).to.be.a("string").and.not.empty;
});

Negatywne: bez tokenu

pm.test("401 bez tokenu", () => {
    pm.response.to.have.status(401);
});

const response = pm.response.json();
pm.expect(response).to.have.property("message");

Zapisz token z /login w zmiennej: pm.environment.set("auth_token", response.token);. Użyj {{auth_token}} w nagłówkach.

Automatyczne testy z Jest + axios

Do CI/CD pisz testy w kodzie. Przykład dla /users/:id:

const axios = require("axios");

const BASE_URL = "https://api.example.com";
const TOKEN = process.env.API_TOKEN;

const client = axios.create({
    baseURL: BASE_URL,
    headers: { Authorization: `Bearer ${TOKEN}` }
});

describe("GET /users/:id", () => {

    test("Użytkownik po ID", async () => {
        const response = await client.get("/users/1");

        expect(response.status).toBe(200);
        expect(response.data).toMatchObject({
            id: expect.any(Number),
            email: expect.any(String),
            name: expect.any(String),
        });
    });

    test("404 nieistniejący", async () => {
        await expect(client.get("/users/999999")).rejects.toMatchObject({
            response: { status: 404 }
        });
    });

    test("401 bez tokenu", async () => {
        await expect(axios.get(`${BASE_URL}/users/1`)).rejects.toMatchObject({
            response: { status: 401 }
        });
    });

});

Uruchomienie: npx jest user.test.js.

Uniwersalna checklista

Scenariusze pozytywne:

  • Poprawne dane → poprawny status.
  • Struktura zgodna z dokumentacją.
  • Pola wymagane.
  • Poprawne typy danych.
  • Czas odpowiedzi.

Scenariusze negatywne:

  • Brak uwierzytelnienia → 401.
  • Inny token → 403.
  • Brak pola → 400/422.
  • Nieprawidłowy typ → 400/422.
  • Nieistniejący zasób → 404.
  • Puste ciało → błąd.

Wartości graniczne:

  • Minimalne/maksymalne wartości.
  • 0/ujemne.
  • Puste ciągi.
  • Znaki specjalne/Unicode.
  • Długie ciągi.

Bezpieczeństwo:

  • Wstrzykiwanie SQL.
  • XSS.
  • IDOR (próba przejęcia ID).

Automatyzacja z pomocą sztucznej inteligencji

Sztuczna inteligencja generuje przypadki testowe na podstawie OpenAPI: pozytywne, negatywne, graniczne w formacie Jest.

Prompt: "Wygeneruj testy dla POST /users na podstawie schematu [schemat]. Użyj realistycznych danych."

Automatyczna analiza odpowiedzi przez LLM:

async function validateWithAI(prompt, response) {
    // Wywołanie Claude/GPT do sprawdzenia trafności
    // ...
    return data.content[0].text.trim() === "YES";
}

Generowanie danych granicznych: AI proponuje RTL, emoji, niewidoczne znaki.

AI nie zastępuje zrozumienia logiki biznesowej (np. rabat <=100 dla użytkowników standardowych).

Co jest ważne

  • Sprawdzaj kody statusu zgodnie z scenariuszem — unikaj 200 dla błędów.
  • Testuj strukturę i typy odpowiedzi za pomocą asertów typu JSONPath.
  • Automatyzuj przypadki negatywne i graniczne w CI/CD z Jest/axios.
  • Wykorzystuj AI do rutyn: generowanie przypadków, analiza, dane brzegowe.
  • Checklista to obowiązkowy szablon dla każdego punktu końcowego.

— Editorial Team

Advertisement 728x90

Czytaj dalej