PyPerfTester
PyPerfTester 是一个基于 JMeter 5.5 的性能测试工具,通过 Streamlit 提供用户友好的 Web 界面,支持 JMX 文件上传、压测执行、报告生成和预测分析。所有测试相关文件(JMX、JTL、日志、图片、报告、元数据)存储在按日期和配置组织的 history/
目录下,接口列表正确解析 name
字段(优先从 TestElement.name
获取)。
功能特性
-
JMX 文件上传与解析:
- 解析 JMX 文件,提取线程组配置(
num_threads
、ramp_time
、duration
)和接口信息(name
、path
、method
)。 - 接口
name
优先从TestElement.name
获取,若为空则使用HTTPSampler.path
作为后备。 - 显示线程组和接口列表,支持中文。
- 解析 JMX 文件,提取线程组配置(
-
压测执行:
- 使用 JMeter 5.5 执行性能测试,生成 JTL 文件和仪表板。
- 实时进度条和倒计时,显示压测状态。
- 支持大 JTL 文件(~59,955 行),分块加载(
chunksize=10000
)。
-
报告生成:
- 生成 HTML 性能报告,包含:
- 关键指标:总请求数、平均/最大/最小响应时间、成功率、失败率、整体吞吐量。
- 聚合报告:按接口统计样本数、响应时间(平均、中位数、90%/95%/99% 分位)、错误率、吞吐量、接收/发送速率。
- 图表:响应时间趋势、响应时间分布、吞吐量趋势(横坐标根据时长优化,120s 用 5s 间隔,最大 15 个刻度)。
- 报告和图片存储在
history/{jmx_name-YYYYMMDD-num_threads-duration}/
。
- 生成 HTML 性能报告,包含:
-
预测分析:
- 分析 JTL 数据,提供性能指标(平均响应时间、吞吐量、错误率)。
- 基于阈值生成优化建议:
- 响应时间 >200ms:优化数据库查询或负载均衡。
- 吞吐量 <50 req/s:检查线程池或网络带宽。
- 错误率 >1%:分析错误码,优化参数或服务端逻辑。
- 接口数量从
df['label'].nunique()
获取,确保准确。
-
文件存储:
- 所有文件存储在
history/{jmx_name-YYYYMMDD-num_threads-duration}/
,包括:-
uploaded.jmx
:上传的 JMX 文件。 -
test_results.jtl
:压测结果。 -
jmeter.log
:JMeter 日志。 -
response_time.png
、response_dist.png
、throughput_trend.png
:性能图表。 -
performance_report.html
:性能报告。 -
metadata.json
:测试元数据(test_id
、日期、线程数、时长、接口列表、指标)。
-
- 根目录无临时文件,历史保留最近 10 次。
- 所有文件存储在
依赖信息
Python 版本:Python 3.8+
-
Python 库:
streamlit==1.27.2 pandas==2.0.3 matplotlib==3.7.2 jinja2==3.1.2 numpy==1.24.3
-
外部工具:
- JMeter 5.5(需安装,配置
bin/jmeter.bat
路径)。 - 推荐 Windows 环境(
jmeter.bat
),Linux/Mac 可调整为jmeter.sh
。
- JMeter 5.5(需安装,配置
代码结构
PyPerfTester/
├── app.py # 主程序,Streamlit Web 界面
├── jmx_parser.py # JMX 文件解析模块
├── templates/ # HTML 模板目录
│ └── report_template.html # 性能报告模板
├── history/ # 压测归档目录
│ └── {jmx_name-YYYYMMDD-num_threads-duration}/
│ ├── uploaded.jmx
│ ├── test_results.jtl
│ ├── jmeter.log
│ ├── response_time.png
│ ├── response_dist.png
│ ├── throughput_trend.png
│ ├── performance_report.html
│ ├── metadata.json
│ └── dashboard_*/
- app.py:核心逻辑,处理 JMX 上传、压测执行、报告生成、预测分析。
-
jmx_parser.py:解析 JMX 文件,提取线程组和接口信息(修复
name
字段获取)。 - templates/:Jinja2 模板,用于生成性能报告。
-
history/:存储每次压测的文件,目录名格式为
{jmx_name-YYYYMMDD-num_threads-duration}
。
安装说明
-
安装 JMeter:
- 下载 JMeter 5.5:https://jmeter.apache.org/download_jmeter.cgi
- 解压到本地(如
C:\apache-jmeter-5.5
)。 - 配置环境变量或在
app.py
中指定jmeter.bat
路径。
-
创建虚拟环境:
python -m venv venv .\venv\Scripts\activate
-
安装 Python 依赖:
pip install streamlit pandas matplotlib jinja2 numpy -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 100
-
创建目录:
mkdir templates history
-
保存代码和模板:
- 保存
app.py
、jmx_parser.py
到项目根目录。 - 保存
report_template.html
到templates/
。
- 保存
使用说明
-
运行程序:
streamlit run app.py
- 浏览器打开 Streamlit 界面(默认
http://localhost:8501
)。
- 浏览器打开 Streamlit 界面(默认
-
上传 JMX 文件:
- 上传 JMX 文件(如
my_test.jmx
)。 - 查看解析的线程组配置和接口列表(
name
、path
、method
)。
- 上传 JMX 文件(如
-
执行压测:
- 点击“启动压测”,查看进度条和倒计时。
- 压测完成后,文件存储在
history/{jmx_name-YYYYMMDD-num_threads-duration}/
。
-
生成报告:
- 点击“生成HTML报告”,查看性能报告(关键指标、聚合报告、图表)。
- 报告保存为
history/.../performance_report.html
。
-
预测分析:
- 点击“进行预测分析”,查看性能指标和优化建议。
验证步骤
-
清理环境:
cd D:\project\PyPerfTester rmdir /S /Q history del temp_uploaded.jmx test_results.jtl response_time.png response_dist.png throughput_trend.png del %USERPROFILE%\.matplotlib\fontlist-v330.json
-
准备 JMX 文件:
-
示例 JMX:
<jmeterTestPlan version="1.2" properties="5.0"> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group"> <stringProp name="ThreadGroup.num_threads">50</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <stringProp name="ThreadGroup.duration">120</stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login"> <stringProp name="TestElement.name">Login</stringProp> <stringProp name="HTTPSampler.path">/api/login</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> </HTTPSamplerProxy> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Data"> <stringProp name="TestElement.name">Data</stringProp> <stringProp name="HTTPSampler.path">/api/data</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> </HTTPSamplerProxy> </hashTree> </hashTree> </jmeterTestPlan>
保存为
my_test.jmx
.
-
-
运行测试:
- 运行
streamlit run app.py
。 - 上传
my_test.jmx
,验证:- 接口列表显示
name: Login, path: /api/login, method: POST
和name: Data, path: /api/data, method: GET
。 - 线程组信息:
num_threads: 50, ramp_time: 1, duration: 120
。 - JMX 保存到
history/my_test-20250922-50-120/uploaded.jmx
。
- 接口列表显示
- 点击“启动压测”,检查:
-
history/my_test-20250922-50-120/
包含uploaded.jmx
、test_results.jtl
、jmeter.log
、图片、报告、metadata.json
、dashboard_*/
。 - 根目录无临时文件。
-
- 点击“生成HTML报告”,验证报告生成。
- 点击“进行预测分析”,验证指标和建议显示。
- 运行
注意事项
-
JMX 文件格式:确保 JMX 包含
ThreadGroup
和HTTPSamplerProxy
,TestElement.name
优先。 -
性能优化:JTL 分块加载(
chunksize=10000
)适合大文件(~59,955 行)。 - 历史管理:自动保留最近 10 次历史,超出自动删除。
-
错误排查:
- 若接口
name
仍错误,提供 JMX 文件内容。 - 若压测失败,检查
jmeter.log
或history/.../jmeter.log
。 - 若报告生成失败,验证 JTL 文件格式和
templates/
文件存在。
- 若接口
-
时间格式:归档目录使用
YYYYMMDD
(如20250922
),基于系统时间(2025-09-22 16:44 JST)。
后续
代码后续更新。。。。。