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.
Files changed (35) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +818 -0
  3. package/bin/darwin-arm64/wrk +0 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/core/config-validation.d.ts +7 -0
  7. package/dist/core/config-validation.d.ts.map +1 -0
  8. package/dist/core/json-report-generator.d.ts +174 -0
  9. package/dist/core/json-report-generator.d.ts.map +1 -0
  10. package/dist/core/markdown-report-generator.d.ts +16 -0
  11. package/dist/core/markdown-report-generator.d.ts.map +1 -0
  12. package/dist/core/report-storage.d.ts +10 -0
  13. package/dist/core/report-storage.d.ts.map +1 -0
  14. package/dist/core/stats-calculation.d.ts +16 -0
  15. package/dist/core/stats-calculation.d.ts.map +1 -0
  16. package/dist/core/weight-distribution.d.ts +9 -0
  17. package/dist/core/weight-distribution.d.ts.map +1 -0
  18. package/dist/core/wrk-test-engine.d.ts +181 -0
  19. package/dist/core/wrk-test-engine.d.ts.map +1 -0
  20. package/dist/index.d.ts +39 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +10494 -0
  23. package/dist/types/index.d.ts +88 -0
  24. package/dist/types/index.d.ts.map +1 -0
  25. package/dist/utils/wrk-binary.d.ts +41 -0
  26. package/dist/utils/wrk-binary.d.ts.map +1 -0
  27. package/docs/cli-usage.md +245 -0
  28. package/docs/requirements.md +222 -0
  29. package/examples/complex-config.ts +244 -0
  30. package/examples/complex-wrk-demo.ts +121 -0
  31. package/examples/programmatic-usage-cjs.js +156 -0
  32. package/examples/programmatic-usage.js +205 -0
  33. package/examples/simple-wrk-config.js +33 -0
  34. package/package.json +68 -0
  35. 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
+ - 错误信息明确