{"id":37674425,"url":"https://github.com/ljxpython/locust_framework","last_synced_at":"2026-01-16T12:10:08.889Z","repository":{"id":296631034,"uuid":"863963847","full_name":"ljxpython/locust_framework","owner":"ljxpython","description":"一个基础的locust压测框架,可以拿过来在这个框架基础上进行二次开发","archived":false,"fork":false,"pushed_at":"2025-08-29T07:00:10.000Z","size":1496,"stargazers_count":14,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-29T11:05:13.043Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ljxpython.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-27T08:36:45.000Z","updated_at":"2025-07-28T08:59:27.000Z","dependencies_parsed_at":"2025-08-29T09:03:53.090Z","dependency_job_id":"4a11b98b-dfde-4360-8b47-1a981f59c282","html_url":"https://github.com/ljxpython/locust_framework","commit_stats":null,"previous_names":["ljxpython/locust_framework"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ljxpython/locust_framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ljxpython%2Flocust_framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ljxpython%2Flocust_framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ljxpython%2Flocust_framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ljxpython%2Flocust_framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ljxpython","download_url":"https://codeload.github.com/ljxpython/locust_framework/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ljxpython%2Flocust_framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478479,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-16T12:10:08.631Z","updated_at":"2026-01-16T12:10:08.784Z","avatar_url":"https://github.com/ljxpython.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Locust性能测试框架\n\n[![Python Version](https://img.shields.io/badge/python-3.7%2B-blue.svg)](https://python.org)\n[![Locust Version](https://img.shields.io/badge/locust-2.0%2B-green.svg)](https://locust.io)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg)](docs/README.md)\n\n\u003e 🎯 **企业级性能测试解决方案** - 基于Locust框架的二次开发，支持分层架构、松耦合、高内聚的设计原则\n\n一个功能强大、易于扩展的性能测试框架，专为现代化测试需求而设计。框架采用插件化架构，支持多种负载模式、实时监控、智能分析和多渠道告警，让性能测试变得更加简单高效。\n\n## ✨ 核心特性\n\n### 🎯 **测试执行增强**\n- **集合点功能** - 支持并发事务同步执行\n- **自定义事务** - 灵活的事务统计和报告\n- **自定义参数** - 动态参数传递和配置\n- **优雅停止** - 智能的测试终止机制\n\n### 📊 **数据管理**\n- **动态数据获取** - 支持CSV、数据库、API等多种数据源\n- **分布式数据编排** - 智能的数据分发和同步\n- **测试数据生成** - 基于Faker的多样化数据生成\n- **数据提供策略** - 轮询、随机、顺序等分发策略\n\n### 📈 **性能分析**\n- **智能评级系统** - A-D等级自动评估\n- **多维度指标** - 响应时间、吞吐量、错误率等\n- **趋势分析** - 历史数据对比和预测\n- **可视化报告** - 丰富的图表和报告模板\n\n### 🔔 **监控告警**\n- **实时监控** - 系统资源和性能指标监控\n- **多级告警** - 信息、警告、严重等级别\n- **多渠道通知** - 飞书、钉钉、邮件、企业微信\n- **告警规则** - 灵活的阈值配置和触发条件\n\n### 🔌 **插件生态**(试用版,有bug)\n- **插件架构** - 多种插件类型支持\n- **热插拔** - 动态加载和卸载插件\n- **扩展接口** - 标准化的插件开发接口\n- **内置插件** - 丰富的开箱即用功能\n\n### 🌊 **负载形状**\n- **7种负载模式** - 波浪、阶梯、尖峰、自适应等\n- **自定义形状** - 支持复杂负载场景设计\n- **动态调整** - 运行时负载参数调整\n- **场景编排** - 多阶段负载组合\n\n### 🔗 **平台集成**\n- **第三方集成** - 支持嵌入测试平台(PS:已经嵌入到个人开发的[测试平台](https://www.coder-ljx.cn:7524/user/login) test/test)\n- **API接口** - 完整的REST API\n\n## 🚀 快速开始\n\n### 安装要求\n\n- Python 3.7+\n- 推荐使用虚拟环境\n\n### 快速安装\n\n```bash\n# 克隆项目\ngit clone git@github.com:ljxpython/locust_framework.git\ncd locust_framework\n\n# 创建虚拟环境\npython -m venv venv\nsource venv/bin/activate  # Linux/Mac\n# 或 venv\\Scripts\\activate  # Windows\n\n# 安装依赖\npip install -r requirements.txt\n```\n\n### 5分钟上手\n\n1. **创建测试脚本**\n```python\n# locustfiles/quickstart.py\nfrom locust import HttpUser, task\nfrom src.utils.locust_report import manual_report\n\nclass QuickStartUser(HttpUser):\n    host = \"https://httpbin.org\"\n\n    @task\n    def test_get(self):\n        with manual_report(\"GET请求测试\"):\n            self.client.get(\"/get\")\n\n    @task(2)  # 权重为2\n    def test_post(self):\n        with manual_report(\"POST请求测试\"):\n            self.client.post(\"/post\", json={\"key\": \"value\"})\n```\n\n2. **启动Web UI测试**\n```bash\n# 使用Make命令（推荐）\nmake run-web script=locustfiles/quickstart.py\n\n# 或使用原生Locust命令\nlocust -f locustfiles/quickstart.py\n```\n\n3. **访问Web界面**\n   - 打开浏览器访问 http://localhost:8089\n   - 设置用户数和启动速率\n   - 开始测试并查看实时结果\n\n4. **无头模式测试**\n```bash\n# 快速执行\nmake run script=locustfiles/quickstart.py u=10 r=2 t=60s\n\n# 完整参数\nlocust -f locustfiles/quickstart.py --headless -u 10 -r 2 -t 60s --html=reports/report.html\n```\n\n### 📚 详细文档\n\n- **[📖 完整文档](docs/README.md)** - 详细的使用指南和API参考\n- **[🚀 快速开始](docs/getting-started/quickstart.md)** - 5分钟快速上手\n- **[🏗️ 架构设计](docs/architecture/overview.md)** - 系统架构和设计理念\n- **[🔌 插件开发](docs/development/plugin-development.md)** - 插件开发完整指南\n- **[⚙️ 配置参考](docs/configuration/framework-config.md)** - 详细配置说明\n- **[💡 使用示例](docs/examples/basic-examples.md)** - 丰富的实战示例\n\n## 📁 项目结构\n\n```\nlocust_framework/\n├── 📁 conf/                    # 配置文件\n│   ├── config.py              # 配置管理\n│   ├── constants.py           # 常量定义\n│   └── settings.yaml          # 主配置文件\n├── 📁 docs/                    # 文档系统\n│   ├── getting-started/       # 入门指南\n│   ├── architecture/          # 架构文档\n│   ├── api/                   # API参考\n│   ├── development/           # 开发指南\n│   ├── examples/              # 使用示例\n│   └── configuration/         # 配置参考\n├── 📁 locustfiles/             # 测试脚本\n│   ├── demo.py               # 示例脚本\n│   ├── shape_classes/        # 负载形状类\n│   └── test_*/               # 测试场景目录\n├── 📁 src/                     # 核心源码\n│   ├── analysis/             # 性能分析模块\n│   ├── monitoring/           # 监控告警模块\n│   ├── data_manager/         # 数据管理模块\n│   ├── plugins/              # 插件系统\n│   ├── notifications/        # 通知服务\n│   ├── load_shapes/          # 负载形状\n│   ├── client/               # 客户端封装\n│   ├── model/                # 数据模型\n│   └── utils/                # 工具模块\n├── 📁 reports/                 # 测试报告\n├── 📁 logs/                    # 日志文件\n├── main.py                   # 主程序入口\n├── requirements.txt          # 依赖列表\n└── README.md                # 项目说明\n```\n\n## 🎯 主要功能详解\n\n### 🔧 自定义参数系统\n\n框架支持灵活的参数传递和配置管理，让测试更加可控和可配置。\n\n**核心特性：**\n- ✅ 支持指定轮数`loop_num`后自动停止压测\n- ✅ 支持使用集合点且自定义集合数`rendezvous_num`\n- ✅ 支持其他业务相关参数通过Web/终端传入\n- ✅ 环境变量和配置文件支持\n\n### 📊 智能性能分析\n\n基于多维度指标的智能分析系统，提供专业的性能评估。\n\n**分析维度：**\n- 📈 **响应时间分析** - P50/P90/P95/P99百分位数\n- 🚀 **吞吐量分析** - TPS、并发处理能力\n- ❌ **错误率分析** - 错误分布和根因分析\n- 📊 **稳定性分析** - 性能波动和趋势预测\n- 🎯 **综合评级** - A-D等级自动评估\n\n### 🔔 多渠道告警通知\n\n实时监控和智能告警，确保问题及时发现和处理。\n\n**支持渠道：**\n- 🚀 **飞书** - 支持富文本消息和@功能\n- 📱 **钉钉** - 群机器人消息推送\n- 📧 **邮件** - SMTP邮件通知\n- 💬 **企业微信** - 企业内部消息通知\n\n### 🌊 多样化负载形状\n\n支持7种内置负载模式，满足不同测试场景需求。\n\n**负载模式：**\n- 📈 **波浪形** - 周期性负载变化\n- 🏗️ **阶梯形** - 逐步递增负载\n- ⚡ **尖峰形** - 突发流量测试\n- 🎯 **自适应** - 基于响应时间自动调整\n- 📊 **自定义** - 灵活的负载场景编排\n\n### 🔌 插件化架构\n\n强大的插件系统，支持功能扩展和定制化开发。\n\n**插件类型：**\n- 🧪 **Locust插件** - 扩展Locust核心功能\n- 📊 **报告插件** - 自定义报告格式和内容\n- 📡 **监控插件** - 系统和应用监控\n- 💾 **数据插件** - 数据源和存储扩展\n- 🔔 **通知插件** - 消息通知渠道扩展\n\n### 🎯 分布式测试支持\n\n天然支持分布式部署，轻松应对大规模性能测试需求。\n\n**分布式特性：**\n- 🏗️ **Master-Worker架构** - 支持多节点协同\n- 📊 **数据同步** - 智能的测试数据分发\n- 📈 **负载均衡** - 自动负载分配和调度\n- 🔄 **故障恢复** - 节点故障自动处理\n\n---\n\n## 📋 原有功能说明\n\n\u003e 基于locust框架进行二次开发: https://locust.io/\n\u003e\n\u003e 主要封装完善功能如下:\n\u003e\n\u003e 1. 集合点\n\u003e 2. 自定义事务\n\u003e 3. 自定义参数\n\u003e 4. 测试数据的动态获取及编排(可支持分布式的资源编排)\n\u003e 5. 压测报告优化\n\u003e 6. 优雅的停止压测\n\u003e 7. 第三方调用(该框架已经接入到作者自己开发的测试平台中)\n\u003e 8. 自动告警(支持邮件\\飞书\\钉钉群等消息上报)\n\u003e 9. 一些其他小的优化项\n\n\n\n\n\n---\n\n## 📖 使用指南\n\n### 🎯 测试执行方式\n\n框架支持多种测试执行方式，满足不同场景需求：\n\n#### 1. Web UI模式（推荐新手）\n\n```bash\n# 使用Make命令启动\nmake run-web script=locustfiles/demo.py\n\n# 或使用原生Locust命令\nlocust -f locustfiles/demo.py\n```\n\n**特点：**\n- 🌐 友好的Web界面\n- 📊 实时监控和图表\n- ⚙️ 可视化参数配置\n- 📈 动态负载调整\n\n#### 2. 无头模式（适合CI/CD）\n\n```bash\n# 快速执行\nmake run script=locustfiles/demo.py u=10 r=2 t=60s\n\n# 完整参数执行\nlocust -f locustfiles/demo.py --headless \\\n    --users 10 --spawn-rate 2 --run-time 60s \\\n    --html=reports/report.html \\\n    --csv=reports/results\n```\n\n**特点：**\n- 🚀 自动化执行\n- 📋 命令行参数控制\n- 📊 自动生成报告\n- 🔄 适合持续集成\n\n#### 3. 分布式模式（大规模测试）\n\n```bash\n# 启动Master节点\nlocust -f locustfiles/demo.py --master\n\n# 启动Worker节点\nlocust -f locustfiles/demo.py --worker --master-host=\u003cmaster-ip\u003e\n\n# 多进程Worker\nlocust -f locustfiles/demo.py --worker --processes 4\n```\n\n**特点：**\n- 🏗️ 多节点协同\n- 📈 线性扩展能力\n- 🔄 故障自动恢复\n- 📊 统一结果收集\n\n### 🔧 自定义参数配置\n\n框架提供强大的参数化能力，支持灵活的测试配置：\n\n#### 参数定义示例\n\n```python\n@events.init_command_line_parser.add_listener\ndef _(parser):\n    parser.add_argument(\"--product_id\", type=str, default=\"1925511528732168192\", help=\"测试业务ID\")\n    parser.add_argument(\"--loop_num\", type=int, default=1, help=\"执行轮数\")\n    parser.add_argument(\"--is_rendezvous\", type=str_to_bool, default=False, help=\"是否使用集合点\")\n    parser.add_argument(\"--rendezvous_num\", type=int, default=1, help=\"集合点数量\")\n```\n\n#### 参数使用示例\n\n```python\nclass WebsiteUser(HttpUser):\n    @task\n    def my_task(self):\n        # 获取自定义参数\n        loop_num = self.environment.parsed_options.loop_num\n        product_id = self.environment.parsed_options.product_id\n\n        # 使用集合点\n        if self.environment.parsed_options.is_rendezvous:\n            with self.environment.shared:\n                # 并发执行的业务逻辑\n                self.client.get(f\"/api/product/{product_id}\")\n```\n\n### 📊 性能分析和报告\n\n框架提供智能的性能分析和丰富的报告功能：\n\n#### 自动性能分析\n\n- **响应时间分析** - P50/P90/P95/P99百分位数\n- **吞吐量分析** - TPS和并发处理能力\n- **错误率分析** - 错误分布和根因分析\n- **综合评级** - A-D等级自动评估\n\n#### 多格式报告\n\n- **HTML报告** - 交互式图表和详细分析\n- **CSV数据** - 原始数据导出和二次分析\n- **JSON格式** - API集成和自动化处理\n- **实时监控** - Web界面实时数据展示\n\n### 🔔 监控告警配置\n\n#### 告警规则配置\n\n```yaml\n# conf/settings.yaml\nmonitoring:\n  alerts:\n    response_time:\n      warning: 1000  # 1秒警告\n      critical: 3000 # 3秒严重\n    error_rate:\n      warning: 5     # 5%警告\n      critical: 10   # 10%严重\n    throughput:\n      warning: 100   # 低于100 TPS警告\n```\n\n#### 通知渠道配置\n\n```yaml\nnotifications:\n  feishu:\n    webhook_url: \"https://open.feishu.cn/open-apis/bot/v2/hook/xxx\"\n    enabled: true\n  dingtalk:\n    webhook_url: \"https://oapi.dingtalk.com/robot/send?access_token=xxx\"\n    enabled: true\n  email:\n    smtp_server: \"smtp.gmail.com\"\n    smtp_port: 587\n    enabled: true\n```\n\n### 🌊 负载形状使用\n\n框架支持多种负载模式，模拟真实的用户行为：\n\n#### 使用负载形状\n\n```python\n# 在测试脚本中继承负载形状类\nfrom locustfiles.shape_classes.wave_shape import WaveLoadShape\n\nclass MyTestUser(HttpUser):\n    # 测试逻辑\n    pass\n\n# 使用命令行选择负载形状\nlocust -f test.py --class-picker WaveLoadShape\n```\n\n#### 可用负载模式\n\n- **WaveLoadShape** - 波浪形负载\n- **SpikeLoadShape** - 尖峰负载\n- **StairStepLoadShape** - 阶梯负载\n- **AdaptiveLoadShape** - 自适应负载\n\n### 🔌 插件使用\n\n#### 启用插件\n\n```yaml\n# conf/settings.yaml\nplugins:\n  enabled:\n    - performance_analyzer\n    - system_monitor\n    - notification_service\n    - data_manager\n```\n\n#### 自定义插件\n\n```python\nfrom src.plugins.base import BasePlugin\n\nclass MyCustomPlugin(BasePlugin):\n    def on_test_start(self, environment, **kwargs):\n        # 测试开始时的逻辑\n        pass\n\n    def on_test_stop(self, environment, **kwargs):\n        # 测试结束时的逻辑\n        pass\n```\n\n---\n\n## 📋 详细功能说明\n\n### 🔧 自定义参数详细说明\n\n框架支持灵活的参数传递和配置管理：\n\n1. **封装测试框架** - 支持指定轮数`loop_num`后自动停止压测\n2. **集合点功能** - 支持使用集合点且自定义集合数`rendezvous_num`\n3. **业务参数** - 支持其他业务相关参数通过web/终端传入\n\n### 📊 智能性能分析\n\n基于多维度指标的智能分析系统：\n\n- **响应时间分析** - P50/P90/P95/P99百分位数统计\n- **吞吐量分析** - TPS和并发处理能力评估\n- **错误率分析** - 错误分布和根因分析\n- **稳定性分析** - 性能波动和趋势预测\n- **综合评级** - A-D等级自动评估系统\n\n### 🔔 多渠道告警通知\n\n实时监控和智能告警系统：\n\n- **飞书通知** - 支持富文本消息和@功能\n- **钉钉通知** - 群机器人消息推送\n- **邮件通知** - SMTP邮件告警\n- **企业微信** - 企业内部消息通知\n\n### 🌊 多样化负载形状\n\n支持7种内置负载模式：\n\n- **波浪形负载** - 周期性负载变化模拟\n- **阶梯形负载** - 逐步递增负载测试\n- **尖峰形负载** - 突发流量压力测试\n- **自适应负载** - 基于响应时间自动调整\n- **自定义负载** - 灵活的负载场景编排\n\n### 🎯 分布式测试支持\n\n天然支持分布式部署：\n\n- **Master-Worker架构** - 支持多节点协同测试\n- **数据同步机制** - 智能的测试数据分发\n- **负载均衡** - 自动负载分配和调度\n- **故障恢复** - 节点故障自动处理机制\n\n---\n```bash\n.\n├── README.md\n├── conf\n│   ├── config.py\n│   ├── constants.py\n│   ├── settings.local.yaml\n│   └── settings.yaml\n├── docs\n│   └── pics\n│       └── img.png\n├── locustfiles\n│   ├── demo.py\n│   ├── shape_classes\n│   │   └── __init__.py\n│   ├── test.py\n│   ├── test_demo\n│   │   └── test_good.py\n│   └── test_user\n│       ├── __init__.py\n│       ├── __pycache__\n│       │   └── test_user.cpython-312.pyc\n│       └── test_user.py\n├── logs\n│   └── test.log\n├── main.py\n├── poetry.lock\n├── pyproject.toml\n├── reports\n├── requirements.txt\n├── src\n│   ├── client\n│   │   ├── __init__.py\n│   │   └── demo_client\n│   │       ├── flask_auth.py\n│   │       ├── flask_client.py\n│   │       └── response.py\n│   ├── model\n│   │   ├── __init__.py\n│   │   ├── __pycache__\n│   │   │   ├── locust_test.cpython-312.pyc\n│   │   │   └── modelsbase.cpython-312.pyc\n│   │   ├── auto_pytest.py\n│   │   ├── locust_test.py\n│   │   └── modelsbase.py\n│   └── utils\n│       ├── __init__.py\n│       ├── file_operation.py\n│       ├── locust_report.py\n│       ├── log_moudle.py\n│       ├── rendezvous.py\n│       ├── robot.py\n│       └── util.py\n├── stop_locust.py\n└── stop_locust.sh\n\n\n```\n\n\n\n\n\n\n\n\n## 自定义参数如何使用\n\n1. 封装测试框架,支持指定轮数`loop_num`后自动停止压测\n2. 支持使用集合点且自定义集合数`rendezvous_num`\n3. 支持其他业务相关参数通过web/终端传入\n\n\n\n\n\n\n\n### 在压测文件内定义自定义参数\n\n```\n@events.init_command_line_parser.add_listener\ndef _(parser):\n    parser.add_argument(\"--product_id\", type=str, env_var=\"product_id\", default=\"1925511528732168192\", help=\"测试业务\")\n    parser.add_argument(\"--node_num\", type=int, env_var=\"node_num\", default=1, help=\"测试的node数量\")\n    parser.add_argument(\"--pod_num\", type=int, env_var=\"pod_num\", default=1, help=\"测试的pod数量\")\n    parser.add_argument(\"--loop_num\", type=int, env_var=\"loop_num\", default=1, help=\"执行的轮数\")\n    parser.add_argument(\"--is_rendezvous\",  type=str_to_bool,default=False, help=\"是否使用集合点\")\n    parser.add_argument(\"--rendezvous_num\", type=int, env_var=\"rendezvous_num\", default=1, help=\"集合点的数量\")\n```\n\n### 如何在压测任务中调用\n\n使用`self.environment.parsed_options.xxxx` 的方式调用\n\n```\nclass WebsiteUser(HttpUser):\n    host = \"127.0.0.1\"\n    @task\n    def my_task(self):\n        global num\n        num += 1\n        time.sleep(1)\n        loop_num = self.environment.parsed_options.loop_num\n        # 集合点\n        if self.environment.parsed_options.is_rendezvous:\n            with self.environment.shared:\n                print('业务逻辑')\n        # 当达到指定轮数后停止\n        if loop_num \u003c num:\n            self.environment.runner.quit()  # 强制停止所有虚拟用户\n```\n\n\n\n### 无UI方式调用\n\n- make方式执行\n\n```\nmake run  script=locustfiles/xxxx.py u=2 r=1 is_rendezvous=false loop_num=10\n```\n\n- locust原生方式执行\n\n```\nlocust -f locustfiles/cubelinux/xxxx.py --headless \\\n                --product_id 0 \\\n                --loop_num 10 \\\n                --rendezvous_num 0 \\\n                --is_rendezvous false \\\n                --csv=logs/xxx \\\n                --html=logs/locustfiles/xxxx.html \\\n                -u 2 -r 1 -t 5m -s 100\n\n```\n\n\n\n\n\n### UI方式调用\n\n- make方式执行\n\n```\nmake run-web  script=locustfiles/xxxx.py u=2 r=1 is_rendezvous=false loop_num=10\n```\n\n- locust原生方式执行\n\n```\nlocust -f locustfiles/cubelinux/xxxx.py  \\\n                -u 2 -r 1 -t 5m -s 100\n\n```\n\n\n\n前端选择参数\n\n![image-20250531202135855](./assets/image-20250531202135855.png)\n\n\n\n## web UI 方式压测\n\n可以在web页面选择压测场景的及其权重\n\n可以在web页面选择自定义变量\n\n\n\n- make方式执行\n\n```\nmake run-web  script=locustfiles/xxxx.py u=2 r=1 is_rendezvous=false loop_num=10\n```\n\n- locust原生方式执行\n\n```\nlocust -f locustfiles/cubelinux/xxxx.py  \\\n                -u 2 -r 1 -t 5m -s 100\n\n```\n\n\n\n\n\n\n\n## 无头方式压测\n\n压测权重需预先标注,通过`--xxx xxx`的方式填写自定义变量\n\n- make方式执行\n\n```\nmake run  script=locustfiles/xxxx.py u=2 r=1 is_rendezvous=false loop_num=10\n```\n\n- locust原生方式执行\n\n```\nlocust -f locustfiles/cubelinux/xxxx.py --headless \\\n                --product_id 0 \\\n                --loop_num 10 \\\n                --rendezvous_num 0 \\\n                --is_rendezvous false \\\n                --csv=logs/xxx \\\n                --html=logs/locustfiles/xxxx.html \\\n                -u 2 -r 1 -t 5m -s 100\n\n```\n\n\n\n\n\n## 如何分布式压测\n\n当压测的量级比较大时,一台开发机或者单线程不能满足需求,就需要多线程多开发机配合了,这方面locust天然支持,就不需要我进行二次封装了,方式如下:\n\n### 启动master节点\n\n这一步是必须的,之后让其他的woker节点加入\n\n```\nlocust -f locustfile.py --master\n```\n\n![image-20250531205049805](./assets/image-20250531205049805.png)\n\n### woker节点加入\n\n`processes ` 参数代表开启的进程数\n\n```\n# 同一服务器加入\n locust -f - --worker --processes 4\n# 其他开发机\nlocust -f - --worker --processes 1  --master-host 127.0.0.1\n```\n\n![image-20250531205141426](./assets/image-20250531205141426.png)\n\n\n\n\n\n这里只提到了如何运行分布式压测,但是对于分布式压测变量如何管理,数据如何分配,因为篇幅太长,我并没有做介绍,感兴趣的可以查阅我博客的相关章节\n\n## 自定义场景编写\n\n不需要考虑并发应该如何设计,只需要考虑单个user的代码逻辑编排,可以像接口测试一样,只关注接口的参数化\\接口间关联传参\\断言的处理\n\n接口一般有同步接口和异步接口,对于异步接口,封装了轮训功能,可以定期轮训查询异步完成的功能\n\n断言部分,支持常用的接口状态断言,响应结果断言,熟悉断言使用的方法后,可大大减轻脚本编写工作者的开发时间\n\n\n\n## 自定义事务统计\n\n```\nfrom src.utils.locust_report import manual_report, measure\n\nclass WebsiteUser(HttpUser):\n    host = \"127.0.0.1\"\n\n    @task\n    def my_task(self):\n        with manual_report(\"my_task\"):\n            time.sleep(1)\n        # 如果使用measure,需自定义实现开始及结束时间及exception\n        measure(name=\"order\", start_time=start_time,end_time=status['time'],exception=LocustError(f\"host_id: {host} 订购失败\"))\n\n```\n\n统计结果如下\n\n![image-20250601103425608](./assets/image-20250601103425608.png)\n\nHTML报告统计结果相同:\n\n![image-20250601103515708](./assets/image-20250601103515708.png)\n\n\n\n\n\n![image-20250601103247786](./assets/image-20250601103247786.png)\n\n\n\n## 自定义压测策略\n\n有时候我们希望的压测的模型不是先升然后平稳的运行,而是升降突然拉升等等一些模型的设计,在`locustfiles/shape_classes`目录下,封装几种场景的场景,也可以基于该场景进行二次开发\n\n如何调用:在脚本中继承`locustfiles/shape_classes`下的相关类,在传参时加入`--class-picker`参数来选择要使用的形状即可\n\n\n\n## 集合点如何使用\n\n集合点:当需要指定事务同时执行时,需要使用集合点的功能,locust本身未提供需使用协程的信号量进行二次封装,支持参数指定或者动态指定集合数在集合点并发执行事务的功能\n\n如下是一个简单的demo\n\n```\nfrom util.rendezvous import Rendezvous\n\n\n@events.test_start.add_listener\ndef init_shared_service(environment, **kwargs):\n    # 仅在Master节点或独立运行模式初始化\n    if not isinstance(environment.runner, WorkerRunner):\n        environment.shared = Rendezvous(environment.parsed_options.rendezvous_num)\n\nclass WebsiteUser(HttpUser):\n    host = \"127.0.0.1\"\n    @task\n    def my_task(self):\n        global num\n        num += 1\n        time.sleep(1)\n        loop_num = self.environment.parsed_options.loop_num\n        # 集合点\n        if self.environment.parsed_options.is_rendezvous:\n            with self.environment.shared:\n                print('业务逻辑')\n        # 当达到指定轮数后停止\n        if loop_num \u003c num:\n            self.environment.runner.quit()  # 强制停止所有虚拟用户\n```\n\n\n\n## 压测报告优化\n\n如果使用make方式执行,则在测试完成或者终止后,自动生成报告,也支持自动上传到云存储服务器中\n\n测试报告的格式如下:\n\n![image-20250531211159524](./assets/image-20250531211159524.png)\n\n如果第三方接入,实现`main.py`中的`run_test()`方式,则测试报告格式如下:\n\n![image-20250531211606483](./assets/image-20250531211606483.png)\n\n## 测试数据的动态获取及编排(可支持分布式的资源编排)\n\n这里说一下思路: 复杂的可以使用中间件,类似于Redis这些进行资源管理,简单的可以使用locust的原生`send_message`方法实现\n\n既支持csv文件指定,也支持测试时,在前置准备环境生成测试数据,且动态分配给指定的user使用\n\n\n\n\n\n## 其他使用方式\n\n- 支持飞书\\钉钉\\邮箱等消息告警\n- client优化\n- log封装优化\n\n该框架是基于locust进行的二次开发,使其变得更加好用\n\n我在这里想说的,这只是一个工具,能帮助我们更好的完成性能测试,除了工具外,我认为更重要的还是,如何进行场景的设计及指标的设定,需求明确,才能把真正的风险暴露出来.\n\n关于如何开展性能测试,感兴趣的小伙伴可以参考我的文章:性能测试那二三事\n\n\n\n\n\n## 支持嵌入第三方测试平台使用\n\n实现`main.py`中的`run_test()`方式即可\n\n目前作者已经相关该框架嵌入到了自己的自动化测试平台中:https://www.coder-ljx.cn:7524/locust/locustcaselist\n\n\n\n\n\n\n\n\n\n## locust 使用经验\n\n请查阅作者博客的相关章节,里面总结了我在工作中各种场景下,使用locust进行压测的经验总结,希望能帮到你\n\n\n\n---\n\n## 🤝 贡献指南\n\n欢迎所有形式的贡献！无论是bug报告、功能请求、代码贡献还是文档改进。\n\n### 如何贡献\n\n1. **Fork项目** - 点击右上角的Fork按钮\n2. **创建分支** - `git checkout -b feature/your-feature-name`\n3. **提交更改** - `git commit -am 'Add some feature'`\n4. **推送分支** - `git push origin feature/your-feature-name`\n5. **创建PR** - 在GitHub上创建Pull Request\n\n### 贡献类型\n\n- 🐛 **Bug修复** - 发现并修复问题\n- ✨ **新功能** - 添加新的功能特性\n- 📚 **文档改进** - 完善文档和示例\n- 🧪 **测试用例** - 增加测试覆盖率\n- 🔧 **工具优化** - 改进开发工具和流程\n\n### 开发规范\n\n- 遵循[编码规范](docs/development/coding-standards.md)\n- 添加适当的测试用例\n- 更新相关文档\n- 确保CI/CD流程通过\n\n## 📄 许可证\n\n本项目采用 [MIT License](LICENSE) 开源协议。\n\n## 🌟 致谢\n\n感谢所有为这个项目做出贡献的开发者和用户！\n\n特别感谢：\n- [Locust](https://locust.io/) - 优秀的负载测试框架\n- 所有提供反馈和建议的用户\n- 开源社区的支持和贡献\n\n## 📞 联系我\n\n### 技术支持\n\n### 作者联系方式\n\n也欢迎和您交流讨论😊\n\n**个人微信号**\n\n\u003cimg src=\"./assets/image-20250531212549739.png\" alt=\"个人微信二维码\" width=\"300\"/\u003e\n\n\n\n---\n\n**⭐ 如果这个项目对您有帮助，请给我一个Star！**\n\n**🔗 项目链接**: [GitHub Repository](https://github.com/ljxpython/locust_framework)\n\n**📖 在线文档**: [完整文档](docs/README.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fljxpython%2Flocust_framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fljxpython%2Flocust_framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fljxpython%2Flocust_framework/lists"}