thunderbench 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +818 -0
- package/bin/darwin-arm64/wrk +0 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/core/config-validation.d.ts +7 -0
- package/dist/core/config-validation.d.ts.map +1 -0
- package/dist/core/json-report-generator.d.ts +174 -0
- package/dist/core/json-report-generator.d.ts.map +1 -0
- package/dist/core/markdown-report-generator.d.ts +16 -0
- package/dist/core/markdown-report-generator.d.ts.map +1 -0
- package/dist/core/report-storage.d.ts +10 -0
- package/dist/core/report-storage.d.ts.map +1 -0
- package/dist/core/stats-calculation.d.ts +16 -0
- package/dist/core/stats-calculation.d.ts.map +1 -0
- package/dist/core/weight-distribution.d.ts +9 -0
- package/dist/core/weight-distribution.d.ts.map +1 -0
- package/dist/core/wrk-test-engine.d.ts +181 -0
- package/dist/core/wrk-test-engine.d.ts.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10494 -0
- package/dist/types/index.d.ts +88 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/wrk-binary.d.ts +41 -0
- package/dist/utils/wrk-binary.d.ts.map +1 -0
- package/docs/cli-usage.md +245 -0
- package/docs/requirements.md +222 -0
- package/examples/complex-config.ts +244 -0
- package/examples/complex-wrk-demo.ts +121 -0
- package/examples/programmatic-usage-cjs.js +156 -0
- package/examples/programmatic-usage.js +205 -0
- package/examples/simple-wrk-config.js +33 -0
- package/package.json +68 -0
- package/scripts/setup-wrk.js +98 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export interface RequestConfig {
|
|
2
|
+
method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
3
|
+
url: string;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: any;
|
|
6
|
+
query?: Record<string, any>;
|
|
7
|
+
params?: Record<string, any>;
|
|
8
|
+
formData?: Record<string, any>;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface HttpConfig {
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface ErrorHandlingConfig {
|
|
17
|
+
expectMaxResponseTime: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ApiTestConfig {
|
|
20
|
+
name: string;
|
|
21
|
+
request: RequestConfig;
|
|
22
|
+
weight: number;
|
|
23
|
+
errorHandling?: ErrorHandlingConfig;
|
|
24
|
+
}
|
|
25
|
+
export interface TestGroupConfig {
|
|
26
|
+
name: string;
|
|
27
|
+
http: HttpConfig;
|
|
28
|
+
threads: number;
|
|
29
|
+
connections: number;
|
|
30
|
+
duration: number;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
latency?: boolean;
|
|
33
|
+
tests: ApiTestConfig[];
|
|
34
|
+
executionMode: "parallel" | "sequential";
|
|
35
|
+
delay?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface BenchmarkConfig {
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
groups: TestGroupConfig[];
|
|
41
|
+
}
|
|
42
|
+
export interface RequestResult {
|
|
43
|
+
name: string;
|
|
44
|
+
success: boolean;
|
|
45
|
+
responseTime: number;
|
|
46
|
+
statusCode?: number;
|
|
47
|
+
error?: string;
|
|
48
|
+
timestamp: number;
|
|
49
|
+
requestSize?: number;
|
|
50
|
+
responseSize?: number;
|
|
51
|
+
isTimeout?: boolean;
|
|
52
|
+
isSlow?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface RealTimeStats {
|
|
55
|
+
totalRequests: number;
|
|
56
|
+
successfulRequests: number;
|
|
57
|
+
failedRequests: number;
|
|
58
|
+
timeoutRequests: number;
|
|
59
|
+
slowRequests: number;
|
|
60
|
+
averageResponseTime: number;
|
|
61
|
+
minResponseTime: number;
|
|
62
|
+
maxResponseTime: number;
|
|
63
|
+
requestsPerSecond: number;
|
|
64
|
+
errorRate: number;
|
|
65
|
+
timeoutRate: number;
|
|
66
|
+
slowRate: number;
|
|
67
|
+
}
|
|
68
|
+
export interface DetailedStats extends RealTimeStats {
|
|
69
|
+
p50ResponseTime: number;
|
|
70
|
+
p90ResponseTime: number;
|
|
71
|
+
p95ResponseTime: number;
|
|
72
|
+
p99ResponseTime: number;
|
|
73
|
+
totalRequestSize: number;
|
|
74
|
+
totalResponseSize: number;
|
|
75
|
+
}
|
|
76
|
+
export interface GroupResult {
|
|
77
|
+
name: string;
|
|
78
|
+
stats: DetailedStats;
|
|
79
|
+
requests: RequestResult[];
|
|
80
|
+
}
|
|
81
|
+
export interface BenchmarkResult {
|
|
82
|
+
startTime: number;
|
|
83
|
+
endTime: number;
|
|
84
|
+
duration: number;
|
|
85
|
+
groups: GroupResult[];
|
|
86
|
+
overallStats: DetailedStats;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface WrkBinaryInfo {
|
|
2
|
+
path: string;
|
|
3
|
+
platform: string;
|
|
4
|
+
arch: string;
|
|
5
|
+
exists: boolean;
|
|
6
|
+
version?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 获取当前平台的标识符
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPlatformIdentifier(): string;
|
|
12
|
+
/**
|
|
13
|
+
* 获取内置 wrk 二进制文件的路径
|
|
14
|
+
*/
|
|
15
|
+
export declare function getBuiltinWrkPath(): string;
|
|
16
|
+
/**
|
|
17
|
+
* 获取系统安装的 wrk 路径(保留作为备用选项)
|
|
18
|
+
*/
|
|
19
|
+
export declare function getSystemWrkPath(): Promise<string | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* 验证 wrk 二进制文件是否可用
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateWrkBinary(wrkPath: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* 获取 wrk 版本信息
|
|
26
|
+
*/
|
|
27
|
+
export declare function getWrkVersion(wrkPath: string): Promise<string | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* 获取最佳的 wrk 二进制文件路径
|
|
30
|
+
* 优先级:用户指定 > 内置二进制
|
|
31
|
+
*/
|
|
32
|
+
export declare function getBestWrkPath(userWrkPath?: string): Promise<WrkBinaryInfo>;
|
|
33
|
+
/**
|
|
34
|
+
* 检查是否需要下载 wrk 二进制文件
|
|
35
|
+
*/
|
|
36
|
+
export declare function needsWrkDownload(): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* 获取下载说明信息
|
|
39
|
+
*/
|
|
40
|
+
export declare function getDownloadInstructions(): string;
|
|
41
|
+
//# sourceMappingURL=wrk-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrk-binary.d.ts","sourceRoot":"","sources":["../../src/utils/wrk-binary.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAuB9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyD1C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAczE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAShF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAkDjF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAGzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsBhD"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# ThunderBench CLI 使用指南
|
|
2
|
+
|
|
3
|
+
## 🚀 快速开始
|
|
4
|
+
|
|
5
|
+
### 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g thunderbench
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### 基本用法
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
thunderbench [选项] [配置文件]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 📋 命令选项
|
|
18
|
+
|
|
19
|
+
### 核心选项
|
|
20
|
+
|
|
21
|
+
| 选项 | 简写 | 描述 | 默认值 |
|
|
22
|
+
|------|------|------|--------|
|
|
23
|
+
| `--config` | `-c` | 配置文件路径 | `./examples/test-config.ts` |
|
|
24
|
+
| `--verbose` | `-v` | 详细输出模式 | `false` |
|
|
25
|
+
| `--version` | `-V` | 显示版本信息 | - |
|
|
26
|
+
| `--help` | `-h` | 显示帮助信息 | - |
|
|
27
|
+
|
|
28
|
+
### 执行控制
|
|
29
|
+
|
|
30
|
+
| 选项 | 描述 | 默认值 |
|
|
31
|
+
|------|------|--------|
|
|
32
|
+
| `--dry-run` | 仅验证配置,不执行测试 | `false` |
|
|
33
|
+
| `--no-progress` | 不显示实时进度 | `false` |
|
|
34
|
+
| `--no-report` | 不生成报告文件 | `false` |
|
|
35
|
+
|
|
36
|
+
### 全局参数覆盖
|
|
37
|
+
|
|
38
|
+
| 选项 | 描述 | 默认值 |
|
|
39
|
+
|------|------|--------|
|
|
40
|
+
| `--timeout <ms>` | 全局超时时间(毫秒) | `30000` |
|
|
41
|
+
| `--concurrent <number>` | 全局并发数覆盖 | `10` |
|
|
42
|
+
|
|
43
|
+
### 输出控制
|
|
44
|
+
|
|
45
|
+
| 选项 | 描述 | 默认值 |
|
|
46
|
+
|------|------|--------|
|
|
47
|
+
| `--output <dir>` | 报告输出目录 | `./reports` |
|
|
48
|
+
| `--cleanup-wrk` | 测试完成后清理临时文件 | `false` |
|
|
49
|
+
|
|
50
|
+
### 示例和帮助
|
|
51
|
+
|
|
52
|
+
| 选项 | 描述 |
|
|
53
|
+
|------|------|
|
|
54
|
+
| `--list-examples` | 列出可用的示例配置文件 |
|
|
55
|
+
| `--create-example` | 创建示例配置文件 |
|
|
56
|
+
|
|
57
|
+
## 🎯 使用示例
|
|
58
|
+
|
|
59
|
+
### 1. 查看帮助和版本
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 查看帮助
|
|
63
|
+
thunderbench --help
|
|
64
|
+
|
|
65
|
+
# 查看版本
|
|
66
|
+
thunderbench --version
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 2. 列出示例配置
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
thunderbench --list-examples
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3. 创建示例配置
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
thunderbench --create-example
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 4. 配置验证(干运行)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 验证配置文件语法
|
|
85
|
+
thunderbench --config examples/simple-wrk-config.js --dry-run
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 5. 执行性能测试
|
|
89
|
+
|
|
90
|
+
#### 基本测试
|
|
91
|
+
```bash
|
|
92
|
+
thunderbench --config examples/simple-wrk-config.js
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### 详细输出模式
|
|
96
|
+
```bash
|
|
97
|
+
thunderbench --config examples/simple-wrk-config.js --verbose
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### 自定义输出目录
|
|
101
|
+
```bash
|
|
102
|
+
thunderbench --config examples/simple-wrk-config.js -o ./my-reports
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### 全局参数覆盖
|
|
106
|
+
```bash
|
|
107
|
+
thunderbench --config examples/simple-wrk-config.js \
|
|
108
|
+
--timeout 5000 \
|
|
109
|
+
--concurrent 50
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 📊 配置文件格式
|
|
113
|
+
|
|
114
|
+
### 基础结构
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const config = {
|
|
118
|
+
name: "测试配置名称",
|
|
119
|
+
description: "测试配置描述",
|
|
120
|
+
groups: [
|
|
121
|
+
{
|
|
122
|
+
name: "测试组名称",
|
|
123
|
+
http: {
|
|
124
|
+
baseUrl: "http://localhost:3000",
|
|
125
|
+
headers: { "User-Agent": "thunderbench/1.0" }
|
|
126
|
+
},
|
|
127
|
+
// wrk 核心参数
|
|
128
|
+
threads: 4, // -t 线程数
|
|
129
|
+
connections: 100, // -c 连接数
|
|
130
|
+
duration: 30, // -d 测试时长(秒)
|
|
131
|
+
timeout: 5, // --timeout 超时时间
|
|
132
|
+
latency: true, // --latency 延迟统计
|
|
133
|
+
|
|
134
|
+
// 执行模式
|
|
135
|
+
executionMode: "parallel", // parallel 或 sequential
|
|
136
|
+
delay: 2, // 组间延迟(秒)
|
|
137
|
+
|
|
138
|
+
// 测试接口
|
|
139
|
+
tests: [
|
|
140
|
+
{
|
|
141
|
+
name: "API测试",
|
|
142
|
+
request: {
|
|
143
|
+
method: "GET",
|
|
144
|
+
url: "/api/test"
|
|
145
|
+
},
|
|
146
|
+
weight: 100
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### wrk 参数说明
|
|
155
|
+
|
|
156
|
+
| 参数 | 对应 wrk 选项 | 描述 | 示例值 |
|
|
157
|
+
|------|---------------|------|--------|
|
|
158
|
+
| `threads` | `-t` | 线程数 | `4` |
|
|
159
|
+
| `connections` | `-c` | 连接数 | `100` |
|
|
160
|
+
| `duration` | `-d` | 测试时长(秒) | `30` |
|
|
161
|
+
| `timeout` | `--timeout` | 超时时间(秒) | `5` |
|
|
162
|
+
| `latency` | `--latency` | 延迟统计 | `true` |
|
|
163
|
+
|
|
164
|
+
## 📈 测试结果
|
|
165
|
+
|
|
166
|
+
### 实时输出示例
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
执行测试组: 基础测试组 (1/1)
|
|
170
|
+
并行执行模式: 同时测试所有接口
|
|
171
|
+
启动接口测试: GET 请求测试
|
|
172
|
+
wrk -t4 -c100 -d10s GET 请求测试 (权重: 100%)
|
|
173
|
+
基础测试组: 100% (1/1) | 基础测试组
|
|
174
|
+
实时: 0 请求 | 0.0% 成功 | 平均 0ms | 0.0 req/s
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 最终报告示例
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
────────────────────────────────────────────────────────────
|
|
181
|
+
ThunderBench 性能测试结果
|
|
182
|
+
────────────────────────────────────────────────────────────
|
|
183
|
+
总耗时: 10.13s
|
|
184
|
+
总请求数: 1,443,024
|
|
185
|
+
成功: 1,443,024 (100.0%)
|
|
186
|
+
平均延迟: 0.71ms
|
|
187
|
+
P95延迟: 14.09ms
|
|
188
|
+
吞吐量: 142862.0 req/s
|
|
189
|
+
延迟分布: P50: 0ms | P90: 0ms | P95: 14.09ms | P99: 0ms
|
|
190
|
+
────────────────────────────────────────────────────────────
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 🔧 高级用法
|
|
194
|
+
|
|
195
|
+
### 环境变量
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# 设置详细日志
|
|
199
|
+
export THUNDERBENCH_VERBOSE=true
|
|
200
|
+
|
|
201
|
+
# 设置默认超时
|
|
202
|
+
export THUNDERBENCH_TIMEOUT=10000
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 配置文件优先级
|
|
206
|
+
|
|
207
|
+
1. 命令行参数(最高优先级)
|
|
208
|
+
2. 环境变量
|
|
209
|
+
3. 配置文件
|
|
210
|
+
4. 默认值(最低优先级)
|
|
211
|
+
|
|
212
|
+
## 📁 输出文件
|
|
213
|
+
|
|
214
|
+
### 报告目录结构
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
reports/
|
|
218
|
+
└── 2025-08-22_07-10-29/
|
|
219
|
+
├── report.json # JSON 格式报告
|
|
220
|
+
├── report.md # Markdown 格式报告
|
|
221
|
+
└── summary.txt # 摘要报告
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 🚨 故障排除
|
|
225
|
+
|
|
226
|
+
### 常见问题
|
|
227
|
+
|
|
228
|
+
1. **权限问题**: 确保对输出目录有写权限
|
|
229
|
+
2. **内存不足**: 减少并发数和连接数
|
|
230
|
+
3. **网络超时**: 调整超时时间设置
|
|
231
|
+
4. **配置文件错误**: 使用 `--dry-run` 验证配置
|
|
232
|
+
|
|
233
|
+
### 调试模式
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# 启用详细输出
|
|
237
|
+
thunderbench --config config.js --verbose
|
|
238
|
+
|
|
239
|
+
# 仅验证配置
|
|
240
|
+
thunderbench --config config.js --dry-run
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
💡 **提示**: 首次使用建议先运行 `--create-example` 创建示例配置,然后使用 `--dry-run` 验证配置正确性。
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# JS-Benchmark 性能测试工具需求文档
|
|
2
|
+
|
|
3
|
+
## 1. 项目概述
|
|
4
|
+
|
|
5
|
+
### 1.1 项目目标
|
|
6
|
+
创建一个声明式的接口性能测试工具,使用JavaScript配置,基于RxJS实现,提供简单易用的性能测试能力。
|
|
7
|
+
|
|
8
|
+
### 1.2 技术选型
|
|
9
|
+
- **运行时**: Bun
|
|
10
|
+
- **语言**: TypeScript
|
|
11
|
+
- **核心库**: RxJS (处理异步流和并发控制)
|
|
12
|
+
- **HTTP客户端**: Axios
|
|
13
|
+
- **命令行工具**: Commander.js
|
|
14
|
+
|
|
15
|
+
## 2. 功能需求
|
|
16
|
+
|
|
17
|
+
### 2.1 核心功能
|
|
18
|
+
|
|
19
|
+
#### 2.1.1 测试配置
|
|
20
|
+
- 支持JavaScript配置文件(ES模块)
|
|
21
|
+
- 组级配置管理(HTTP配置、执行模式、并发数等)
|
|
22
|
+
- 接口级测试配置(请求方法、URL、权重等)
|
|
23
|
+
- 权重分配:0-100,总和必须=100
|
|
24
|
+
|
|
25
|
+
#### 2.1.2 执行模式
|
|
26
|
+
- **并行执行**: 组内所有接口同时启动
|
|
27
|
+
- **串行执行**: 组内接口按顺序执行
|
|
28
|
+
- 支持组间延迟配置
|
|
29
|
+
- 通过数组复用实现分阶段测试
|
|
30
|
+
|
|
31
|
+
#### 2.1.3 测试策略
|
|
32
|
+
- **按次数测试**: 指定总请求数
|
|
33
|
+
- **按时间测试**: 指定测试时长
|
|
34
|
+
- 两种策略互斥,不能同时设置
|
|
35
|
+
|
|
36
|
+
#### 2.1.4 并发控制
|
|
37
|
+
- 组级并发控制
|
|
38
|
+
- 接口级并发控制
|
|
39
|
+
- Artillery风格:始终保持指定并发数进行中
|
|
40
|
+
|
|
41
|
+
### 2.2 必要功能
|
|
42
|
+
|
|
43
|
+
#### 2.2.1 实时监控
|
|
44
|
+
- 每个请求都显示进度
|
|
45
|
+
- 实时统计更新(成功率、响应时间、每秒请求数)
|
|
46
|
+
- 实时错误信息显示
|
|
47
|
+
|
|
48
|
+
#### 2.2.2 报告生成
|
|
49
|
+
- 控制台完整报告
|
|
50
|
+
- 分组统计报告
|
|
51
|
+
- 性能指标分析(P50、P90、P95、P99)
|
|
52
|
+
|
|
53
|
+
#### 2.2.3 错误处理
|
|
54
|
+
- 超时检测(基于`expectMaxResponseTime`)
|
|
55
|
+
- 响应过慢判断
|
|
56
|
+
- 错误分类统计
|
|
57
|
+
- **策略**: 不恢复,只记录,继续测试
|
|
58
|
+
|
|
59
|
+
#### 2.2.4 配置验证
|
|
60
|
+
- 运行时验证权重总和
|
|
61
|
+
- 运行时验证必要参数
|
|
62
|
+
- 配置错误时立即停止
|
|
63
|
+
|
|
64
|
+
### 2.3 可选功能
|
|
65
|
+
|
|
66
|
+
#### 2.3.1 数据收集
|
|
67
|
+
- 请求大小统计
|
|
68
|
+
- 响应大小统计
|
|
69
|
+
- 详细错误信息记录
|
|
70
|
+
|
|
71
|
+
#### 2.3.2 性能指标
|
|
72
|
+
- 响应时间分布
|
|
73
|
+
- 错误率分析
|
|
74
|
+
- 吞吐量统计
|
|
75
|
+
|
|
76
|
+
## 3. 非功能需求
|
|
77
|
+
|
|
78
|
+
### 3.1 性能要求
|
|
79
|
+
- 控制台输出不影响测试性能
|
|
80
|
+
- 支持高并发测试(100+并发)
|
|
81
|
+
- 内存使用友好,流式处理
|
|
82
|
+
|
|
83
|
+
### 3.2 易用性
|
|
84
|
+
- 一个命令启动:`js-benchmark config.js`
|
|
85
|
+
- 默认实时监控和报告生成
|
|
86
|
+
- 配置文件简单直观
|
|
87
|
+
|
|
88
|
+
### 3.3 可扩展性
|
|
89
|
+
- 模块化设计
|
|
90
|
+
- 函数式编程风格
|
|
91
|
+
- 易于添加新的执行模式
|
|
92
|
+
|
|
93
|
+
## 4. 用户使用场景
|
|
94
|
+
|
|
95
|
+
### 4.1 配置文件编写
|
|
96
|
+
```typescript
|
|
97
|
+
// simple-test.js
|
|
98
|
+
export default {
|
|
99
|
+
groups: [
|
|
100
|
+
{
|
|
101
|
+
name: "用户接口",
|
|
102
|
+
http: { baseUrl: "https://api.example.com" },
|
|
103
|
+
executionMode: 'parallel',
|
|
104
|
+
concurrent: 10,
|
|
105
|
+
requests: 1000,
|
|
106
|
+
tests: [
|
|
107
|
+
{ name: "登录", weight: 60, request: { method: "POST", url: "/auth/login" } },
|
|
108
|
+
{ name: "注册", weight: 40, request: { method: "POST", url: "/auth/register" } }
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 4.2 测试启动
|
|
116
|
+
```bash
|
|
117
|
+
js-benchmark simple-test.js
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 4.3 测试过程
|
|
121
|
+
- 启动时显示配置摘要
|
|
122
|
+
- 运行中实时显示进度和统计
|
|
123
|
+
- 完成后显示完整报告
|
|
124
|
+
|
|
125
|
+
## 5. 技术架构
|
|
126
|
+
|
|
127
|
+
### 5.1 核心模块
|
|
128
|
+
- **配置管理**: 配置文件加载和验证
|
|
129
|
+
- **测试引擎**: RxJS流式处理,并发控制
|
|
130
|
+
- **请求执行**: HTTP请求发送和结果收集
|
|
131
|
+
- **统计计算**: 实时统计和指标计算
|
|
132
|
+
- **进度监控**: 实时进度显示和报告生成
|
|
133
|
+
|
|
134
|
+
### 5.2 数据流
|
|
135
|
+
1. 配置文件 → 配置验证
|
|
136
|
+
2. 配置 → 请求流生成
|
|
137
|
+
3. 请求流 → 并发控制
|
|
138
|
+
4. 结果流 → 实时统计
|
|
139
|
+
5. 统计结果 → 进度显示和报告
|
|
140
|
+
|
|
141
|
+
### 5.3 关键算法
|
|
142
|
+
- **权重分配**: 两轮分配算法,处理舍入误差
|
|
143
|
+
- **并发控制**: RxJS mergeMap + concatMap
|
|
144
|
+
- **统计计算**: 流式统计,实时更新
|
|
145
|
+
|
|
146
|
+
## 6. 输出格式
|
|
147
|
+
|
|
148
|
+
### 6.1 启动信息
|
|
149
|
+
```
|
|
150
|
+
🚀 开始性能测试...
|
|
151
|
+
📋 测试组: 1个
|
|
152
|
+
🎯 总请求数: 1000个
|
|
153
|
+
⚡ 并发数: 10个
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 6.2 实时进度
|
|
157
|
+
```
|
|
158
|
+
📊 进度: 1.0% (10/1000)
|
|
159
|
+
📊 进度: 2.0% (20/1000)
|
|
160
|
+
⚡ 成功率: 100.0%
|
|
161
|
+
📈 平均响应时间: 156ms
|
|
162
|
+
🚀 每秒请求数: 10.2/s
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 6.3 最终报告
|
|
166
|
+
```
|
|
167
|
+
🎉 测试完成!
|
|
168
|
+
⏱️ 总耗时: 125s
|
|
169
|
+
📈 总请求: 1000
|
|
170
|
+
✅ 成功: 985
|
|
171
|
+
❌ 失败: 15
|
|
172
|
+
|
|
173
|
+
📊 用户接口组
|
|
174
|
+
- 登录接口: 600次, 成功率98.3%, 平均156ms
|
|
175
|
+
- 注册接口: 400次, 成功率97.5%, 平均234ms
|
|
176
|
+
|
|
177
|
+
📊 性能分析
|
|
178
|
+
- P50: 120ms
|
|
179
|
+
- P90: 280ms
|
|
180
|
+
- P95: 450ms
|
|
181
|
+
- P99: 800ms
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## 7. 开发优先级
|
|
185
|
+
|
|
186
|
+
### 7.1 第一阶段(核心功能)
|
|
187
|
+
- 基础配置管理
|
|
188
|
+
- HTTP请求执行
|
|
189
|
+
- 并发控制
|
|
190
|
+
- 基础统计
|
|
191
|
+
|
|
192
|
+
### 7.2 第二阶段(必要功能)
|
|
193
|
+
- 实时监控
|
|
194
|
+
- 报告生成
|
|
195
|
+
- 错误处理
|
|
196
|
+
- 配置验证
|
|
197
|
+
|
|
198
|
+
### 7.3 第三阶段(优化完善)
|
|
199
|
+
- 性能优化
|
|
200
|
+
- 错误分类
|
|
201
|
+
- 指标完善
|
|
202
|
+
- 文档完善
|
|
203
|
+
|
|
204
|
+
## 8. 验收标准
|
|
205
|
+
|
|
206
|
+
### 8.1 功能验收
|
|
207
|
+
- 支持并行和串行执行
|
|
208
|
+
- 权重分配准确
|
|
209
|
+
- 并发控制有效
|
|
210
|
+
- 实时监控正常
|
|
211
|
+
- 报告生成完整
|
|
212
|
+
|
|
213
|
+
### 8.2 性能验收
|
|
214
|
+
- 支持100+并发
|
|
215
|
+
- 控制台输出不影响性能
|
|
216
|
+
- 内存使用合理
|
|
217
|
+
|
|
218
|
+
### 8.3 易用性验收
|
|
219
|
+
- 配置文件简单
|
|
220
|
+
- 一个命令启动
|
|
221
|
+
- 输出信息清晰
|
|
222
|
+
- 错误信息明确
|