# Load Testing with k6 ## Installation ```bash brew install k6 # macOS winget install k6 # Windows docker run -i grafana/k6 run - r.status === 200, 'response < 500ms': (r) => r.timings.duration < 500, }); sleep(1); } ``` ## Stress Test with Stages ```javascript export const options = { stages: [ { duration: '2m', target: 50 }, { duration: '5m', target: 50 }, { duration: '2m', target: 100 }, { duration: '2m', target: 0 }, ], thresholds: { http_req_duration: ['p(95)<500'], http_req_failed: ['rate<0.01'], }, }; ``` ## With Authentication ```javascript export function setup() { const res = http.post(`${BASE_URL}/api/login`, { email: 'test@example.com', password: 'password', }); return { token: res.json('token') }; } export default function (data) { const params = { headers: { Authorization: `Bearer ${data.token}` } }; http.get(`${BASE_URL}/api/protected`, params); } ``` ## Performance Thresholds | Metric | Good | Warning | |--------|------|---------| | p50 latency | <200ms | <500ms | | p95 latency | <500ms | <1s | | Error rate | <0.1% | <1% | ## Commands ```bash k6 run script.js k6 run --out json=results.json script.js k6 cloud script.js # Grafana Cloud ``` ## Artillery Alternative ```yaml config: target: 'http://localhost:3000' phases: [{ duration: 60, arrivalRate: 10 }] scenarios: - flow: [{ get: { url: '/api/users' } }] ``` ```bash npx artillery run artillery.yml ```