🚀 JSON到JMX-自动化API性能优化系统
一个智能的、端到端的自动化工作流程,用于发现API、测试其性能,并通过人工反馈进行优化。
📋 目录
🎯 概述
此存储库演示了API发现和性能测试的完整管道:
- 使用无头浏览器和LLM的建议来抓取正在运行的web应用程序,以探索页面和表单。
- 记录应用程序发出的所有HTTP请求并将其写入 邮递员集合JSON.
- 将该集合转换为 JMeter
.jmx测试计划 使用Python转换器。 - 在Docker容器中运行JMeter计划以产生性能结果(CSV/HTML)。
- 提供一个简单的FastMCP服务器,将转换和执行步骤作为可调用工具公开,实现与人工智能代理或Claude desktop等桌面客户端的集成。
- 允许循环中的人员审查结果并重新运行管道,直到API达到性能预期。
该系统有意最小化,以便即使是初学者也能遵循流程。它可以扩展到更复杂的应用程序和更丰富的测试场景。
______________________________________________________________________
✨ 特性
| 特性 | 描述 |
|---|---|
| 🔍 自动提取API | 爬网目标URL并发现所有API终结点 |
| 📦 邮差收藏生成 | 自动生成与Postman兼容的JSON集合 |
| 🔄 智能转换 | 转换邮递员→ JMX与 convert_postman_to_jmx.py |
| 🐳 Docker集成JMeter | 在Docker中运行JMeter(无需手动设置) |
| 📈 丰富的报告 | 生成HTML+CSV性能仪表板 |
| 🔄 人在循环优化 | 用于性能调优的交互式工作流程 |
| 🤖 MCP服务器集成 | 为Claude Desktop和AI代理提供工具 postman_to_jmx 和 run_jmeter |
| 📊 实时监控 | 使用实时仪表板跟踪测试进度 |
| 🎯 重新运行能力 | 使用不同配置轻松重新运行测试 |
______________________________________________________________________
📁 仓库结构
.
├── agent.py # Selenium crawler that builds a Postman collection
├── convert_postman_to_jmx.py # Library + CLI that transforms a Postman JSON to a JMeter JMX
├── server.py # FastMCP server exposing `postman_to_jmx` and `run_jmeter` tools
├── demo_app/ # Sample Django application with user dashboard and CRUD APIs
├── data/ # Example files and runtime output (collections, JMX, results)
│ ├── sample.postman_collection.json
│ ├── sample.jmx
│ ├── results.csv
│ └── output/ # default write location for new collections/jmx
├── mcp.json # MCP configuration used by the server
└── README.md # You are here______________________________________________________________________
📊 工作流程图
flowchart LR
subgraph App["🚀 Application Layer"]
A["Django Web App"]
end
subgraph Auto["⚙️ Automation Pipeline"]
B["agent.py
Selenium + LLM"]
C["Postman Collection
JSON Configuration"]
D["convert_postman_to_jmx
JMeter Converter"]
E["JMeter
Docker Container"]
end
subgraph Out["📊 Outputs"]
F["CSV / HTML Report
Performance Metrics"]
end
subgraph MCP["🔧 MCP Server"]
M["server.py
Tool Integration"]
end
A --> B
B --> C
C --> D
D --> E
E --> F
D M
E M
F --> H["Human reviews results and decides to rerun"]
A:::app
E:::tool
D:::tool
C:::tool
B:::tool
F:::output
M:::tool
M:::tool
classDef app fill:#f4f1ea,stroke:#6b5b45,stroke-width:2px,color:#2b2b2b,font-size:14px
classDef tool fill:#e8f3ff,stroke:#3b6ea5,stroke-width:2px,color:#1f2d3d,font-size:14px
classDef output fill:#f1f9f2,stroke:#2f7d4e,stroke-width:2px,color:#1f2d3d,font-size:14px🚀 系统的工作原理
- 从URL提取API: 爬虫(
agent.py)使用Selenium导航前端。它向LLM(OpenAI GPT)请求简洁的下一步操作,如单击链接或填写表单,并记录由此产生的网络请求。 - 生成邮差收藏: 所有观察到的请求都附加到一个集合对象并写入JSON文件。
- 转换为JMX: 这
PostmanToJMeterConverter类读取JSON并构建等效的JMeter测试计划,保留标头、参数、正文和基本断言。 - 运行JMeter: 使用Docker镜像
justb4/jmeter,计划已执行(run_jmeter工具)。结果以CSV格式捕获,JMeter本身可以将其转换为HTML。 - 人在环审批: 测试人员检查性能报告。如果未达到服务级别目标,他们可以调整原型或使用不同的代理设置重试。
______________________________________________________________________
💻 使用指南
先决条件
- Python 3.9+
pip install selenium webdriver-manager openai mcp- Docker已安装并正在运行
- (可选)设置
OPENAI_API_KEY环境变量,以在代理中使用LLM建议功能。
运行Django演示应用程序
cd demo_app
python manage.py migrate
python manage.py runserver运行爬虫代理
python ../agent.py http://127.0.0.1:8000选项:
-o/--output–指定Postman集合的输出路径(默认data/output/collection.json).-m/--max-pages–可访问的最大页面数(默认值为10)。
将集合转换为JMX
局部的,局部的:
python convert_postman_to_jmx.py data/output/collection.json -o data/output/testplan.jmx通过MCP服务器 (先启动服务器):
python server.py
# Then use an MCP client or Claude Desktop to call the tool:
# tool name postman_to_jmx collection="$(<data/output/collection.json)" output="data/output/testplan.jmx"如果目录不存在,则会自动创建。
通过MCP运行JMeter
# using an MCP client:
# tool name run_jmeter jmx_path="data/output/testplan.jmx" results_path="data/results.csv"默认结果路径为 data/results.csv 必要时将创建文件夹。
审查和迭代
打开 data/results.csv (或使用JMeter转换为HTML)以查看响应时间、错误率等。调整代理参数或应用程序逻辑,并根据需要重复。
______________________________________________________________________
了解输出文件
| 文件 | 目的 |
|---|---|
output.jmx | Jmeter测试计划 |
results.csv | 原始性能结果 |
index.html | 交互式性能仪表板 |
🤝 贡献
这个项目是一个学习/演示工具。非常欢迎提出建议、错误报告和拉取请求。
贡献:
- 分叉存储库。
- 创建要素分支(
git checkout -b feature/awesome)如果可能的话,添加测试。 - 提交一个拉取请求,明确描述您的更改。
______________________________________________________________________
