
压测场景设计思路
大约 8 分钟
压测场景设计思路
🎬 像导演一样设计压测"剧本":让测试更贴近真实!
压测场景设计就像拍电影写剧本,要有主角配角,要有高潮低谷,要有意外情况。
好的场景设计能让你发现真正的性能问题,而不是在实验室里"自嗨"!🎭
🤔 为什么场景设计这么重要?
想象一下两种压测方式:
❌ 错误方式:1000个用户疯狂点击登录按钮
- 结果:登录接口TPS很高,看起来很厉害
- 现实:真实用户不会这样使用系统
✅ 正确方式:模拟真实用户完整的购物流程
- 结果:发现了购物车、支付等真正的瓶颈
- 现实:这才是用户真正的使用方式
生活类比:就像测试汽车性能
- 只测最高时速:在测试场跑300km/h
- 测试真实场景:城市拥堵、高速巡航、山路爬坡
好的场景设计 = 真实的性能问题发现
🎯 场景设计的四大原则
1. 🎭 真实性原则 - "演得要像"
核心思想:模拟真实用户的行为模式
# ❌ 不真实的场景
def fake_scenario():
"""假的测试场景"""
while True:
login() # 用户不停登录?不现实!
# ✅ 真实的场景
def real_scenario():
"""真实的用户行为"""
user = User()
user.login()
user.browse_products(duration=random(30, 120)) # 浏览30-120秒
user.search_product("手机")
user.view_product_detail()
user.think_time(random(10, 60)) # 思考10-60秒
if random() < 0.3: # 30%概率加购物车
user.add_to_cart()
if random() < 0.5: # 50%概率结算
user.checkout()
user.logout()真实性检查清单:
- ✅ 用户操作间有思考时间
- ✅ 不同操作有不同概率
- ✅ 模拟用户的完整流程
- ✅ 考虑用户的个性化差异
2. 🎪 完整性原则 - "全面覆盖"
核心思想:覆盖系统的主要业务流程
# 电商系统完整场景覆盖
class EcommerceScenarios:
"""电商系统场景设计"""
def __init__(self):
self.scenarios = {
# 核心业务流程 (70%流量)
"购物流程": {
"权重": 40,
"步骤": ["登录", "浏览", "搜索", "查看详情", "加购物车", "结算", "支付"]
},
"浏览流程": {
"权重": 30,
"步骤": ["首页浏览", "分类浏览", "商品浏览", "离开"]
},
# 重要业务流程 (20%流量)
"用户管理": {
"权重": 10,
"步骤": ["注册", "登录", "个人中心", "修改信息"]
},
"订单管理": {
"权重": 10,
"步骤": ["查看订单", "取消订单", "申请退款"]
},
# 其他业务流程 (10%流量)
"客服咨询": {
"权重": 5,
"步骤": ["在线客服", "提交工单", "查看回复"]
},
"营销活动": {
"权重": 5,
"步骤": ["领取优惠券", "参与秒杀", "分享商品"]
}
}3. 🔄 可重复性原则 - "结果稳定"
核心思想:每次测试都能得到一致的结果
# 可重复性设计要点
class RepeatableScenario:
"""可重复的场景设计"""
def __init__(self, seed=12345):
# 1. 固定随机种子
random.seed(seed)
# 2. 标准化测试数据
self.test_data = self.prepare_standard_data()
# 3. 固定测试参数
self.test_config = {
"并发用户数": 100,
"测试时长": "10分钟",
"思考时间": "2-5秒",
"数据集大小": 10000
}
def prepare_standard_data(self):
"""准备标准化测试数据"""
return {
"用户数据": self.generate_users(1000),
"商品数据": self.generate_products(5000),
"订单数据": self.generate_orders(2000)
}4. 🎛️ 可控性原则 - "参数可调"
核心思想:能够灵活调整测试参数
# 可控性设计示例
class ControllableScenario:
"""可控的场景设计"""
def adjust_load_pattern(self, pattern_type):
"""调整负载模式"""
patterns = {
"平稳负载": {
"用户数": self.config["base_users"],
"增长方式": "固定"
},
"阶梯负载": {
"用户数": self.config["base_users"],
"增长方式": "阶梯",
"阶梯间隔": "2分钟",
"每次增加": 50
},
"波浪负载": {
"用户数": self.config["base_users"],
"增长方式": "波浪",
"波峰": self.config["base_users"] * 2,
"波谷": self.config["base_users"] * 0.5,
"周期": "5分钟"
},
"尖峰负载": {
"用户数": self.config["base_users"] * 5,
"增长方式": "瞬间",
"持续时间": "30秒"
}
}
return patterns[pattern_type]🎬 场景设计的五步法
第一步:🔍 业务调研 - "了解剧情"
目标:深入了解业务特点和用户行为
def business_research():
"""业务调研清单"""
research_items = {
"用户画像分析": {
"用户类型": ["新用户", "老用户", "VIP用户"],
"使用习惯": ["高峰时段", "常用功能", "操作路径"],
"设备分布": ["PC端", "移动端", "平板端"]
},
"业务流程分析": {
"核心流程": ["注册登录", "核心业务", "支付结算"],
"支撑流程": ["搜索", "浏览", "客服"],
"管理流程": ["后台管理", "数据统计", "系统维护"]
},
"数据特征分析": {
"数据量级": "日订单量、用户量、商品量",
"数据分布": "热点数据、长尾数据",
"数据增长": "历史增长趋势、未来预期"
},
"技术架构分析": {
"系统架构": "单体/微服务/分布式",
"技术栈": "编程语言、数据库、缓存",
"部署方式": "物理机/虚拟机/容器/云"
}
}
return research_items第二步:📊 数据分析 - "分析观众"
目标:基于真实数据分析用户行为模式
def analyze_user_behavior(access_logs):
"""分析用户行为数据"""
behavior_analysis = {
"访问模式": {
"高峰时段": analyze_peak_hours(access_logs),
"访问频率": analyze_access_frequency(access_logs),
"会话时长": analyze_session_duration(access_logs)
},
"操作路径": {
"热门路径": find_popular_paths(access_logs),
"转化漏斗": analyze_conversion_funnel(access_logs),
"跳出点": find_exit_points(access_logs)
},
"性能基线": {
"当前TPS": calculate_current_tps(access_logs),
"响应时间": analyze_response_time(access_logs),
"错误率": calculate_error_rate(access_logs)
}
}
return behavior_analysis
# 实际分析示例
def real_data_example():
"""真实数据分析示例"""
# 从日志中分析得出的用户行为
user_behavior = {
"登录后行为分布": {
"直接购买": 15, # 15%用户登录后直接购买
"先浏览再购买": 25, # 25%用户浏览后购买
"只浏览不购买": 45, # 45%用户只浏览
"立即离开": 15 # 15%用户登录后立即离开
},
"页面停留时间": {
"首页": "30-60秒",
"商品列表": "60-120秒",
"商品详情": "120-300秒",
"购物车": "30-90秒"
},
"操作间隔时间": {
"点击间隔": "2-8秒",
"页面切换": "5-15秒",
"思考时间": "10-60秒"
}
}
return user_behavior第三步:🎭 角色设计 - "塑造角色"
目标:设计不同类型的虚拟用户
class UserPersonas:
"""用户角色设计"""
def __init__(self):
self.personas = {
"新手用户": {
"比例": 20,
"特征": {
"操作速度": "慢",
"思考时间": "长",
"错误率": "高",
"浏览深度": "浅"
},
"行为模式": {
"注册概率": 0.8,
"购买概率": 0.1,
"客服咨询概率": 0.3
}
},
"熟练用户": {
"比例": 60,
"特征": {
"操作速度": "中等",
"思考时间": "中等",
"错误率": "低",
"浏览深度": "中等"
},
"行为模式": {
"直接搜索概率": 0.7,
"购买概率": 0.3,
"比价概率": 0.5
}
},
"专家用户": {
"比例": 20,
"特征": {
"操作速度": "快",
"思考时间": "短",
"错误率": "很低",
"浏览深度": "深"
},
"行为模式": {
"目标明确概率": 0.9,
"购买概率": 0.6,
"批量操作概率": 0.4
}
}
}
### 第四步:📝 脚本编写 - "写剧本"
**目标**:将场景设计转化为可执行的测试脚本
```python
# 完整的场景脚本示例
class EcommerceUserScenario:
"""电商用户场景脚本"""
def __init__(self, user_type="熟练用户"):
self.user_type = user_type
self.user_data = self.generate_user_data()
self.session_data = {}
def execute_scenario(self):
"""执行完整的用户场景"""
try:
# 1. 用户登录
self.user_login()
# 2. 根据用户类型选择行为路径
if self.user_type == "新手用户":
self.newbie_behavior()
elif self.user_type == "熟练用户":
self.experienced_behavior()
else:
self.expert_behavior()
# 3. 用户退出
self.user_logout()
except Exception as e:
self.handle_error(e)
def experienced_behavior(self):
"""熟练用户行为模式"""
# 70%概率直接搜索
if random.random() < 0.7:
self.search_product()
self.view_search_results()
else:
self.browse_categories()
# 浏览商品详情
self.view_product_details()
self.think_time(10, 30) # 思考10-30秒
# 30%概率购买
if random.random() < 0.3:
self.add_to_cart()
self.think_time(5, 15) # 思考5-15秒
# 80%概率完成支付
if random.random() < 0.8:
self.checkout()
self.payment()第五步:🧪 场景验证 - "试演"
目标:验证场景的正确性和有效性
def validate_scenario(scenario):
"""场景验证框架"""
validation_results = {
"功能正确性": validate_functionality(scenario),
"数据一致性": validate_data_consistency(scenario),
"性能合理性": validate_performance(scenario),
"监控完整性": validate_monitoring(scenario)
}
return validation_results
def validate_performance(scenario):
"""验证性能合理性"""
# 小规模验证测试
small_scale_result = run_scenario(
users=10,
duration="5分钟",
scenario=scenario
)
# 检查关键指标
checks = {
"响应时间合理": small_scale_result.avg_rt < 1000, # 平均响应时间<1秒
"错误率可接受": small_scale_result.error_rate < 0.01, # 错误率<1%
"TPS符合预期": small_scale_result.tps > 0 # TPS>0
}
return checks🎯 四种经典场景类型
1. 🏃♂️ 基准性能场景 - "单项冠军"
目标:测试单个接口或功能的极限性能
生活类比:就像测试运动员的单项成绩
- 100米短跑:测试爆发力
- 马拉松:测试耐力
- 举重:测试力量
class BenchmarkScenario:
"""基准性能场景"""
def design_api_benchmark(self, api_endpoint):
"""设计API基准测试场景"""
scenario = {
"测试目标": f"测试{api_endpoint}的极限TPS",
"测试方法": "单一接口压测",
"负载模式": "阶梯递增",
"测试步骤": [
"10并发 × 2分钟",
"50并发 × 2分钟",
"100并发 × 2分钟",
"200并发 × 2分钟",
"500并发 × 2分钟"
],
"成功标准": {
"响应时间": "P95 < 500ms",
"错误率": "< 0.1%",
"TPS": "> 100"
}
}
return scenario
# 云手机基准场景示例(结合你的工作经验)
def cloud_phone_benchmark():
"""云手机基准性能场景"""
scenarios = {
"云手机开机": {
"描述": "测试云手机开机的极限并发",
"测试步骤": "同时启动N台云手机,测试开机成功率和耗时",
"关键指标": ["开机成功率", "开机耗时", "资源占用"]
},
"APK安装": {
"描述": "测试APK安装的极限并发",
"测试步骤": "同时在N台云手机上安装相同APK",
"关键指标": ["安装成功率", "安装耗时", "网络带宽"]
},
"云手机重启": {
"描述": "测试云手机重启的极限并发",
"测试步骤": "同时重启N台云手机,测试重启成功率",
"关键指标": ["重启成功率", "重启耗时", "状态同步"]
}
}
return scenarios🚀 下一步学习建议
恭喜你!现在你已经掌握了压测场景设计的核心思路和方法。
记住:好的场景设计是成功压测的基础!场景越贴近真实,发现的问题越有价值。
💡 小贴士:场景设计是个迭代过程,要根据测试结果不断优化。就像导演拍电影,第一版剧本肯定不是最终版!🎬
