/ opencodehub / tests / load / k6-spike.js
Swadhin Biswas test(qa): add e2e, integration, unit, and load coverage · 3/6/2026
1c29e63
42 lines · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * k6 Spike Test — sudden traffic burst
 * Simulates viral event or DDoS-like burst
 * Run: k6 run tests/load/k6-spike.js
 */
import { check, sleep } from "k6";
import http from "k6/http";
import { Counter } from "k6/metrics";

const BASE_URL = __ENV.BASE_URL || "http://localhost:4321";

const serverErrors = new Counter("server_errors_5xx");

export const options = {
  stages: [
    { duration: "30s", target: 10 }, // Warm up
    { duration: "30s", target: 500 }, // SPIKE!
    { duration: "1m", target: 500 }, // Sustain spike
    { duration: "30s", target: 10 }, // Cool down
    { duration: "1m", target: 10 }, // Recovery
    { duration: "30s", target: 0 }, // Ramp down
  ],
  thresholds: {
    http_req_duration: ["p(95)<3000"],
    http_req_failed: ["rate<0.15"], // Expect some failures during spike
  },
};

export default function () {
  const res = http.get(`${BASE_URL}/`);
  check(res, {
    "status ok": (r) => r.status < 500,
    "not timeout": (r) => r.timings.duration < 10000,
  });
  if (res.status >= 500) serverErrors.add(1);
  sleep(0.5);

  const healthRes = http.get(`${BASE_URL}/api/health`);
  check(healthRes, { "health alive": (r) => r.status === 200 });
  sleep(0.5);
}