Ontwikkel een Mock API voor Geautomatiseerde Load Testing en Prestatieanalyse
description
Met deze prompt kan ik een mock API ontwerpen die automatisch belastingstests uitvoert en gedetailleerde prestatiegegevens verzamelt. Dit helpt me problemen met schaalbaarheid en prestaties vroegtijdig op te sporen en te voorkomen. Het biedt een efficiënte en reproduceerbare manier om realistische belastingsscenario's na te bootsen en zo de betrouwbaarheid van mijn applicatie te verbeteren.
prompt
Help me een mock API te ontwikkelen die automatisch belastbaarheidstests uitvoert en prestatiegegevens verzamelt. API Doel: <beschrijf het doel van de API>. Belangrijkste eindpunten: <noem de cruciale API-eindpunten>. Testparameters: <beschrijf welke parameters ik wil gebruiken voor load te ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een voorbeeld van hoe je een eenvoudige mock API kunt opzetten in Node.js met Express, die de basisfuncties simuleert en geschikt is voor belastbaarheidstests. Daarnaast geef ik suggesties voor het simuleren van piekbelasting en het genereren van rapporten.
### 1. Basis Mock API in Node.js (Express)
```javascript
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
// Simulatie van gebruikerssessies
const sessions = new Map();
// /login endpoint
app.post('/login', (req, res) => {
const { username, password } = req.body;
// Simuleer authenticatievertraging
setTimeout(() => {
if (username && password) {
const sessionId = Math.random().toString(36).substring(2);
sessions.set(sessionId, { username });
res.json({ sessionId });
} else {
res.status(400).json({ error: 'Ongeldige gegevens' });
}
}, Math.random() * 200); // Reactietijd tussen 0-200ms
});
// /userdata endpoint
app.get('/userdata', (req, res) => {
const sessionId = req.headers['authorization'];
// Simuleer dataverwerking
setTimeout(() => {
if (sessions.has(sessionId)) {
res.json({ user: sessions.get(sessionId).username, data: "Voorbeeldgegevens" });
} else {
res.status(401).json({ error: 'Niet geautoriseerd' });
}
}, Math.random() * 150); // Reactietijd tussen 0-150ms
});
// /logout endpoint
app.post('/logout', (req, res) => {
const sessionId = req.headers['authorization'];
setTimeout(() => {
if (sessions.delete(sessionId)) {
res.json({ message: 'Uitgelogd' });
} else {
res.status(400).json({ error: 'Geen actieve sessie' });
}
}, Math.random() * 100); // Reactietijd tussen 0-100ms
});
app.listen(port, () => {
console.log(`Mock API draait op http://localhost:${port}`);
});
```
### 2. Belastbaarheidstest instellen
Gebruik tools zoals **Apache JMeter**, **Gatling** of **k6** om 100 gelijktijdige gebruikers te simuleren en 500 verzoeken per minuut te genereren. Bijvoorbeeld, met **k6**:
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
export let options = {
vus: 100,
duration: '1m',
rps: 500,
};
export default function () {
// Login
let loginRes = http.post('http://localhost:3000/login', { username: 'user', password: 'pass' });
check(loginRes, { 'logged in': (r) => r.status === 200 });
let sessionId = loginRes.json('sessionId');
// Fetch userdata
let headers = { 'Authorization': sessionId };
let userRes = http.get('http://localhost:3000/userdata', { headers: headers });
check(userRes, { 'userdata received': (r) => r.status === 200 });
// Logout
let logoutRes = http.post('http://localhost:3000/logout', null, { headers: headers });
check(logoutRes, { 'logged out': (r) => r.status === 200 });
sleep(1);
}
```
### 3. Suggesties voor piekbelasting simuleren
- **Graduele stijging**: Begin met een lagere belasting en verhoog langzaam het aantal gebruikers of verzoeken om de prestaties onder verschillende belastingniveaus te testen.
- **Burst tests**: Voer korte, intensieve pieken uit waarbij je plotseling het aantal gebruikers of verzoeken verhoogt, bijvoorbeeld door in korte tijd 200-300 gebruikers te simuleren.
- **Randomisatie**: Voeg willekeur toe aan de frequentie en het aantal verzoeken om realistischere belastingspiegels te krijgen.
### 4. Rapportage en prestatieanalyse
- **Verzamel statistieken**: Log reactietijden, foutpercentages en doorlooptijden per verzoek.
- **Gebruik analysetools**: Exporteer gegevens naar CSV of JSON en gebruik tools zoals Excel, Grafana of Kibana voor visualisaties.
- **Automatisch rapport genereren**:
- Scripts (bijv. in Python of Bash) die logs parseren en samenvattingen maken.
- Integratie met CI/CD pipelines om automatische rapporten te genereren na elke test.
### 5. Aanvullende tips
- Voeg realistische vertragingen toe om netwerkvertragingen te simuleren.
- Gebruik een mock data generator voor variatie in gebruikersgegevens.
- Overweeg het gebruik van een mock API-framework zoals **json-server** of **Mockoon** voor snellere setup.
---
Heeft u verdere hulp nodig bij het implementeren of configureren van de tests?
provider: deepseek
model: deepseek-chat
Absoluut! Hier is een complete handleiding in het Nederlands voor het opzetten van een mock API met geautomatiseerde belastingstests.
### 1. Keuze van Tools & Technologieën
Voor een robuuste en realistische mock API raad ik de volgende stack aan:
* **Mock API Framework:** **Node.js met Express.js**. Lichtgewicht, perfect voor API's en een enorme ecosystem.
* **Belastingstest Tool:** **k6 van Grafana Labs**. Specifiek ontworpen voor performance testing, scriptbaar in JavaScript, en meet rechtstreeks de gewenste metrics (reactietijd, foutpercentage).
* **Test Data Generatie:** **Faker.js** bibliotheek om realistische mock gebruikersdata te genereren.
* **Rapportage:** k6 genereert uitgebreide tekstrapporten, maar voor visuele dashboards kun je de resultaten naar **Grafana Cloud** of een lokale **Grafana** instance sturen.
---
### 2. Opzet van de Mock API (server.js)
Eerst installeren: `npm init -y` en dan `npm install express faker`
```javascript
// server.js
const express = require('express');
const faker = require('faker');
const app = express();
app.use(express.json());
// Simpele "database" voor sessies en gebruikers
let sessions = new Map(); // Slaat sessietokens op gekoppeld aan userID
let users = new Map(); // Slaat gebruikersdata op
// Genereer initieel 500 testgebruikers
for (let i = 0; i < 500; i++) {
let userId = faker.datatype.uuid();
users.set(userId, {
id: userId,
username: faker.internet.userName(),
email: faker.internet.email(),
profile: {
name: faker.name.findName(),
address: faker.address.streetAddress()
}
});
}
// LOGIN Eindpunt
app.post('/login', (req, res) => {
// Simuleer verwerkingstijd (50ms - 150ms)
const delay = Math.floor(Math.random() * 100) + 50;
setTimeout(() => {
// Simuleer een 5% kans op een authenticatiefout
if (Math.random() < 0.05) {
return res.status(401).json({ error: 'Ongeldige inloggegevens' });
}
// Pak een willekeurige gebruiker uit onze "database"
const userArray = Array.from(users.values());
const randomUser = userArray[Math.floor(Math.random() * userArray.length)];
// Genereer een sessietoken
const authToken = faker.datatype.uuid();
// Sla de sessie op
sessions.set(authToken, randomUser.id);
// Stuur succes response
res.status(200).json({
message: 'Login succesvol',
token: authToken,
user: { id: randomUser.id, username: randomUser.username }
});
}, delay);
});
// USERDATA Eindpunt (Beveiligd)
app.get('/userdata', (req, res) => {
const token = req.headers.authorization;
if (!token || !sessions.has(token)) {
return res.status(403).json({ error: 'Ongeldige of ontbrekende token' });
}
const userId = sessions.get(token);
const userData = users.get(userId);
// Simuleer verwerkingstijd voor data ophalen (20ms - 100ms)
const delay = Math.floor(Math.random() * 80) + 20;
setTimeout(() => {
res.status(200).json(userData);
}, delay);
});
// LOGOUT Eindpunt
app.post('/logout', (req, res) => {
const token = req.headers.authorization;
if (token && sessions.has(token)) {
sessions.delete(token);
}
res.status(200).json({ message: 'Uitloggen succesvol' });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Mock API server draait op poort ${PORT}`));
```
Start de server met: `node server.js`
---
### 3. Belastingstest Script (k6_test.js)
Installeer k6: [Volg de officiële installatiehandleiding](https://grafana.com/docs/k6/latest/get-started/installation/).
```javascript
// k6_test.js
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Trend, Rate } from 'k6/metrics';
// Definieer aangepaste metrics
let loginResponseTime = new Trend('login_response_time');
let userDataResponseTime = new Trend('userdata_response_time');
let errorRate = new Rate('errors');
// Testopties - HIER STEL JE JE PARAMETERS IN
export let options = {
scenarios: {
constant_request_rate: {
executor: 'constant-arrival-rate',
rate: 500, // 500 verzoeken per minuut (RPS)
timeUnit: '1m',
duration: '5m', // Duur van de test: 5 minuten
preAllocatedVUs: 50, // Aantal VUs om vooraf klaar te zetten
maxVUs: 100, // Maximaal 100 gelijktijdige gebruikers (VUs)
},
},
thresholds: {
'errors': ['rate<0.1'], // Drempel: Foutpercentage moet onder de 10% blijven
'http_req_duration': ['p(95)<500'], // 95% van de verzoeken moet onder 500ms zijn
},
};
// Globale variabele om tokens tussen iteraties op te slaan
let authToken = null;
export default function () {
const BASE_URL = 'http://localhost:3000';
// 1. LOGIN
let loginPayload = JSON.stringify({
// Faker data wordt gegenereerd door de server, dus payload is simpel
username: 'testuser',
password: 'testpass'
});
let loginParams = {
headers: { 'Content-Type': 'application/json' },
};
let loginRes = http.post(`${BASE_URL}/login`, loginPayload, loginParams);
// Check of login succesvol was en sla token op
let loginCheck = check(loginRes, {
'login successful': (r) => r.status === 200,
});
if (loginCheck) {
authToken = loginRes.json('token');
loginResponseTime.add(loginRes.timings.duration); // Log response time
} else {
errorRate.add(1); // Log een fout
}
// Korte pauze tussen requests
sleep(0.1);
// 2. USERDATA - Alleen uitvoeren als login succesvol was
if (authToken) {
let dataParams = {
headers: { 'Authorization': authToken },
};
let dataRes = http.get(`${BASE_URL}/userdata`, dataParams);
let dataCheck = check(dataRes, {
'userdata successful': (r) => r.status === 200,
});
if (dataCheck) {
userDataResponseTime.add(dataRes.timings.duration);
} else {
errorRate.add(1);
}
}
// 3. LOGOUT - Uitloggen in een subset van de iteraties (bijv. 20%)
if (authToken && Math.random() < 0.2) {
let logoutParams = {
headers: { 'Authorization': authToken },
};
http.post(`${BASE_URL}/logout`, null, logoutParams);
authToken = null; // Reset token voor de volgende iteratie
}
}
```
Voer de test uit met: `k6 run k6_test.js`
---
### 4. Simuleren van Piekbelasting
Het `constant-arrival-rate` scenario in het script hierboven houdt een *constante* belasting aan. Voor **piekbelasting** zijn andere k6 executors perfect:
1. **`ramping-arrival-rate` executor:** Laat je de belasting geleidelijk op- en afbouwen om een piek na te bootsen.
```javascript
scenarios: {
spike_test: {
executor: 'ramping-arrival-rate',
stages: [
{ duration: '2m', target: 500 }, // Normale belasting (500 RPM)
{ duration: '1m', target: 2000 }, // PIEK (2000 RPM)
{ duration: '2m', target: 500 }, // Terug naar normaal
],
preAllocatedVUs: 50,
maxVUs: 200, // Zorg voor meer VUs voor de piek
},
}
```
2. **`ramping-vus` executor:** Hiermee simuleer je een geleidelijk toenemend aantal gelijktijdige gebruikers tot een piek.
---
### 5. Genereren van Rapportages
k6 heeft uitstekende rapportagemogelijkheden:
1. **Standaard Terminal Output:** Na afloop van de test krijg je een duidelijk overzicht in de terminal met alle metrics (avg, min, max, p95, etc.) en of de thresholds zijn gehaald.
2. **JSON Export:** Sla de ruwe data op voor verdere analyse.
```bash
k6 run --out json=test_results.json k6_test.js
```
3. **Grafana Dashboards (Aanbevolen):** Integreer k6 met Grafana voor visueel rijke, historische rapporten.
* **Makkelijk:** Stuur resultaten naar **Grafana Cloud** (gratis tier beschikbaar). Voeg `--out cloud` toe aan je commando en volg de setup instructies.
* **Lokaal:** Draai InfluxDB + Grafana lokaal via Docker en stuur data daarheen met `--out influxdb=http://localhost:8086/k6`.
4. **HTML Rapport:** Gebruik community tools zoals `k6-reporter` om een mooi HTML-rapport te genereren vanuit de JSON data.
### Samenvatting van volgende stappen:
1. Installeer Node.js en k6.
2. Sla de `server.js` code op en start hem (`node server.js`).
3. Sla het `k6_test.js` script op en pas de parameters aan (bv. `rate`, `duration`).
4. Voer het testscript uit vanaf een **andere terminal** (`k6 run k6_test.js`).
5. Analyseer de output in de terminal.
6. Experimenteer met verschillende `scenarios` voor piekbelasting en exportopties voor rapportage.
Deze setup geeft je een zeer realistisch en controleerbaar testplatform voor je authenticatie-API. Succes!