欢迎来到压力测试的世界!在这里,我们将使用Locust这个强大的工具,给你的系统来一场"压力山大"的测试。别担心,我们会一步步教你如何驯服这群"蝗虫"!
Locust是一个开源的负载测试工具,它可以模拟成千上万的用户同时访问你的系统。就像一群蝗虫一样,密密麻麻地"攻击"你的服务器,测试系统在高并发下的表现。
- 🐍 Python编写: 测试脚本简单易懂
- 🌐 Web界面: 实时监控测试过程
- 📊 丰富报告: 详细的性能数据分析
- 🔄 分布式测试: 支持多机器协同压测
- 🎯 灵活配置: 可以模拟各种用户行为
- QPS (Queries Per Second): 每秒查询数
- 响应时间: 请求从发出到收到响应的时间
- 并发用户数: 同时在线的虚拟用户数量
- 错误率: 失败请求占总请求的比例
- 吞吐量: 单位时间内处理的数据量
- 🔥 负载测试: 验证系统在预期负载下的表现
- ⚡ 压力测试: 找到系统的性能极限
- 💥 峰值测试: 测试系统在突发流量下的表现
- ⏱️ 稳定性测试: 长时间运行验证系统稳定性
和接口测试一样,压测用例也可以自动同步:
- 进入 "压力测试" → "用例管理"
- 点击 "同步压测用例" 按钮
- 选择要同步的模块
- 等待同步完成
# Locust测试脚本示例
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 3) # 用户操作间隔1-3秒
@task(3) # 权重为3,执行频率更高
def view_homepage(self):
self.client.get("/")
@task(1) # 权重为1
def view_profile(self):
self.client.get("/profile")用例列表显示信息:
用例ID: locust_001
用例名称: 首页访问压测
所属模块: homepage_module
测试场景: 用户浏览首页
路径描述: 模拟用户访问首页的行为
标签: homepage, basic
更新时间: 2024-01-01 10:00:00
套件名称: 电商网站压测套件
套件描述: 模拟用户浏览商品、加购物车、下单等行为
所属项目: 电商项目
测试环境: test
压测类型: 负载测试
用户行为权重:
- 浏览商品: 60%
- 搜索商品: 20%
- 加购物车: 15%
- 下单支付: 5%
用户增长策略:
- 启动用户数: 10
- 最大用户数: 1000
- 增长速率: 10用户/秒
- 运行时长: 10分钟
- 选择压测套件
- 设置基本参数:
并发用户数: 100 增长速率: 10用户/秒 运行时长: 5分钟 目标主机: http://test.example.com - 点击 "开始压测"
{
"users": 1000, // 最大用户数
"spawn_rate": 50, // 每秒启动用户数
"run_time": "10m", // 运行时长
"host": "https://api.example.com",
"tags": ["api", "core"], // 标签过滤
"exclude_tags": ["slow"] // 排除标签
}当单机压测能力不够时,可以使用分布式压测:
# 启动Master节点
locust -f locustfile.py --master --web-host=0.0.0.0# 启动Worker节点
locust -f locustfile.py --worker --master-host=192.168.1.100Master节点: 192.168.1.100:8089
Worker节点:
- 192.168.1.101
- 192.168.1.102
- 192.168.1.103
总并发能力: 4000用户
压测运行时,可以实时查看:
- 📈 当前用户数: 实时在线虚拟用户
- ⚡ QPS: 当前每秒请求数
- ⏱️ 响应时间: 平均/最小/最大响应时间
- ❌ 错误率: 实时错误百分比
- 用户数增长曲线: 显示用户数随时间变化
- QPS变化曲线: 显示请求量变化趋势
- 响应时间分布: 显示响应时间分布情况
- 错误率趋势: 显示错误率变化
- ⏸️ 暂停压测: 暂停用户增长,保持当前用户数
▶️ 继续压测: 恢复用户增长- 🛑 停止压测: 立即停止所有压测
- 📊 调整参数: 动态调整用户数和增长速率
总请求数: 125,000
成功请求: 123,500 (98.8%)
失败请求: 1,500 (1.2%)
平均QPS: 2,083
峰值QPS: 2,500
平均响应时间: 45ms
50%分位数: 35ms
90%分位数: 78ms
95%分位数: 120ms
99%分位数: 250ms
最大响应时间: 1,200ms
连接超时: 800次 (53.3%)
HTTP 500错误: 500次 (33.3%)
HTTP 404错误: 200次 (13.4%)
显示整个压测过程中响应时间的变化趋势,帮助识别性能瓶颈出现的时间点。
展示每秒请求数的变化,可以看出系统的处理能力变化。
显示虚拟用户数的增长过程,验证压测是否按预期执行。
- HTML报告: 包含完整图表的网页报告
- CSV数据: 原始数据,便于进一步分析
- PDF报告: 适合打印和存档
- JSON数据: 用于系统集成和自动化分析
class EcommerceUser(HttpUser):
wait_time = between(1, 5)
def on_start(self):
# 用户登录
self.login()
@task(40)
def browse_products(self):
# 浏览商品
self.client.get("/products")
@task(20)
def search_products(self):
# 搜索商品
self.client.get("/search?q=手机")
@task(15)
def add_to_cart(self):
# 加购物车
self.client.post("/cart/add", json={"product_id": 123})
@task(5)
def checkout(self):
# 下单
self.client.post("/order/create")class ApiUser(HttpUser):
wait_time = between(0.5, 2)
@task(50)
def get_user_info(self):
self.client.get("/api/user/info")
@task(30)
def update_user_info(self):
self.client.put("/api/user/info", json={"name": "test"})
@task(20)
def get_user_orders(self):
self.client.get("/api/user/orders")阶段1: 0-100用户 (2分钟)
阶段2: 100-500用户 (3分钟)
阶段3: 500-1000用户 (5分钟)
阶段4: 保持1000用户 (10分钟)
波峰1: 0-500用户 (5分钟)
波谷1: 500-100用户 (2分钟)
波峰2: 100-800用户 (5分钟)
波谷2: 800-200用户 (2分钟)
问题: 点击开始压测后没有反应 解决方案:
- 检查Locust服务是否正常运行
- 确认压测套件配置是否正确
- 验证目标服务器是否可访问
- 检查防火墙和网络配置
问题: 错误率过高或响应时间异常 解决方案:
- 检查目标服务器性能状况
- 确认压测参数是否合理
- 验证网络带宽是否充足
- 检查压测脚本逻辑是否正确
问题: Worker节点无法连接Master 解决方案:
- 检查网络连通性
- 确认Master节点IP和端口
- 验证防火墙设置
- 检查Locust版本兼容性
- 环境隔离: 使用专门的测试环境
- 数据准备: 准备充足的测试数据
- 监控就绪: 确保系统监控正常
- 通知机制: 设置压测开始/结束通知
- 逐步增压: 不要一开始就用最大并发
- 实时监控: 密切关注系统指标
- 及时调整: 根据情况调整压测参数
- 记录问题: 及时记录发现的问题
- 关注趋势: 不只看平均值,要看趋势变化
- 定位瓶颈: 找出性能瓶颈的具体位置
- 对比分析: 与历史数据进行对比
- 制定优化: 根据结果制定优化方案
🎉 压测大师! 你已经掌握了压力测试的精髓。记住,压测不是为了"压垮"系统,而是为了让系统更强壮!