Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generates and executes load test scripts for APIs using k6, wrk, or autocannon. Creates realistic test scenarios from OpenAPI specs, route files, or endpoint descriptions. Use when someone needs to load test, stress test, benchmark, or find the breaking point of their API. Trigger words: load test, stress test, benchmark, RPS, concurrent users, breaking point, performance test, k6, wrk.
.claude/skills/terminalskills-api-load-tester/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 62% | 0% |
| case-13 | ✓→✗ | ▼ Worse | 76% | 0% |
| case-17 | ✓→✗ | ▼ Worse | 37% | 0% |
This skill generates realistic load test scripts from API definitions and executes them with proper ramp-up patterns, authentication flows, and assertions. It produces clear reports identifying breaking points, bottlenecks, and latency percentiles at each traffic level.
Prefer k6 for complex scenarios (multi-step flows, thresholds, custom metrics). Use wrk for quick single-endpoint benchmarks. Use autocannon if only Node.js is available.
Gather endpoint information from:
Read request/response types from the codebase (TypeScript interfaces, Python dataclasses, Go structs) and generate payloads with:
Create scenarios appropriate for the goal:
Ramp-up test (finding breaking point):
stages: [
{ duration: '2m', target: 50 }, // warm-up
{ duration: '5m', target: 200 }, // ramp
{ duration: '3m', target: 500 }, // push
{ duration: '2m', target: 500 }, // sustain
{ duration: '2m', target: 0 }, // cool-down
]Soak test (finding memory leaks, connection exhaustion):
stages: [
{ duration: '5m', target: 100 }, // ramp
{ duration: '60m', target: 100 }, // sustain
{ duration: '5m', target: 0 }, // cool-down
]Spike test (sudden traffic burst):
stages: [
{ duration: '2m', target: 50 }, // normal
{ duration: '30s', target: 500 }, // spike
{ duration: '5m', target: 500 }, // sustain spike
{ duration: '30s', target: 50 }, // drop back
]Always add thresholds:
javascriptthresholds: { http_req_duration: ['p(95)<800', 'p(99)<2000'], http_req_failed: ['rate<0.05'], // Custom per-endpoint if needed }
Run the test and parse output into a structured report showing:
User prompt:
Benchmark our /api/search endpoint handling 100 concurrent connectionsAgent output:
bash# Quick benchmark with k6 k6 run --vus 100 --duration 60s - <<'EOF' import http from 'k6/http'; import { check } from 'k6'; export default function () { const res = http.get('https://api.example.com/api/search?q=laptop&page=1'); check(res, { 'status 200': (r) => r.status === 200 }); } EOF
Results — /api/search @ 100 VUs for 60s
Requests: 8,423 total (140.4 RPS)
Latency: p50=89ms p95=340ms p99=890ms
Errors: 12 (0.14%)
Data: 24.3 MB received
Verdict: Endpoint handles 140 RPS at 100 VUs. p99 approaching 1s suggests
database query optimization needed for sustained higher load.User prompt:
Create a load test for our signup → login → create-project flowAgent generates a k6 script with:
sleep(1-3) between requests to simulate real users; without it, you're testing throughput, not user concurrency| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 26,289 | 22,931 | -13% | 1 | 1 | 0% | 3,373 | 4,552 | +35% | 0 | 0 | — |
case-02 | pass→pass | 8,206 | 4,351 | -47% | 1 | 1 | 0% | 1,566 | 2,091 | +34% | 0 | 0 | — |
case-03 | pass→pass | 10,320 | 6,067 | -41% | 1 | 1 | 0% | 1,818 | 2,481 | +36% | 0 | 0 | — |
case-04 | pass→pass | 13,608 | 9,725 | -29% | 1 | 1 | 0% | 2,525 | 3,375 | +34% | 0 | 0 | — |
case-05 | pass→pass | 15,006 | 11,225 | -25% | 1 | 1 | 0% | 2,727 | 2,931 | +7% | 0 | 0 | — |
case-06 | fail→fail | 13,644 | 9,025 | -34% | 1 | 1 | 0% | 2,131 | 2,758 | +29% | 0 | 0 | — |
case-07 | fail→fail | 16,359 | 11,510 | -30% | 1 | 1 | 0% | 2,796 | 3,146 | +13% | 0 | 0 | — |
case-08 | pass→pass | 12,453 | 8,288 | -33% | 1 | 1 | 0% | 2,181 | 2,889 | +32% | 0 | 0 | — |
case-09 | pass→fail | 11,476 | 9,503 | -17% | 1 | 1 | 0% | 1,759 | 2,848 | +62% | 0 | 0 | — |
case-10 | pass→pass | 8,627 | 10,710 | +24% | 1 | 1 | 0% | 1,326 | 3,303 | +149% | 0 | 0 | — |
case-11 | pass→pass | 20,130 | 6,715 | -67% | 1 | 1 | 0% | 2,127 | 2,658 | +25% | 0 | 0 | — |
case-12 | fail→pass | 13,537 | 11,204 | -17% | 1 | 1 | 0% | 2,501 | 3,461 | +38% | 0 | 0 | — |
case-13 | pass→fail | 11,528 | 10,512 | -9% | 1 | 1 | 0% | 1,764 | 3,109 | +76% | 0 | 0 | — |
case-14 | pass→pass | 9,787 | 6,890 | -30% | 1 | 1 | 0% | 1,944 | 2,414 | +24% | 0 | 0 | — |
case-15 | pass→pass | 15,809 | 13,895 | -12% | 1 | 1 | 0% | 2,857 | 4,028 | +41% | 0 | 0 | — |
case-16 | pass→pass | 13,996 | 7,063 | -50% | 1 | 1 | 0% | 2,499 | 2,668 | +7% | 0 | 0 | — |
case-17 | pass→fail | 15,177 | 10,789 | -29% | 1 | 1 | 0% | 2,460 | 3,382 | +37% | 0 | 0 | — |
case-18 | fail→pass | 17,123 | 16,365 | -4% | 1 | 1 | 0% | 2,677 | 3,789 | +42% | 0 | 0 | — |
case-19 | pass→pass | 13,595 | 10,466 | -23% | 1 | 1 | 0% | 2,711 | 3,434 | +27% | 0 | 0 | — |
case-20 | pass→fail | 9,306 | 8,915 | -4% | 1 | 1 | 0% | 1,818 | 2,931 | +61% | 0 | 0 | — |
case-21 | pass→pass | 6,906 | 9,539 | +38% | 1 | 1 | 0% | 1,394 | 3,179 | +128% | 0 | 0 | — |
case-22 | pass→pass | 6,183 | 5,200 | -16% | 1 | 1 | 0% | 1,531 | 2,840 | +85% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of -14 percentage points is the difference between those two pass rates over the 22 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.