【竺】性能测试笔记3——总
一、性能测试基础
1、定义:基于协议模拟用户发出请求(业务的模拟),对服务器形成一定的负载,来测试服务器的性能指标是否满足要求。
2、关注点:时间性能、空间性能
3、与界面无关
二、性能技术简介
1、用户行为模拟:低成本具有可行性,模拟大量用户操作的一种技术,借助这种技术将被测试系统在测试阶段运行起来,一检测系统工作是否正常
1>不同用户使用不同的数据
2>多用户并发操作
3>用户请求间的依赖关系及请求间的延时时间
2、性能指标监控:通过上面技术模拟用户的行为,在系统运行中需要监控各项性能指标,并分析指标的正确性
1>请求响应时间监控
2>服务器处理能力监控
3>服务器资源利用率监控
3、性能调优:通过指标的监控发现系统存在的性能缺陷,利用分析工具,定位修正性能问题
三、性能测试分类
1、性能测试(狭义)
通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能要求,在特定的运行条件下验证系统的能力状态。这种方法是对系统性能已经有了解的前提,并对需求有明确的目标,并在已经确定的环境下进行的。
2、负载测试
通过在被测系统上不断加压,直到性能指标达到极限,例如“响应时间”超过预定指标或某种资源已经达到饱和状态。
3、压力测试(强度测试)
让系统在一定饱和状态下,例如cpu、内存在饱和使用情况下,系统能够处理的会话能力,以及系统是否会出现错误,即让系统处在很大强度的压力之下,看系统是否稳定,哪里会出问题。
4、并发测试
通过模拟用户并发访问,测试多用户并发访问同一个应用、同一个模块或者数据记录时,是否存在死锁或其他性能问题。即,多个用户同时(并发)对一个模块或操作进行加压。
5、配置测试
关注点是微调,通过对软硬件的不断调整,找出他们的最佳状态,使系统达到一个最强的状态。
6、可靠性测试(稳定性测试)
在系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。
四、性能指标
1、举例:
并发用户数:同时进店剪发顾客数
响应时间:从进店到完成剪头的总时间(等待+执行时间)
单位时间事务数tps:Transaction per second,单位时间内完成事务的数量,事务:剪头
2、响应时间
=网络传输时间+服务器处理时间,不包含前端页面渲染时间,到浏览器收到请求后响应数据截止
3、tps
tps:每秒处理的事务数
hps:每秒发送的请求数
吞吐量:描述的是服务器的处理能力
4、资源利用率
在一定的负载情况下,服务器资源占用的情况
CPU利用率:不允许超过70%-80%,队列长度
内存利用率:80%以下,页交换频率(物理内存和虚拟内存交换频繁程度)
带宽利用率:100Mbps = 12.5 Mb/s
1Byte = 8 bit
如果资源利用率太小,造成资源浪费
5、用户数
并发用户数:在同一时间向服务器发送请求的用户数量
与每秒的并发请求数不同,一定要确认需求的目的是并发用户数还是并发请求数。
五、性能测试流程
需求分析-》测试计划-》测试方案-》用例设计-》测试执行-》定位分析问题
1、需求分析
测试对象:常用的、核心的、重要的、数据量、并发量大的业务
确定性能指标:2/8原则,每小时的平均负载*4

测试场景:
单一场景:登录、注册、搜索、添加购物车、下单、支付
混合场景:用户使用场景、系统使用场景
2、测试计划:
测试目标
测试人员组织
压测进度安排
压力机:配置、要求、数量
风险
3、测试方案:
测试工具:loadrunner、jmeter
测试环境:数据库、服务器、架构升级、有条件的情况下 尽量和生产环境一致
测试策略:单一场景、混合场景
监控工具:
Linux:nmon、rpc、jvisuaIVm、Spotlight
Windows:Spotlight、perfmon.exe(windows 自带,命令行输入)
4、用例设计:
测试脚本形式:基于脚本的用例
场景设计:基于场景的用例
5、测试执行:
脚本编写
场景监控执行
运行场景
监控场景
测试报告
6、定位分析问题
后端:代码、软件(数据库、应用服务器)、硬件
前端
网络
六、工具介绍Loadrunner
1、安装
操作系统:xp、win7/win2003/win2008
windows :家庭版— 无管理员权限
专业版
旗舰版
支持浏览器:IE 8/9
安装
2、组成
脚本生成器VuGen
压力调度和监控系统Controller
结果分析工具Analysis
3、使用预览
1>用户行为录制:选择协议、录制用户交互、编辑脚本
2>生成场景负载:设计场景、监控
3>获得性能测试数据:定位性能瓶颈、生成测试报告
4、VuGen脚本录制流程:
录制脚本-》修改脚本-》创建场景-》执行场景-》配置服务器端监控环境-》添加服务器地址和计时器-》监控结果数据统计显示
1、新建脚本选择网络协议:
1、 如何选择协议:
1、自带协议探测工具Protocol Advisor
2、询问开发
3、根据以往项目经验
2、单协议脚本
3、多协议脚本
4、最近采用的
2、录制前准备:
1、选择被测系统的类型:浏览器、非浏览器
2、录制时采用的浏览器:IE,如果是64位,一定要选择program files(x86)下的ie浏览器
3、被测服务器地址
4、其他选项默认
3、开始录制
1、general-Recording-html-based script将与打开一个网页 (HTML)有关的所有请求“封装”为一个步骤,还可分为接 口有关的步骤
2、url-based script 将每一个不同url的请求封装为步骤
4、停止录制
5、脚本查看模式
首先启用自带的web类型网站
loadrunner-samples-web-start webserver-右下角绿色图标
4、脚本的组成
init、action、end三部分
init、end只能存在一个,只会执行一次,而action可分成多个部分,运行多次
5、查看脚本生成结果
View-test results
6、录制脚本选项
Start Record-options-Recording-html based(将与打开网页HTML有关的所有请求封装为一个步骤)/url based(将每一个不同的url的请求封装为步骤
-html based-user action页面形式的数据/url接口形式的数据
7、解决乱码
Start Record-options-Recording-Advanced-support charset-utf-8
8、Controller创建场景
Tools-》Create Controller Scenario-》一般使用手动场景Manual scenario-》Numeber of vuser设置虚拟用户数量-》Load generator压力机,localhost本机跑的-》
Group Name脚本名称-》Result 结果存放文件夹
Controller界面-》Design-》Run-》Start Scenario运行完-》Results-》
Analyze Results进入第三个分析组件
9、脚本回放设置Vuser-Run time setting
1>设置action迭代次数
Run logic 设置脚本迭代次数,设置的是action,可在replay log里查看运行次数
2>设置迭代时间
Pacing设置脚本运行时间间隔,1、固定等待时间fixing,2、随机时间random 3、第一次迭代开始和第二次迭代开始时间间隔
3>启用日志
log 勾选启用日志
4>Think time思考时间
5>Preference-Check启用图片和文本检查
6>Miscellaneous-以进程/线程方式运行虚拟用户
进程方式:独享一块内存,比较稳定,大约占用4M以上
内存资源浪费,可模拟的虚拟用户少
线程方式:线程之间共享一块捏u才能,可以模拟的虚拟用户多,大约占用1M~2M,
线程之间容易发生资源竞争,出现线程阻塞,不稳定
10、常用函数
LoadRunner自带函数
与编程语言相关的函数
自己编写的函数
web_url直接请求一个网页,
web_link通过单击文本链接请求打开一个网页
web_image通过单击图片链接请求打开一个网页
web_submit_form代表在请求打开一个网页时需要一定的数据上传到服务器
1>web_url()打开网页
Action()
{
//web_url函数
web_url("open","URL=http://192.168.152.130:8080/webtours/",LAST);
return 0;
}
2、运行
3、检查结果,View-Test Results-Action Summary-Url open
2>web_submit_data();
作用:模拟浏览器发出get/post请求
步骤名称:访问首页
请求地址:http://localhost:1080/WebTours/
通过抓包工具知道是get/post方式、data数据
Insert-》New Step列出所有函数-》web submit data函数-》选择Post/Get-》Action-》切换到Data-》添加在fiddler抓到的数据
3>web_custom_request()
作用:模拟浏览器发出HTTP支持的任何方式的请求
11、变量
1>init、action、end中定义的变量是局部变量
gloabal.h中定义的变量是全局变量
全局变量用于:整个过程中固定不变的,例如URL地址、KEY、其他
2>loadrunner中变量声名必须放在函数的最前面
3>eg打印
int a = 10;
lr_output_message("%d",a); //打印
return 0;
4>eg释放,避免内存泄露
定义在global.h里,全局变量
char *p = (char*)malloc(1024*sizeof(char)); //堆栈划了内存
free(p);
5>添加注释
选中代码---》Edit---》Advanced---》Comment Selection(ctrl+alt+c)
6>引入脚本
File--->Add File to Script--->aaa.h
#include "aaa.h" 声明头文件
7>F1,帮助文档
8>获取主机姓名
char * my_host;
my_host = lr_get_host_name();
lr_output_message("%s",my_host);
9>思考时间
lr_think_time();
10>
lr_whoami()
11>
lr_get_attrib_string
12>快速定位到回放日志的地方
代码右键---》Go to replay log
13>F10,调试,一步步执行
14>F9,断点,

15>编码转换
lr_convert_string_encoding()
12、与编程语言相关的函数
1>strcpy与strcat

2>strcmp函数
比较两个字符串
3>atoi函数解析

4>sprinf 拼接字符串
5>time
6>文件操作
13、与协议相关的函数
1>web_link与web_url(get)
2>web_submit_form与web_submit_data(POST)、web_submit_form中的hidden自动发送
3>web_custom_request(OPTION、POST、GET各种方法,什么请求都能做)
4>web_add_header
5>web_get_int_property
12、错误机制分析
1>错误继续执行,容易一竿子打死
Run-time Settings--->Miscellaneous--->勾选Contine on error
2>lr_continue_on_error函数
13>日志函数解析
Ir_output_message(包括行号,会网络传播给controller)、lr_log_message(写在本地)、lr_message、lr_error_message区别
日志函数使用时注意:
1>在日志调试的时候使用,真正运行的时候尽量少用
2>在对时间敏感操作中间尽量不要加日志函数(IO是影响响应时间的)
14、参数化
1>脚本开发遇到的问题
被业务场景所迫:所有用户都输入相同的数据,不能体现出真实的业务环境
被系统体系所迫:存在缓存,不能体现出真正的性能
被系统业务约束所迫:有些系统禁止一个用户多次登录系统,也就严重到无法测试的地步
参数话机制就可以解决上述问题
1>设置参数化
想要参数化的对象-》右键-》Replace with a parameter填写参数名称和类型
工具栏设置参数值
注意:参数化文件中的测试数据最后一行应保留一个空行
2>读取参数化
lr_output_message("获取到的值为:%s",lr_eval_string("{username}"));
3>设置迭代次数
Vuser-》Run Time Settings-》Run Logic
4>运行Run
5>查看Replaylog回放log
log里的每次迭代结尾后的输出结果
6>查看测试结果
View-》Test Results
12、设置参数列表详解
1>First data设置从哪行开始读
2>两个参数可以存在一张表里,不同列
3>参数化列表:File(文档)、Date(日期)
13、参数列表九种策略取值(取值顺序+何时更新)
1>A1+B1-》sequential+each iteration-》每次迭代顺序取值,只有发生迭代才会取值
2>A1+B2-》sequential+each occurrence-》每次取值的时候顺序取值,与迭代无关
3>A1+B3-》sequential+once-》顺序取值,一旦取到值后不再发生不变化,永远拿的一个值
4>A2+B1-》Random+each iteration-》每次迭代随机取值,只有发生迭代才会随机取值
5>A2+B2-》Random+each occurrence-》每次输出参数的值,值发生改变(值是随机读取,与迭代无关)
6>A2+B3-》Random+once-》一旦。。。。,就永远拿的一个值
7>A3+B1-》Unique+each iteration-》每次迭代唯一取值,当超过值的范围时
When out of values:
Abort User停止运行
Continue in a cyclic manner循环取值
Continue with last value取最后一个值
Allocale Vuser in the Controller:
Automatically allocate block size:块的大小,数据个数除以虚拟用户数,eg10个数据,5个用户,块的大小为2,
超过值,优先个数满足:数据数/迭代次数
Continue in a cyclic manner循环取值,循环取的最后一个数
Continue with last value循环取值,循环取的最后一个数
8>A3+B2-》Unique+each occurrence-》每次取唯一值,每次出现时,或者每次输出参数值时
与块的大小、迭代次数有关
9>A3+B3-》Unique+Once-》唯一取值,只取一次,不再更新
14、从数据库中获取参数
Parameter List---》Query Wizard
15、事务
1>什么是事务
2>添加事务:lr_start_transaction、lr_end_transaction解析
Insert Start Transaction图标(Ctrl+T)
Insert End Transaction图标(Ctrl+D)
3>事务的4个状态
Pass、Fail、Auto、Stop

4>子事务的概念
Ir_start_sub_transaction
5>对事务的探讨
通过事务获得了响应时间,就够了吗
6>注意
事务中不要插入日志函数
不要插入集合点函数
尽量不要插入思考时间
Insert-》Start Transaction-》代码-》End Transaction-》运行-》查看log里该事务所耗的时间
一般录制流程:
Vuser界面:录制脚本-》Tools-Create Controller Scenario-设置虚拟用户数-创建负载-》
Controller-Design界面:设置虚拟用户数-设置迭代间隔时长-迭代周期
Controller-Run界面:Window Resources----Add Measurements---Add Monitored Server Machines----输入localhost本机的监控----OK----得到计数器列表-----OK
Start Scenario
Results-Analysis Results
Reports-New Reports
16、基础设置
1>如果ie没有启动-打开ie浏览器-设置-高级-启用第三方浏览器扩展
-安全-是否启用保护模式
2>如果脚本没有生成---》协议是否对
---》检查录制选项---》Recording Options---》Port Mapping-换换捕获等级
3>Tools---》General Options---》Display---》Show run-time viewer during rej 开启、关闭回放界面,一般关闭
4>Run-Time Settings---》Log-Extended log---》Parameter substitution开启日志
5>Recording Options---》Advanced---》Support charset---》UTF-8修改编码,录制就不会有乱码了
6>Recording Option--->Advanced---》Recording schemes---》None-Resources--->zip根据数据类型分离录制
7>Run-time Settings--->Brower Emulation--->Simulate brower cache---Cache URLs requiring content---》是否缓存
8>Run-time Settings--->Download Filters--->Exclude addresses in list--->Add屏蔽url地址
9>Run-time Settings---》Miscellaneous->Continuue on error错误继续执行
10>lr_output_message("this is action");//输出
11>lr_output_message("参数的取值是:%s",lr_eval_string("{output}"));
参数准换成变量lr_eval_string()
变量转换成参数lr_save_sring()
12>快速创建登录名称和密码的方式
excel下拉一百条记录-》使用UltraEdit改格式-》切成列块模式-》将空白列替换成逗号-》把列模式关掉-》列头加标题,uesrname,password-》复制粘贴到loadrunner
17、关联
1>关联的定义
从服务器的响应中保存节点,左边界,右边界
2>参数化和关联的区别的阐述
3>什么时候需要关联
服务器返回的动态变化且对业务有影响的
4>web_reg_save_param
5>web_reg_save_param_ex
6>保存xml响应的参数
web_reg_save_param_xpath
18、集合点
1>集合点概念
只能在action里添加,也不要添加到事务里
2>生成集合点
insert-》Rendezvous
19、检查点
1>web_reg_find()
web_find("Text Check","What=Welcome",LAST);//非注册检查点,要打开Preferences-->勾选Enable Image and text check
2>尽量使用注册检查点
检查的字符串尽量不要是中文,避免不必要的麻烦
运行时设置中的检查点选项对注册函数无效
通过检查点得到的警示:一定要在业务层面上判断是否成功,不能单单从协议层面判断
20、脚本调试的步骤
1>脚本开发原则:简单、正确、高效
2>脚本编译通过,不报错(Vugen)
3>单用户循环一次,不报错(Vugen)
4>单用户循环多次,不报错(Vugen)
5>多用户循环一次,不报错(Controller)
6>多用户循环多次,不报错(Controller)
7>对关键性的业务添加业务正确性判断
21、Control场景
1>Schedule by:
Scenario:可以设置虚拟用户个数
Group:指定了虚拟用户个数
2>Run Mode:
Real-world schedule:模拟真实世界,适用于长时间稳定性测试,实现高峰低谷波动
Basic schedule:让系统承受大压力,一般使用
3>运行时设置
3.1、与VuGen中的不同,各自有各自的,不要认为是同一个
3.2、Think time默认设置的不同
3.3、系统日志,真正运行的时候就设置成仅仅当错误时才发送,提高效率
3.4、事务的设置,尽量不设置事务
3.5、带宽的设置,一般不设置带宽,除非有要求
3.6、如何结束
3.6.1本次迭代完
3.6.2本轮action完
3.6.3立即结束
3.7、Miscellaneous
以进程方运行 1个虚拟用户 1个mmdrv.exe进程
以线程方式运行 50个虚拟用户 1个mmdrv.exe进程
22、负载生成器(Controller)
1>负载生成器连接
A:Start-》Load Generators创建连接
B:检查连接的电脑,开启LoadRunnner Agent Services后台服务,检查任务管理器里-magentservice.exe服务,是否生成负载生成器
2>负载生成器要保证自己不要成为瓶颈
负载机器的软硬件配置
脚本的复杂程度
23、IP Spoofer欺骗(Controller)
1>为什么需要做
1>打开ip欺骗
Scenario--->Enable IP Spoofer
2>使用ip
Load Generators---添加ip,该ip下绑定多个ip
3>Loadrunner --->打开IP Wizard--->添加ip
24、集合点(Vuser)
实现更严格的并发,当达到一定条件时,释放
Ir_rendezvous("myRende");
25、自定义数据采集
lr_user_data_point()
24、Analyze
1>Graphy--->Add New Item--->Add New Graph--->Average Trans平均事务不准确,关掉重新打开
2>拐点
3>右键-->Merge Graphs---
24、并发用户数的计算
1>平均的并发用户数:C=nL/T
2>并发用户数峰值:C' 约等于C+3*根号C
n:login session数量
L:login session平均长度
T:时间长度

3>二八定律


22、性能测试方案

来源:Loadrunner软件性能测试视频教程(57节课全)掌握好就拿高薪!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
