Testplan

Doel

Het doel van dit testplan is om vast te stellen dat de gerealiseerde OOAPI-functionaliteiten correct werken en voldoen aan de gestelde eisen. Hierbij wordt gecontroleerd of:

  • de endpoints correct bereikbaar zijn;
  • responses voldoen aan het OOAPI-formaat;
  • JWT-authenticatie correct werkt;
  • foutafhandeling juist wordt uitgevoerd;
  • filtering, paging en validatie correct functioneren.

Scope

In scope

De volgende gerealiseerde functionaliteiten vallen binnen scope:

  • /organisations
  • /organisations/{id}
  • /courses
  • /courses/{id}
  • /programmes
  • /programmes/{id}
  • JWT-authenticatie
  • APIM-routing
  • foutafhandeling
  • paging en queryvalidatie
  • Out of scope

De volgende onderdelen vallen buiten scope omdat deze nog niet gerealiseerd of besproken zijn:

  • offering-objecten
  • associations
  • POST/PUT/DELETE operaties
  • performance/load testing
  • UI-functionaliteit

Basisscript voor status en JSON

pm.test("Status code is success", function () {
    pm.expect(pm.response.code).to.be.oneOf([200, 201]);
});

pm.test("Response is JSON", function () {
    pm.expect(pm.response.headers.get("Content-Type")).to.include("application/json");
});

pm.test("Response body is not empty", function () {
    pm.expect(pm.response.text()).to.not.be.empty;
});

Id-validatie voor detail-endpoints

const jsonData = pm.response.json();

pm.test("Returned object has id", function () {
    pm.expect(jsonData).to.have.property("id");
});

pm.test("Returned id matches requested id", function () {
    const requestedId = pm.variables.get("courseId") || pm.variables.get("programmeId");
    if (requestedId) {
        pm.expect(jsonData.id).to.eql(requestedId);
    }
});

Collection-validatie

const jsonData = pm.response.json();

pm.test("Collection response is an object or array", function () {
    pm.expect(jsonData).to.exist;
});

pm.test("Collection contains items", function () {
    const items = jsonData.items || jsonData.results || jsonData._embedded || jsonData;
    pm.expect(items).to.exist;
});

Paging-validatie

const jsonData = pm.response.json();
const items = jsonData.items || jsonData.results || [];

pm.test("Page contains expected number of items", function () {
    pm.expect(items.length).to.eql(1);
});

Sparse fields-validatie

const jsonData = pm.response.json();
const item = (jsonData.items && jsonData.items[0]) ? jsonData.items[0] : jsonData;

pm.test("Only expected fields are present", function () {
    const allowed = ["id", "name"];
    Object.keys(item).forEach(key => {
        pm.expect(allowed).to.include(key);
    });
});

404 / 400 foutvalidatie

pm.test("Status is client error", function () {
    pm.expect(pm.response.code).to.be.oneOf([400, 404]);
});

pm.test("Error body is present", function () {
    pm.expect(pm.response.text()).to.not.be.empty;
});

Pre-request script voor Bearer token

pm.request.headers.upsert({
    key: "Authorization",
    value: "Bearer " + pm.environment.get("authToken")
});

Handige Postman checks voor regressie

Opslaan van id uit list-response

Bijvoorbeeld na GET /courses:

const jsonData = pm.response.json();
const items = jsonData.items || jsonData.results || jsonData;

if (items && items.length > 0) {
    pm.environment.set("courseId", items[0].id);
}