Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@faizkhairi/loadtest-cli) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
loadtest-cli
A fast CLI tool to benchmark HTTP endpoints with concurrent requests, latency percentiles, and HTML reports.
Features
- Configurable concurrency -- Set total requests and concurrent connections
- Duration mode -- Run tests for a fixed time period instead of fixed request count
- RPS rate limiting -- Cap requests-per-second to simulate realistic traffic
- Payload templates -- Vary request bodies using a JSON file (round-robin)
- Response assertions -- Validate status codes and response body content
- Setup phase -- Login or authenticate before running the load test
- Ramp-up patterns -- Gradually increase concurrency over time
- File upload -- Multipart/form-data uploads for stress-testing upload endpoints
- Latency percentiles -- p50, p95, p99, min, max, mean
- Status code breakdown -- 2xx/3xx/4xx/5xx distribution
- Progress bar -- Real-time progress with spinner
- Multiple output formats -- Terminal (default), JSON, HTML report with Chart.js
Install
npm install -g @faizkhairi/loadtest-cliUsage
# Basic -- 100 requests, 10 concurrent (defaults)
loadtest https://api.example.com/users
# Custom concurrency and total
loadtest https://api.example.com/health -n 500 -c 50
# Run for 30 seconds instead of fixed request count
loadtest https://api.example.com/health -d 30 -c 50
# Rate-limited: 20 requests/second
loadtest https://api.example.com/users -n 200 --rps 20
# POST with varied payloads from file
loadtest https://api.example.com/users -m POST --payload-file payloads.json -n 100
# Assert all responses return 200 and contain "success"
loadtest https://api.example.com/health -n 50 --assert-status 200 --assert-body "success"
# Login first, then test authenticated endpoint
loadtest https://api.example.com/data \
--setup https://api.example.com/login \
--setup-method POST \
--setup-body '{"user":"admin","pass":"secret"}' \
-H "Authorization:Bearer {{SETUP_RESPONSE.token}}"
# Ramp up from 10 to 100 workers over 30 seconds
loadtest https://api.example.com/health -d 120 -c 10 --ramp-to 100 --ramp-over 30
# Upload a file
loadtest https://api.example.com/upload -m POST --file ./data.csv -n 50
# File upload with custom field name and extra form data
loadtest https://api.example.com/upload -m POST --file ./data.csv \
--file-field "document" --form "userId:123" --form "batch:A" -n 50
# Custom headers + save HTML report
loadtest https://api.example.com/data \
-H "Authorization:Bearer token123" \
-n 1000 -c 100 -o report.htmlOptions
| Flag | Description | Default |
|---|---|---|
-n, --requests <number> |
Total requests | 100 |
-c, --concurrency <number> |
Concurrent connections | 10 |
-d, --duration <seconds> |
Run for fixed duration (mutually exclusive with -n) | -- |
-m, --method <method> |
HTTP method | GET |
-H, --header <header...> |
Custom headers (key:value) | -- |
-b, --body <body> |
Request body (JSON) | -- |
-t, --timeout <ms> |
Request timeout | 10000 |
-o, --output <file> |
Output file (.json or .html) | -- |
--rps <number> |
Max requests per second | -- |
--payload-file <path> |
JSON file with array of payloads | -- |
--assert-status <code> |
Assert response status code | -- |
--assert-body <substring> |
Assert response body contains substring | -- |
--setup <url> |
Setup URL (fires once before test) | -- |
--setup-method <method> |
HTTP method for setup request | POST |
--setup-body <body> |
Request body for setup request | -- |
--ramp-to <number> |
Target concurrency for ramp-up | -- |
--ramp-over <seconds> |
Seconds to ramp from -c to --ramp-to | -- |
--file <path> |
File to upload (multipart/form-data) | -- |
--file-field <name> |
Form field name for the file | file |
--form <fields...> |
Additional form fields (key:value) | -- |
Payload File Format
Create a JSON file with an array of objects. Each request picks the next payload round-robin:
[
{ "name": "Alice", "amount": 100 },
{ "name": "Bob", "amount": 200 },
{ "name": "Charlie", "amount": 300 }
]Setup Phase
The --setup option fires a single HTTP request before the load test begins. The response is captured and available as template variables in your headers and body:
{{SETUP_RESPONSE}}-- The full response (JSON stringified){{SETUP_RESPONSE.key}}-- A specific field from the response{{SETUP_RESPONSE.data.token}}-- Nested field access
This enables login-then-test workflows where you need an auth token.
Ramp-Up Patterns
Use --ramp-to and --ramp-over to gradually increase concurrency. The -c flag sets the starting concurrency, and workers are added incrementally until the target is reached:
# Start with 10 workers, ramp to 100 over 30 seconds
loadtest https://api.example.com -d 120 -c 10 --ramp-to 100 --ramp-over 30Both flags are required together. --ramp-to must be greater than -c. Ramp-up works with both duration mode (-d) and request count mode (-n).
File Upload
Use --file to send multipart/form-data requests for stress-testing upload endpoints:
# Basic file upload
loadtest https://api.example.com/upload -m POST --file ./data.csv -n 100
# Custom field name + extra form fields
loadtest https://api.example.com/upload -m POST \
--file ./report.pdf --file-field "document" \
--form "userId:123" --form "category:reports" -n 50--fileis mutually exclusive with--bodyand--payload-file--formfields support{{SETUP_RESPONSE.key}}interpolation- The file is read once at startup and reused across all requests
Output Example
Loadtest -> https://api.example.com/users
500 requests, 50 concurrent, GET
v Completed 500 requests in 3.24s
+-----------------+-----------+
| Metric | Value |
+-----------------+-----------+
| Total Requests | 500 |
| Successful | 498 |
| Failed | 2 |
| Duration | 3.24s |
| Requests/sec | 154.3 |
+-----------------+-----------+
Latency Distribution
+-----------------+-----------+
| Percentile | Latency |
+-----------------+-----------+
| Min | 12.3ms |
| Mean | 45.2ms |
| p50 | 38.1ms |
| p95 | 112.4ms |
| p99 | 234.7ms |
| Max | 589.2ms |
+-----------------+-----------+Project Structure
loadtest-cli/
├── src/
│ ├── index.ts # CLI entry (Commander.js)
│ ├── runner.ts # Load test orchestrator
│ ├── worker.ts # HTTP request worker
│ ├── setup.ts # Setup phase runner
│ ├── stats.ts # Percentiles, RPS calculator
│ ├── types.ts # TypeScript interfaces
│ └── reporter/
│ ├── terminal.ts # Colorized terminal output
│ ├── json.ts # JSON output
│ └── html.ts # HTML report with Chart.js
└── tests/
├── stats.test.ts # Percentile & stats tests
├── reporter.test.ts # JSON reporter tests
├── runner.test.ts # Runner integration tests
├── worker.test.ts # Worker & assertions tests
└── setup.test.ts # Setup phase testsLicense
MIT