119 أسطر
2.9 KiB
Markdown
119 أسطر
2.9 KiB
Markdown
# Performance Testing
|
|
|
|
This project now includes built-in scripts to check correctness, startup time, endpoint latency, and basic load.
|
|
|
|
## 1. Correctness first
|
|
|
|
Run these before any performance test:
|
|
|
|
```powershell
|
|
npm run build
|
|
npm test -- --runInBand
|
|
npm run test:e2e -- --runInBand
|
|
```
|
|
|
|
## 2. Startup time
|
|
|
|
Build the app, then measure cold start:
|
|
|
|
```powershell
|
|
npm run build
|
|
npm run perf:startup
|
|
```
|
|
|
|
Optional parameters:
|
|
|
|
```powershell
|
|
node scripts/startup-benchmark.js --port 4200 --timeout 45000
|
|
```
|
|
|
|
## 3. Health endpoint load
|
|
|
|
If the API is already running on port `4000`:
|
|
|
|
```powershell
|
|
npm run perf:health
|
|
```
|
|
|
|
This runs a simple GET benchmark against `http://127.0.0.1:4000/api/v1/health`.
|
|
|
|
## 4. Custom endpoint load
|
|
|
|
Examples:
|
|
|
|
```powershell
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/health --duration 20 --concurrency 50
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/feed/trending --header "Authorization: Bearer YOUR_TOKEN" --duration 30 --concurrency 25
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/auth/login --method POST --body "{\"email\":\"user@example.com\",\"password\":\"secret\"}" --duration 20 --concurrency 10
|
|
```
|
|
|
|
Supported options:
|
|
|
|
- `--url`
|
|
- `--method`
|
|
- `--duration`
|
|
- `--concurrency`
|
|
- `--timeout`
|
|
- `--warmup`
|
|
- `--header "Key: Value"`
|
|
- `--body`
|
|
- `--body-file`
|
|
|
|
## 5. What to watch
|
|
|
|
- `requestsPerSecond`: throughput
|
|
- `successRate`: percentage of successful requests
|
|
- `non2xxCount`: server or validation failures
|
|
- `timeoutCount`: slow requests
|
|
- `latencyMs.p95` and `latencyMs.p99`: tail latency under load
|
|
|
|
## 6. Practical test order
|
|
|
|
1. `build`
|
|
2. unit tests
|
|
3. e2e tests
|
|
4. startup benchmark
|
|
5. health benchmark
|
|
6. authenticated benchmarks for hot endpoints:
|
|
- `auth/login`
|
|
- `feed/me`
|
|
- `feed/trending`
|
|
- `posts`
|
|
- `chat/messages`
|
|
- `notifications`
|
|
|
|
## 7. Real API benchmark examples
|
|
|
|
Login:
|
|
|
|
```powershell
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/auth/login --method POST --header "Content-Type: application/json" --body "{\"email\":\"user@example.com\",\"password\":\"secret123\"}" --duration 20 --concurrency 10
|
|
```
|
|
|
|
Trending feed with bearer token:
|
|
|
|
```powershell
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/feed/trending --header "Authorization: Bearer YOUR_ACCESS_TOKEN" --duration 30 --concurrency 25
|
|
```
|
|
|
|
Authenticated user feed:
|
|
|
|
```powershell
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/feed/me?limit=20 --header "Authorization: Bearer YOUR_ACCESS_TOKEN" --duration 30 --concurrency 15
|
|
```
|
|
|
|
Notifications:
|
|
|
|
```powershell
|
|
node scripts/load-test.js --url http://127.0.0.1:4000/api/v1/notifications --header "Authorization: Bearer YOUR_ACCESS_TOKEN" --duration 20 --concurrency 15
|
|
```
|
|
|
|
## 8. Limits
|
|
|
|
These scripts are useful local benchmarks, not full production profiling. They do not replace:
|
|
|
|
- database profiling
|
|
- CPU and memory profiling
|
|
- distributed load tools like k6 or Gatling
|
|
- multi-instance tests behind a reverse proxy
|