性能概述
性能测试过程
使用Loadrunner工具
vugen
contorller
analyst
性能概述 :
软件性能的两个维度:
时间: 任何软件运行都需要时间
空间: 软件对资源(硬件资源,软件资源)的使用
硬件 CPU RAM HD NETWORK
软件 OS JVM tomcat mysql
从经济角度来看
软件运行不能以硬件不计成本为假设,要尽可能少的占用各种硬件资源,同时软件运行的速度也要尽可能的快。
这些其实就是用户的最原始的性能需求。
性能首先是一种指标,表明软件系统对及时性的要求的符号程度;
其次是一种特性,可以使用时间来进行度量。
性能的及时性用“响应时间”或“吞吐量”来衡量。
响应时间是对请求作出响应所需要的时间。
功能与性能的关系
功能指的是在一般的条件下软件系统能够为用户做什么,能够满足用户什么样的需求。
又好又快
性能就是在空间和时间资源有限的条件下,软件系统是否能正常工作。
功能 做什么 what
性能 做得怎样 how 对于 空间 和 时间的敏感度
功能测试与性能测试的区别
单元测试 集成测试 系统测试 验收测试
测试软件系统的性能 应该在系统测试阶段执行性能测试。
性能指标:
“又要马儿跑,又要马儿少吃草” 跑 -- 时间 草 --空间
马儿能快能慢
用户对软件性能需求的描述
计算性能
资源的利用和回收
启动时间
伸缩性
稳定性 7*24
用户 发送请求---前端界面--请求---服务器--数据库
1.响应时间(Response Time ) RT
服务器端响应时间
网络响应时间
客户端响应时间
2.吞吐量(Throughput)
指软件系统在每单位时间内能处理的事务、请求、单位数据 。
3.资源使用率( Resource Utilization )
硬件: CPU占用率 内存使用率 磁盘I/O 网络I/O
软件: apcahce , J2EE ,DB ,tomcat ...
4.点击率 ( Hits per sceond ) HPS
每秒点击的数量 ,web系统 queset per sceond 每秒HTTP请求数量
5.并发用户数 (Concurrent Users )
性能测试概念
分类
概念: 性能测试 负载测试 压力测试 并发测试
性能测试(狭义):
通过模拟生产运行的业务压力量和使用场景组合,测试系统性能是否满足生产性能的要求。
这种方法主要是在特定的条件下验证系统的能力状态。
虚拟用户 vitural users -- VU 通过计算机程序实现用户的行为
特点:
目的是验证系统是否有宣称的能力。
必须要实现了解被测系统的经典场景,并具有确定的性能目标。
要求系统在已经确定的环境(硬件和软件)下运行。
测试环境尽可能等于生产环境。
负载测试 通过在被测系统上不断加压,知道性能指标达到极限。
特点:
目的是找到系统处理能力的极限
压力测试 测试系统在一定的饱和状态下,系统的处理能力
特点:
目的是检查系统处于压力下的时候性能的表现,主要关注稳定性
并发测试
并发用户数
注册用户数
在线用户数
并发用户数(广义和狭义)
配置测试,可靠性测试(关注长期)
下载Loadrunner 11 准备安装环境
Win7 32/64 ie浏览器9及以下版本 32
虚拟机 win7 64镜像
性能测试流程
性能需求分析--性能测试计划--测试环境搭建---测试工具选择--测试执行--测试结果分析--软硬件调优 -
性能需求分析
主要任务是确定测试策略和测试范围。
性能测试目的:
1) 客户有明确的要求
2) 想要知道软件系统性能 评估 --最大用户数 和 最佳用户数
3) 定位软件系统的瓶颈
4) 长时间的压力下运行情况 强度或稳定性测试
性能测试计划
项目背景 需求与目的 分析的结果 测试环境准备 (硬件 网络 软件 ) 测试数据的准备
测试的策略 测试场景
人员分配 开发 运维 DBA
时间的安排
测试环境搭建
硬件环境
软件环境
Windows Server + IIS + SQLServer + .NET (c#,c++,vb...)
Windows Server + tomcat/weblogic + MySQL + J2EE (java...)
Linux + apache + MYSQL + PHP
Linux + apache tomcat / weblogic + Mysql/Oracle + J2EE (java ...)
性能测试工具
自行开发
现有工具
商业工具 LoadRunner
开源工具 Jmeter
测试执行
模拟用户行为生成 --> 负载产生器 ---> 用户代理 ---> 测试调度管理 --> 系统监控 等
结果分析
分析 最大用户数 最佳用户数 响应时间 吞吐量 ...
性能分析模型 --- 性能拐点模型
数据监控和收集 图形化生成
软硬件调优
不是必须,可选的环节。
系统调优阶段: 测试执行,结果分析,系统调优将会形成一个循环持续的过程.(迭代)
性能测试工具 LoadRunner 的安装
LoadRunner 三大(四大)组件:
Vitural User Generator 虚拟用户生成器 (VuGen) --- 模拟生成虚拟用户的行为
Contorller 场景控制器 --- 调度管理并发用户进行实际性能测试,并监控和收集测试结果
Analyst 结果分析器 --- 分析性能测试数据
Load Generator 负载产生器 --- 运行虚拟用户脚本的计算机
使用Loadrunner进行性能测试
使用VeGen进行虚拟用户脚本开发和设置,使用Controller进行调度管理和场景执行,由负载发生器运行虚拟用户脚本产生负载,由结果分析器对数据进行分析
得出性能测试结果并生成性能测试报告。
被测案例项目
HP 内置的 WebTours 在线订票系统
默认的用户 jojo 密码 bean
性能概述
时间
空间
功能 做什么 what
性能 做得怎样 how
性能测试概述
模拟--虚拟用户Vitural user
性能指标:
1.响应时间RT
2.吞吐量Throughput
3.资源使用率Resource Utilization
4.点击率 Hits per Second
5.并发用户数 Concurrent Users
性能测试流程:
性能需求分析--性能测试计划--测试环境搭建--测试工具选择--测试执行--测试结果分析--(软硬件调优)
性能测试工具:
自研工具:
现有工具: 商业工具 开源工具
LoadRunner Jmeter ...
LoadRunner lr11安装 Win7 IE9 ,最新版 lr12.6
LoadRunner 组件:
Vitural User Generator 虚拟用户生成器
Contorller 场景控制器
Analyst 结果分析器
Load Generator 负载产生器
Vitural User Generator 虚拟用户生成器
缩写为VuGen
模拟用户行为 --- 通过 脚本语言 来表述 ,默认使用的c语言
虚拟用户 Vitural User
开发虚拟用户脚本基本步骤:
1.录制脚本 Recording
录制真实用户的行为保存到脚本中。
2.回放脚本 Replay
再次执行用户行为
3.增强脚本 Enhancement
参数化
检查点
关联
集合点
事务
...
4.准备脚本去场景中测试 Load Test
以WebTours项目给大家讲解 使用VuGen虚拟用户脚本开发
new Scripts 新建脚本 --- 选择网络协议
录制脚本 工作原理
Client--------------VuGen------------------Server
VuGen 要听懂并录制Client和Server之间的谈话内容 ,必须要懂C/S之间语言和规则 (网络协议)
WebTours项目
client 是不是就是浏览器
server 是不是就是Web服务器
他们之间沟通的语言 HTTP协议
Lr11版 VuGen录制脚本 目前仅支持IE9及以下的浏览器版本
选择32位 路径 ”C:Program Files (x86)Internet Exploreriexplore.exe“
web_submit_data() web_url() 有URL ,这种方式不依赖上下文
web_submit_form() web_link() 无URL,这种方式依赖上下文提供的路径
VuGen 录制脚本 --- lr11版 默认使用的C语言
Replay 回放脚本 校验脚本正确性
Recording 录制脚本 两种模式 levle
HTML-base 默认的模式,每一个步骤step一个函数,清晰简明
URL-base 每一个请求对应一个函数,复杂但详细 web_concurrent_start() web_concurrent_end()
如何选择录制的模式HTML和URL
1. web应用首选HTML-based
2. 使用HTTP协议非WEB应用 首先URL-based
3. 使用了一些浏览器内置的插件程序 建议URL-based ---这种应用几乎被淘汰
4. 使用javaScript,vbScript脚本 与 server 通讯, 首选URL-based
脚本是C语言写
*.h 头文件
*.c c语言代码文件:
1. Vuser_init() 首先 init 初始化
2. Action() 主体 可以迭代
3. Vuser_end() 最后 end 清尾
Runtime Setting 运行时设置
iteration 迭代次数
Think time 思考时间的设置
用户名和密码数据库是以文件的方式保存的
位置 %WebTours%cgi-binusers
虚拟用户生成器VuGen
C语言脚本方式 表述用户的行为
Vuser_init() Action() Vuser_end()
录制模式 HTML URL
使用VuGen开发虚拟用户脚本的步骤:
1. Recording 录制脚本
2. Replay 回放脚本
3. Enhancements 增强脚本
参数化
检查点
事务
关联
4. Prepare For Load 准备负载
迭代
并发设置---集合点
5. Finsh 完成
参数化:
参数列表面板
参数类型: File
以*.dat文件保存
select collumn 选择列
select next row 选择下一行数据 Sequential 顺序 ,Random 随机, unique 唯一
update value on 更新数据 Each iteration 每次迭代更新, Each Occurence 每次出现更新, onece 一直不更新
其他参数类型
Date/Time 时间
Group Name 场景组名
Iteration Number 迭代序号
Load Generator Name 负载发生器名字
Random Number 随机数字
Unique Number 唯一数字
Table 表
Vuser ID 虚拟用户ID
XML
...
关联:
userSession
client-----------------VuGen----------------server
录制的时候:IE 第一次请求request 响应response : 分配唯一 userSession: 123456
后续的所有请求 reqeust 报头上附带这个usersession 123456
VuGen ----------------------------------------server
回放的时候: 第一次请求request 响应response : 分配唯一 userSession: 123457
后续的所有请求 reqeust 报头上必须附带这个userSeddion 123456
对userSession的关联的描述
就是将脚本中固定的写死的userSession值用一个参数(变量)来替换,然后使用某种方式从响应的数据中去动态提取到这个参数的值。
全自动 web_reg_save_param_ex() 不能用 bug
半自动 web_reg_save_param_ex() 能用
手动方式 推荐
web_reg_save_param("userSession",
"LB= value="",
"RB="/>n<table border",
LAST);
参数化:Parameters 数据从客户端发出请求 -Jmeter的参数化一样的原理
关联:Corrlation 数据是从服务端响应的数据 -Jemeter的后置处理器,--边界提取器 通过左右边界提取 响应数据中动态的变化的值保存到变量
web_reg_save_param() 含有*reg的注册函数必须放在操作的步骤之前
参数化:
将脚本中固定的值用变量来替换, 迭代 不同用户 选取不同的值,通过File文件(数据源)来准备这些值
关联:
通俗地说,将来自服务器响应中动态变化的数据截取出来保存到一个变量中 动态的值--参数
web_reg_save_param("outboundFlight", // 变量名
"LB= value="", //左边界
"RB=" checked=", //右边界
LAST); //常量
{变量} 去替换代码中 固定的值
特殊符号需要转义 一般在符号的前面加
'
"
n
t
内容检查
检查点 --- 断言
文本检查 text
图片检查 image
web_reg_find("Text=jojo",LAST ); 预注册函数 文本检查 ,需要放置在操作函数之前
web_reg_find("Fail=NotFound",
"Search=Body",
"SaveCount=Tcount",
"Text=utest001",
LAST);
放在操作函数之后,并且还要进行相应设置。
在设置里
run-time settings/Preferences/Checks
启用 text check and image check
文本: web_find("web_find",
"What=utest001",
LAST);
图形: web_image_check("web_image_check",
"Src=/WebTours/images/flights.gif",
"Alt=Search Flights Button",
LAST);
web_find和web_reg_find的用法和区别
一、web_find()函数
该函数的作用是“在页面中查找相应的内容”,常用参数及含义如下:
web_find("web_find", //定义该查找函数的名称
"RightOf=a", //定义查找字符的右边界
"LeftOf=b", //定义查找字符的左边界
"What=name", //定义查找内容
LAST);
使用该函数注意以下事项:
1、 位置
该函数在页面内容显示出来以后,在页面中进行查找,所以只能写在要查找内容之后
2、 录制模式
该函数只能在基于HTML模式录制的脚本中进行查找
3、 必须启用内容检查选项
在runtime setting->Preferences里面,把Enable image and text check选中,否则不执行该查找函数
4、 在VB和JAVA语法中不支持该函数
该函数有以下一个缺点
1、 执行效率较低
2、 不返回查找结果情况,如想在执行该函数后根据查找结果做进一步操作时,没有返回值可以依据
例如:
在页面中查找“登录成功”的字符串,如果找到该字符串在日志中输出“登录成功”,如果找不到该字符串,则在日志中输出“登录失败”,此时使用该函数没有依据来做此判断,但使用web_reg_find()函数,使用它其中的SaveCount可以进行判断,具体方法我们下面介绍。
二、web_reg_find()函数
该函数的作用是“在缓存中查找相应的内容”,常用参数及含义如下:
web_reg_find("Search=Body", //定义查找范围
"SaveCount=ddd", //定义查找计数变量名称
"Text=aaaa", //定义查找内容
LAST);
使用该函数注意以下事项:
1、 位置
该函数写在要查找内容的请求之前,通常情况下写在如下六个函数之前:
Web_castom_request();
web_image();
web_link();
web_submit_data();
web_submit_form();
web_url()
2、 使用技巧
在该函数的参数中有个“SaveCount”,该参数可以记录在缓存中查找内容出现的次数,我们可以使用该值,来判断要查找的内容是否被找到,下面举个例子来说明:(引用LR的帮助中的例子)
// Run theWebTours sample
web_url("MercuryWebTours",
"URL=http://localhost/MercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
// Set up check for successful login by looking for "Welcome"
web_reg_find("Text=Welcome",
"SaveCount=Welcome_Count",
LAST);
// Now log in
web_submit_form("login.pl",
"Snapshot=t2.inf",
ITEMDATA,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=35", ENDITEM,
"Name=login.y", "Value=14", ENDITEM,
LAST);
// Check result
if (atoi(lr_eval_string("{Welcome_Count}")) > 0){ //判断如果Welcome字符串出现次数大于0
lr_output_message("Log on successful."); }//在日志中输出Log on successful
else{ //如果出现次数小于等于
lr_error_message("Log on failed"); //在日志中输出Log on failed
return(0);
}
我觉得这个方法非常有用,我们可以举一反三,应用到我们实际的项目中
三、插入函数的方法
1、 手工写入,在需要插入函数的位置手工写入该函数
2、 光标停留在要插入函数的位置,在INSERT菜单中,选择new step,在列表中选择或查找要插入的函数,根据提示填写必要的参数
3、 在tree view模式下,在树状菜单中选中要插入函数的位置,右键,选择insert after或insert before,根据提示填写必要的参数
四、总结
1、 这两个函数函数类型不同,web_find是普通函数,web_reg_find是注册函数
2、 web_find使用时必须开启内容检查选项,而web_reg_find则不没有此限制
3、 web_find只能只用在基于HTML模式录制的脚本中,而web_reg_find没有此限制
4、 web_find是在返回的页面中进行内容查找,web_reg_find是在缓存中进行查找
5、 web_find在执行效率上不如web_reg_find
说白了,用web_reg_find 的优先级要远远高于web_find,所以 web_find已经属于向后兼容的功能,不在推荐使用了。
检查点的实现方式
1. 直接写代码
2. Insert- New Step 步骤生成器 图形向导
3. Tree view 树视图
一些常用的输出函数
lr_error_message("userseesion的值是 %s",lr_eval_string("{userSession}"));
lr_output_message("当前登录的用户是 %s", lr_eval_string("{username}"));
lr_error_message("userseesion的值是 %s",lr_eval_string("{userSession}"));
lr_output_message("当前登录的用户是 %s", lr_eval_string("{username}"));
LoadRunner 脚本开发
Vugen
脚本增强
参数化
关联
检查点
文本检查 web_reg_find() web_find()
图形检查 web_image_check()
new step 步骤生成器
事务 和 集合点
事务 Transaction 性能测试里一个单位
通俗地说, 用户的一个或多个操作,这些操作代表一定的功能,在脚本中则表现为一段代码块。 测试人员可以将一个或
一系列的操作步骤定义为一个事务,以便衡量这部分功能的响应时间。
当然一般情况下,如果没有定义事务,那么默认一个http请求就是一个事务。
事务时间
一个事务的持续时间 Duration ,记录从事务开始 lr_StartTransAction() 到事务结束lr_EndTransAction()的时间差.
包含: 函数自身 思考时间(Think time) 浪费时间(Wasted time) 响应时间(response time)
事务定义方式
事务函数
lr_StartTransAction("事务名字") ;
lr_EndTransAction("事务名字", "事务状态") ;
事务状态:
LR_AUTO 自动判定状态
LR_PASS 通过
LR_FAIL 失败
LR_STOP 停止
LR_AUTO 判定的依据 是根据 http 响应 response 200 ok LR_PASS , 否则 status 404 LR_FAIL
判定的依据是根据实际业务逻辑
使用手工插入逻辑代码的方式去判定事务的状态
web_reg_find("SaveCount=fCount",
"Text=forget",
LAST);
web_submit_data("login.pl",
"Action=http://localhost:1080/cgi-bin/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://localhost:1080/cgi-bin/nav.pl?in=home",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={usrSession}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=JSFormSubmit", "Value=on", ENDITEM,
"Name=login.x", "Value=54", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
LAST);
if( atoi(lr_eval_string("{fCount}")) > 0 )
{
lr_end_transaction("S01_T02_LogIn",LR_PASS);
}
else
{
lr_end_transaction("S01_T02_LogIn",LR_FAIL);
}
TPS Transaction per Second 每秒事务数
RT Transaction response TIME 秒
成功 失败 事务的数量
Vugen脚本开发
参数化 关联 检查点 事务 集合点
集合点: 并发的访问 --狭义的并发 真正意义上的并发
在场景控制器生效 ---- 集合点设置策略
在脚本适当的位置插入集合点函数
lr_rendezvous("R01_HomePage");
脚本开发过程中的单步调试: debug
run 运行 F5
breakpoint 断点 F9
step by step 单步运行 F10
Loadrunner 三大组件:
VuGen 虚拟用户生成器
Controller 场景控制器
Analyst 结果分析器
Load Generater 负载生成器
VuGen 虚拟用户脚本的开发
1. Recording 脚本录制
2. Replay 脚本回放
3. Enhancemet 脚本增强
参数化 parametion
关联 corrlation --关联函数 web_reg_save_param()
检查点 content check --文本text 图形image web_reg_find()
web_find() web_image_check()
事务 transaction --插入事务 lr_startTransaction(), lr_endTransaction()
集合点 --必须在场景控制器里设置之后才生效
4.准备测试 prepare load test
Controller 场景控制器
Ram up 加载虚拟用户
Ram down 停止虚拟用户
手动场景 手动设置测试方案
目标场景 预定义目标
五大类型目标:
虚拟用户数
每秒点击次数
每秒事务数
事务响应时间
每分钟页面数
服务器监控 Windows Resources
四大监控对象 :
CPU 处理器
Memory 内存
Disk I/O 磁盘I/O
Network 网络
运行时设置 runtime -setting
与场景设置综合观察实际迭代运行情况
Pacing 迭代步进
THINK time 思考时间 这个值必须适当,可以考虑取一个熟练用户的操作速度和一个新用户的操作速度的平均值来设置合理的Think Time值
log 日志
Speed simulation 网速模拟
其他: 自动化事务 进程和线程 ...