环境准备
PC: Windows7/XP
LoadRunner11: 与win10及以上版本不兼容
Nmon: 性能监控工具,部署到被测服务器
LoadRunner破解安装
下载地址:https://pan.baidu.com/s/1WJjcFWhrkWW-GgYwXdEniQ
提取码:f4zc
破解方法
-
正常安装LoadRunner11,安装完成后,不要打开;
-
用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR11安装目录下“bin”文件夹中的对应文件;(文件在上面地址下载的文件中)
-
运行deletelicense.exe;
-
然后使用老的注册码就可以使用了;
global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
备注: global-100:最高100并发的license,web-10000:最高10000并发的license。
Nmon安装
下载地址:https://sourceforge.net/projects/nmon/
根据自己的系统下载对应的包,解压到服务器即可。
nmon_analyser工具:
https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+Systems/page/nmon_analyser
下载后直接解压出模板(nmon analyser v51_2.xlsm),用于最后制图。
测试指标准备
交易响应时间
用户从客户端发起一个请求,到客户端接收到从服务器返回结果的响应结束,整体过程所耗费的时间;
响应时间=网络传输时间+服务器处理延迟时间+数据库服务器处理延迟时间,简单交易小于1.5s,一般交易小于3s,复杂交易小于5s。
业务处理能力(TPS)
每秒处理交易笔数
以82原则计算交易峰值负载:
3000人测试人员,每日提交缺陷10个,任务领取5个,任务列表20,执行列表20次,上传图片5次,上传视频5次,下载测试报告5次,导入用例3次。
日交易总量为:300073=219000,
日交易量 = 交易总量合计(219000) * 80% =T T =175200
日交易时间 = 营业时间8小时20% =1.6
TPS目标计算为: T /1.6 / 3600 = 30.41笔/秒
并发用户
系统需求的最大使用人数
系统处理正确性
在负载情况下,交易错误率。错误率=(失败交易数/交易总数)*100%。
备注: 不同系统对错误率的要求不同,但一般不超出千分之五。稳定性较好的系统,其错误率应该由超时引起,即为超时率。
业务处理稳定性
系统在标准压力(系统的预期日常压力)情况下,能够稳定运行。
备注: 一般来说,对于正常工作日(5X8小时)运行的系统,至少应该能保证系统稳定运行10小时以上。对于7X24运行的系统,至少应该能够保证系统稳定运行48小时以上。
系统资源
CPU<=80%
内存使用率无明显上升趋势
磁盘繁忙率<=80%
测试数据准备
测试数据使用接近真实生产环境的测试数据,多用户与多数据。数据库中要有铺底数据,测试系统在正常大量存量数据下的表现。
场景设计
基准测试场景
以1名虚拟运行100次,迭代循环分别运行每个交易脚本,检验脚本的业务正确性,获取性能基线。
单交易负载测试场景
以多个虚拟用户分别运行每个脚本,设定并发用户数序列,收集系统在不同负载级别下的性能表现,检查系统在整体上应付不同用户负载的可伸展性。检验每个业务在负载下的表现,初步暴露并隔离性能缺陷。
负载均衡与可靠性测试
验证系统(包括应用、网关服务器、文件服务器及数据库服务器)在可靠性,涉及(容错性,失效恢复能力,扩展性等)。
容错性测试方法,依据测试模型发起系统处理能力50%的压力,对单点应用(或数据库)分别进行停服务(正常停止和KILL)、宕机等异常操作后,系统仍可以提供正常业务处理。
混合交易负载测试场景
按业务模型中确认的比例分配虚拟用户,将多个交易脚本组合在一起运行,根据基准及单交易测试结果设定操作延时,设定负载序列,并发用户数为最大,检查系统在当前业务负载模式下的可用服务水平,是否符合需求
稳定性测试场景
按业务模型中确认的比例分配虚拟用户,将多个交易脚本组合在一起运行,根据基准及单交易测试结果设定操作延时,设定负载序列,并发用户数为最大并发数的80%,设置场景运行时间为48小时,检查系统在当前业务负载模式下的可用服务水平,是否符合需求
测试范围选取(业务选取)
对于我们测试性能需要选择哪些交易,我们一般参照以下原则:
已上线系统:
- 测试交易要覆盖各个渠道;
- 一般系统:选取日均交易量TOP20、TOP10的交易;
- 选取生产上曾经出现或者容易出现问题的交易;
- 选取生产上占用资源较高的交易;
- 选取业务逻辑复杂的交易;
- 选取交易路径较长的交易;
- 选取处理时间较长的交易;
- 选取特殊需求的交易(测试并发、测试登陆)。
未上线系统:
-
测试交易覆盖各渠道;
-
选取预期交易量大的交易;
-
选取预期交易量增长迅速的交易;
-
选取占用资源较高的交易;
-
选取交易路径较长的交易;
-
选取处理时间长交易;
-
选取业务逻辑复杂的交易;
-
选取频繁调用数据库的交易;
编写脚本
LoadRunner三大组件:
- 脚本编辑器:录制和编写性能测试脚本。
- 控制台:设置脚本测试场景并进行测试。
- 结果分析器:分析测试结果
编写脚本
params传参方式:
Action()
{
//设置变量字节大小
web_set_max_html_param_len ("24470000");
//根据左右边界截取整个返回值,存在变量result中
web_reg_save_param("message", //变量名称
"LB=\"message", //左边界
"RB=\"}", //右边界
"Search=Body",
LAST);
lr_start_transaction("login"); //事务开始
lr_think_time(44); //等待时间
web_submit_data("signin_2", //请求名称
"Action=http://127.0.0.1:8080/user/login", //接口地址
"Method=POST", //接口请求方式
"RecContentType=text/html", //返回类型
"Referer=http://127.0.0.1:8080/user/login", //返回地址
"Snapshot=t2.inf", //脚本唯一标识
"Mode=HTML",
ITEMDATA, //请求参数
"Name=data", "Value={\"device\":.0.1\"}", ENDITEM,
LAST);
lr_end_transaction("login",LR_AUTO);//事务结束
//很多时候返回值有中文,需要转码,转码后的值存在了msg中
lr_convert_string_encoding(lr_eval_string("{message}"),"utf-8",NULL,"msg");
//对比返回结构
result = strcmp(lr_eval_string("{msg}"),lr_eval_string("\":\"登录成功!"));
if(result == 0){
//打印返回值
lr_log_message("转换编码后---------%s",lr_eval_string("{msg}"));
return 0;
}
else{
lr_log_message("%s",lr_eval_string("登录失败"));
//打印返回值
lr_log_message("转换编码后---------%s",lr_eval_string("{msg}"));
return -1;
}
}
JSON传参方式:
Action()
{
//设置变量字节大小
web_set_max_html_param_len ("24470000");
//根据左右边界截取整个返回值,存在变量result中
web_reg_save_param("message", //变量名称
"LB=\"message", //左边界
"RB=\"}", //右边界
"Search=Body",
LAST);
lr_start_transaction("login"); //事务开始
lr_think_time(44); //等待时间
//添加请求头
web_add_auto_header(“Content-Type", “application/json",);
web_custom_request("signin_2", //请求名称
“URL=http://127.0.0.1:8080/user/login", //接口地址
"Method=POST", //接口请求方式
"RecContentType=application/json", //返回类型
"Referer=http://127.0.0.1:8080/user/login", //返回地址
"Snapshot=t2.inf", //脚本唯一标识
"Mode=HTML",
“Body={\"device\":.0.1\"}",
LAST);
lr_end_transaction("login",LR_AUTO);//事务结束
//很多时候返回值有中文,需要转码,转码后的值存在了msg中
lr_convert_string_encoding(lr_eval_string("{message}"),"utf-8",NULL,"msg");
//对比返回结构
result = strcmp(lr_eval_string("{msg}"),lr_eval_string("\":\"登录成功!"));
if(result == 0){
//打印返回值
lr_log_message("转换编码后---------%s",lr_eval_string("{msg}"));
return 0;
}
else{
lr_log_message("%s",lr_eval_string("登录失败"));
//打印返回值
lr_log_message("转换编码后---------%s",lr_eval_string("{msg}"));
return -1;
}
}
设置场景
在LoadRunner控制台,添加需要测试的脚本,设置每个脚本的Vuser数量。
用户加载方式
Initialize:初始化虚拟用户,同时初始化、间隔初始化、运行前初始化。
Start Vusers:启动虚拟用户,同时启动、间隔启动。
Duration:运行时间,运行至结束、选择固定时间。
Stop Vusers:停止虚拟用户,同时结束、间隔结束。
Run-Time Setting设置
主要是脚本运行设置,包括:循环方式、请求间隔、日志、等待时间、代理等。
Run Logic: 运行逻辑,设置每个模块的重复次数。
Pacing: 每个请求的间隔时间,根据业务需求和实际脚本TPS设置。
Log: 日志记录,取消日志记录,记录日志会消耗LoadRunner的PC机大量存储。
Think Time: 脚本中的等待时间,需要忽略脚本中的等待时间,否则无法达到预期的系统压力。
Miscellaneous: 其他选项,Error Handing,选择错误后继续,防止报错后,测试停止。
Browser Emulation: 浏览器模拟,取消勾选下载非HTML资源。
Preferences: 偏好设置,勾选Enable Image and text check,增加检查点。
服务器监控
LoadRunner自带事务相关监控及结果,服务器监控使用nmon工具进行监控,在压测期间启动nmon进行服务器各项资源监控。
nmon使用方法
./nmon -s10 -c60 -f -m /test/
参数说明
-s10 每 10 秒采集一次数据。
-c60 采集 60 次,即为采集十分钟的数据。
-f 生成的数据文件名中包含文件创建的时间。
-m 生成的数据文件的存放目录。
这样就会生成一个 nmon 文件,并每十秒更新一次,直到十分钟后。
生成的文件名如: _090824_1306.nmon ,“” 是这台主机的主机名。
将生成的文件导入到nmon_analyser工具,生成服务器资源监控结果