A high-performance API load testing application with a Python async engine, real-time analytics, and a modern React dashboard.
Browser (React + Recharts)
│ SSE
▼
Vite (:5173) ──proxy──▶ Node/Express (:3001) ──SSE proxy──▶ Python/FastAPI (:3002)
│ │
│ history, config │ aiohttp + asyncio
▼ ▼
JSON file storage Target Endpoint
The stress engine runs in Python using aiohttp for lower per-request overhead, accurate timing, and better concurrency scaling compared to Node-based alternatives. The Node server handles the API layer, history persistence, and SSE streaming to the browser.
- Target URL with HTTP method selection (GET, POST, PUT, DELETE, PATCH, HEAD)
- Custom request headers (key-value editor)
- JSON request body editor for POST/PUT/PATCH
- Environment variable substitution using
{{variable}}syntax in URLs, headers, and body
- Bearer Token — auto-injects
Authorization: Bearer <token> - Basic Auth — username and password
- API Key — send as header or query parameter, configurable key name
- Total request count (up to 50,000)
- Concurrency level (up to 500 parallel connections)
- Ramp-up time (gradually increase load over N seconds)
- Duration-based mode (run for a fixed time instead of fixed count)
- Request delay (throttle between requests)
- Per-request timeout
- Quick presets: Quick Check, Light, Medium, Heavy, Spike, Endurance
- Configurable warm-up requests that execute before the measured test
- Warm-up results are excluded from all metrics, charts, and the final report
- Status code checks (=, !=, <, >, etc.)
- Response time thresholds
- Body contains text matching
- JSON path extraction and comparison (
$.data.id) - Header exists and header equals checks
- Failed assertions count as test failures
- Per-assertion pass rate tracked and displayed in the report
- Max average response time
- Max P95 / P99 response time
- Max error rate (%)
- Min throughput (req/s)
- Max absolute response time
- Pass/fail verdict displayed in the report with per-check breakdown
- Chain multiple API calls into a user journey
- Each step has its own URL, method, headers, body, and assertions
- Variable extractors — pull values from a response (JSON path, header, or status code) and use them as
{{variables}}in later steps - Per-step delay configuration
- Reorder, add, and remove steps in the UI
- Per-step metrics in the final report (count, avg response, error rate)
- Live-updating stat cards: requests sent, throughput, avg latency, error rate, assertion pass rate
- Status code badges with color coding
- Four streaming charts (Recharts):
- Throughput over time
- Response time over time
- Error rate over time
- Completed requests over time
- Abort button to stop a running test
Tabbed report with six sections:
- Overview — percentile bar chart, latency histogram, status code pie chart, response time table, bottleneck analysis
- Assertions — per-assertion pass rate with progress bars
- SLA — pass/fail per check with target vs actual
- Timeline — scatter plot waterfall of every request (start offset vs duration)
- Steps — per-step metrics for scenario tests
- Errors — error list with codes and messages
Automatic grading based on response times and error rate:
| Grade | Criteria |
|---|---|
| Excellent | avg < 200ms, P95 < 500ms, errors < 1% |
| Good | avg < 500ms, P95 < 1000ms, errors < 2% |
| Moderate | avg < 1000ms, errors < 5% |
| Poor | avg < 2000ms or errors 5-10% |
| Failed | avg > 2000ms or errors > 10% |
Automated analysis flags:
- High tail latency (P99 > 3x average)
- High error rates
- Requests approaching timeout
- Throughput below concurrency level
- High response time variance (P90 > 2x average)
- JSON — full test result
- CSV — summary metrics, status codes, histogram, assertions, SLA
- PDF — formatted report with tables (jsPDF + autotable)
- Save test results with custom names
- View past results with the full report
- Delete old entries
- Side-by-side comparison of up to 3 tests (throughput, latency, error rate, grade)
- Persisted to a JSON file on the server (last 100 results)
- Save and reload test configs from the browser (localStorage)
- Includes all settings: URL, auth, assertions, SLA, env vars, load params
- Warning banner about testing only permitted endpoints
- Confirmation dialog for high-load tests (>1000 requests or >100 concurrency)
- Server-side rate limit: max 5 concurrent tests
- Request validation on both client and server
# Install everything
npm run install:all
# Start all three servers
npm run devOr individually:
cd worker && python main.py # Python engine on :3002
cd server && npm run dev # Node API on :3001
cd client && npm run dev # React UI on :5173Open http://localhost:5173 in your browser.
- Node.js 20+
- Python 3.12+
- npm
| Layer | Technology |
|---|---|
| Stress Engine | Python, FastAPI, aiohttp, asyncio |
| API Server | Node.js, Express, SSE |
| Frontend | React, TypeScript, Vite, Recharts, Tailwind CSS |
| PDF Export | jsPDF + jspdf-autotable |
| Persistence | JSON file (server), localStorage (client) |