PyPerf + Jmeter 性能自动化(附件简单的性能接口预测)

PyPerfTester

PyPerfTester 是一个基于 JMeter 5.5 的性能测试工具,通过 Streamlit 提供用户友好的 Web 界面,支持 JMX 文件上传、压测执行、报告生成和预测分析。所有测试相关文件(JMX、JTL、日志、图片、报告、元数据)存储在按日期和配置组织的 history/ 目录下,接口列表正确解析 name 字段(优先从 TestElement.name 获取)。

功能特性

  • JMX 文件上传与解析

    • 解析 JMX 文件,提取线程组配置(num_threadsramp_timeduration)和接口信息(namepathmethod)。
    • 接口 name 优先从 TestElement.name 获取,若为空则使用 HTTPSampler.path 作为后备。
    • 显示线程组和接口列表,支持中文。
  • 压测执行

    • 使用 JMeter 5.5 执行性能测试,生成 JTL 文件和仪表板。
    • 实时进度条和倒计时,显示压测状态。
    • 支持大 JTL 文件(~59,955 行),分块加载(chunksize=10000)。
  • 报告生成

    • 生成 HTML 性能报告,包含:
      • 关键指标:总请求数、平均/最大/最小响应时间、成功率、失败率、整体吞吐量。
      • 聚合报告:按接口统计样本数、响应时间(平均、中位数、90%/95%/99% 分位)、错误率、吞吐量、接收/发送速率。
      • 图表:响应时间趋势、响应时间分布、吞吐量趋势(横坐标根据时长优化,120s 用 5s 间隔,最大 15 个刻度)。
    • 报告和图片存储在 history/{jmx_name-YYYYMMDD-num_threads-duration}/
  • 预测分析

    • 分析 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.pngresponse_dist.pngthroughput_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

代码结构

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}

安装说明

  1. 安装 JMeter

  2. 创建虚拟环境

    python -m venv venv
    .\venv\Scripts\activate
    
    
  3. 安装 Python 依赖

    pip install streamlit pandas matplotlib jinja2 numpy -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 100
    
    
  4. 创建目录

    mkdir templates history
    
    
  5. 保存代码和模板

    • 保存 app.pyjmx_parser.py 到项目根目录。
    • 保存 report_template.htmltemplates/

使用说明

  1. 运行程序

    streamlit run app.py
    
    
    • 浏览器打开 Streamlit 界面(默认 http://localhost:8501)。
  2. 上传 JMX 文件

    • 上传 JMX 文件(如 my_test.jmx)。
    • 查看解析的线程组配置和接口列表(namepathmethod)。
  3. 执行压测

    • 点击“启动压测”,查看进度条和倒计时。
    • 压测完成后,文件存储在 history/{jmx_name-YYYYMMDD-num_threads-duration}/
  4. 生成报告

    • 点击“生成HTML报告”,查看性能报告(关键指标、聚合报告、图表)。
    • 报告保存为 history/.../performance_report.html
  5. 预测分析

    • 点击“进行预测分析”,查看性能指标和优化建议。

验证步骤

  1. 清理环境

    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
    
    
  2. 准备 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.

  3. 运行测试

    • 运行 streamlit run app.py
    • 上传 my_test.jmx,验证:
      • 接口列表显示 name: Login, path: /api/login, method: POSTname: 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.jmxtest_results.jtljmeter.log、图片、报告、metadata.jsondashboard_*/
      • 根目录无临时文件。
    • 点击“生成HTML报告”,验证报告生成。
    • 点击“进行预测分析”,验证指标和建议显示。

注意事项

  • JMX 文件格式:确保 JMX 包含 ThreadGroupHTTPSamplerProxyTestElement.name 优先。
  • 性能优化:JTL 分块加载(chunksize=10000)适合大文件(~59,955 行)。
  • 历史管理:自动保留最近 10 次历史,超出自动删除。
  • 错误排查
    • 若接口 name 仍错误,提供 JMX 文件内容。
    • 若压测失败,检查 jmeter.loghistory/.../jmeter.log
    • 若报告生成失败,验证 JTL 文件格式和 templates/ 文件存在。
  • 时间格式:归档目录使用 YYYYMMDD(如 20250922),基于系统时间(2025-09-22 16:44 JST)。

后续

代码后续更新。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容