一、LoadRunner工具的组成
1、VuGen 虚拟用户脚本生成器
脚本好比:武器 VuGen好比:兵工厂 VU好比:士兵
2、Controller 压力调度控制台 好比:总指挥部
3、Analysis 压力结果分析器 好比:军情分析部门
4、Load Generator 负载生成器/压力产生器
好比:总指挥部指挥下的作战部队 VU好比士兵
原理:就是使用一台物理机,使用其性能生成大量的VU产生负载(压力)。 通过进程或线程模拟
比如:一个部队支持2000人,如果需要10000人?
方法1:找性能更好的测试机,起更多VU;
方法2:联机测试-使用多台测试机的性能联合产生VU。
如果不用联机测试,如何起更多的VU?
使用配置更高的测试机
如何搭建性能测试环境?
思路:涉及面多(硬件、软件、架构...),整个团队共同讨论的问题。具体问题具体分析--看需求
5、Agent 代理程序 好比:通讯兵
原理:Agent进程默认开启,部署在不同的测试机,协调得到步调一致的VU.
状态:默认开启,如果关闭,如何打开?
开始 -> 所有程序 -> HP LoadRunner
-> Advanced Settings 高级设置
-> LoadRunner Agent Process
结论:如果想让某台测试机参与联机测试,至少需要安装Load Generator,并且启动Agent进程才可收到控制台的命令。
6、Monitor 监控系统 好比:作战观察团
原理:监控被测系统服务器主要资源指标的计数器。
比如监控CPU、Memory、Disk、Network等资源情况
处理器 内存 磁盘 网络
常用计数器:%Processor Time CPU使用率
CPU忙的时间的百分比
阈值:70%~80%
分析LR工具组成图:结合三大、四大组件为主要线索
SUT 被测系统
Java Client/IE Client: C/S 或 B/S的 客户端
HTTP Protocol: HTTP协议
Capture & Record 捕捉 和 录制
Scripts 脚本
Run-time Settings: 运行时设置
Scenario 场景
Schedules 计划安排
Run Log 运行日志
LG 产生 VU 负载的来源
Monitoring 监控系统资源
Start/Stop 开始/结束
Client Emulation 客户端 模拟
Report & Graphs 报告和图表
各种形式:Word、网页格式、Excel、Access数据库、水晶报告、Mercury Diagnostics 诊断图
Ajax:异步的JavaScript和XML -- 异步通信协议
同步:A任务完成后,B才能开始
异步:A正在执行,B也可开始运行
举例:浏览器局部刷新,比如验证码、注册时用户名验证
二、LoadRunner工具组成图:
1、对于给定SUT,VuGen可以按照指定的协议(Http协议、Ajax等软件使用的相关的技术协议),对于不同客户端(PC、移动;浏览器B/S、App C/S)进行捕捉和录制,生成脚本。考虑对脚本增强:事务、检查点、集合点、参数化、关联、流程控制等;
2、在VuGen设置Run-time Settings,模拟1VU运行;
3、在控制台Controller中,设置场景(测试计划):场景模式、脚本组(组名、脚本路径、VU数量、Load Generators)、VU行为(初始化、加载方式、持续时间)、Run-time Settings、各台服务器的系统资源监控(Monitor),运行和监控场景,获取运行日志;
4、场景运行结束后,使用Analsis获取结果报告和图表,便于分析,完成性能测试报告。
比如如何进行一次并发测试? 参考笔记,整理、扩展
要点:3W1H
What 是什么? 概念
Why 为什么? 有何好处?优势?
Where 在哪里? 应用场合
How 如何使用? 具体步骤、注意事项、问题解决方法
最好结合项目举例说明(项目经验)
参数、变量
int add(int a, int b) {
return a+b;
}
三、参数化:脚本增强技术
以不变的业务(脚本流程),处理不同的数据 -- 更真实
常量、字面值 -- 不可改变
"Hello" "jojo" "bean" 开发:硬编码,不灵活
public static final double PI = 3.1415926535897932;
代码中的常量,为了表示一种规范 一经赋值,不可改变
变量 -- 名称不变、值可以改变 更灵活
int age = 23; age = 25;
代词 值
思想:以不变应万变! 变量名不变,值可改变
具备参数池:管理不同的数据、制定不同的策略。
1、定义:
对脚本中的常量(字面值)进行参数化,让不同VU在执行相同脚本时,分别使用参数池中的不同数据代替这些常量,从而达到模拟用户更真实使用系统的情况。
2、步骤:
1)确定哪些数据要参数化; 比如jojo 和 bean
2)准备参数池:类型 + 数据 + 策略
3)将数据使用参数代替。
3、案例:针对购票脚本buy的登录部分进行参数化
准备工作:注册一些新的用户账户
账户信息保存原理:当前不存数据库,而是保存在普通文件
C:\Program Files\HP\LoadRunner\WebTours\MercuryWebTours\users
保存不同账户文件,文件名就是用户名,第一行是密码
后续为用户其它信息、购票记录
建议:在实际项目中,为了更真实表现业务问题,需要对数据进行参数化,需要自己准备大量的测试数据,一般数据存在数据库中,需要通过SQL语句访问数据库。
目前简化成改变文件中的数据。(测试环境的准备--数据环境)
首页 -> Sign up now 注册账户
Username: qq Password: 123 Confirm: 123 确认密码
-> 提交
录制buy脚本:事务、检查点 day04\buy
录制时使用jojo和bean
1)确定哪些数据要参数化:
init脚本中:jojo和bean 需要参数化
技巧:搜索文本中字符串 ctrl+f F3 继续搜索
双击选中jojo -> 右击
-> Replace with a Parameter 使用一个参数代替
弹出窗口:
Parameter Name: username 参数名/LR变量名
Parameter Type: File 参数类型-文件 常用
Original value: jojo 原有初值
-> {username} LR变量取值方式 {LR变量名}
注意:检查其它相关的常量,也需要替换 F3继续搜索
选中jojo -> Use Existing Parameter 使用已存在的参数
-> 选择username -> {username}
同理:也将密码bean 都替换成 -> {password}
2)准备参数池:类型+数据+策略 打开参数池配置窗口
VuGen中倒数第2个按钮:Open Parameter List
比如:点击username->Edit with Notepad 使用记事本编辑
username
jojo
qq
| <-- 使用ctrl+a 全选 检查格式:
确保光标在最后一行数据的下一行的开头
保存ctrl+s 及时关闭记事本,避免版本问题
将First data: 1改为2 从第2行开始取数据
同理:选择password 编辑文本password.dat 增加一行123
First data: 2
目前效果:采用qq和123完成登录
编译 -> 回放脚本
提示:如果脚本运行失败,根据回放日志Replay Log,查看错误位置,根据提示的行,找到附近代码,根据提示的原因进行调试。
初始化脚本 36行附近 文本找不到
vuser_init.c(36): Error -26366: "Text=Welcome, <b>jojo</b>, to" not found for web_reg_find
技巧:调试脚本时,可以启用扩展日志,查看参数的替代信息。 Run-time Settings -> Log
-> Extended Log 扩展日志
-> Parameter substitution 参数替代信息
运行后,从日志中查看到参数的使用情况。
Notify: Parameter Substitution: parameter "username" = "qq"
练习:让jojo和qq各自订一张票(参数池策略)
建议:清空jojo和qq的订票记录,便于观察
打开Parameter List窗口:
将username和password的First data: 都改为1
都从第1行开始取数据
打开Run-time Settings: 迭代次数:2次
编译 -> 运行
遇到问题:jojo登录1次,订票2次
vuser_init 1次 -> Action 2次 -> vuser_end 1次
登录脚本 参数化 购票
登录脚本 参数化
解决方法:将init脚本中的代码剪切到Action中,参与迭代
注意:保持原有代码的语法格式
vuser_init(){
可以转移....
return 0;
}
四、参数池的策略初步(Parameter List窗口中设置)
特点:功能强大、全面,产品的一个卖点
1、Select next row (How? 如何取?)取值方式
选择下一行
1)Sequential 顺序的 (默认)
每个VU都从第1行开始顺序向下取值;
2)Random 随机取:每个VU都可随机从参数池中取值
3)Unique 唯一取:每个VU都唯一取值,不能重复
比如:用户注册,用户名不能重复
4)Same line as xxx: 和xxx参数同行取值、策略相同
比如:password 设置为 Same line as username
2、Update value on (When? 何时取?)更新时机
1)Each Iteration: 每次迭代时更新 (默认)
2)Each Occurrence: 每次遇到参数时更新
3)Once 仅取一次 每个VU一次选择,不再改变
从一而终
说明:案例中采用的是默认的SE组合:顺序 + 每次迭代
顺序 每次迭代
Sequential + Each Iteration
怎么取? 何时取?(时机)
脚本Action迭代2次,值需要更新2次,由于采用顺序方式,第一次迭代取第1行:jojo和bean;第二次迭代取第2行:qq和123.
username password
jojo bean
qq 123
| |
五、参数化案例:使用脚本参数化技术,注册30个账户
1、具体要求:
1)脚本中需要添加事务、检查点(自动检查)
2)确保30个账户全部注册成功
3)建议使用VuGen调试,1VU压力较小,容易成功
测试数据时,要促进成功。
2、先准备账户数据:使用Excel 设计 qq1~qq30 1~30
新建data.xls
3、录制用户注册脚本reg
New -> 选择协议 -> Create -> 确认URL
-> Action 注册需要迭代 -> OK
-> Sign up now
-> 输入Username: www Password:123 Confirm:123
-> 开始事务reg -> Continue -> 欢迎页面:
-> 插入文本检查点:Thank you, www,
-> 结束事务reg
-> 切换到vuser_end -> 点击Continue -> Sign Off
-> 关闭浏览器 -> Stop
保存脚本:day04\reg 技巧:多备份 另存为reg1
参数化:
方式1 设计两个参数{username} {password}
使用两个独立的文件保存各自数据:
username.dat 和 password.dat
选中两处www -> 替换成{username} 新建、已存在
选中两处123 -> 替换成{password}
技巧:双击 ctrl + f F3
打开Parameter List: 设置数据 + 策略
先选中username -> 拷贝qq1~qq30 编辑username.dat
再选中password -> 拷贝1~30 编辑password.dat
注意文本格式:ctrl+a 检查 没有多余的字符,多留一行
使用策略:默认SE组合 顺序+每次迭代
注意迭代次数不能超过30次,否则数据会重复使用
-> 关闭窗口
设置Run-time Settings:
1)迭代次数:10
2)Pacing:选择第2项 随机Random 2.000~3.000
3)Log: 日志 为了更详细,可以启用扩展日志
Standard Log 标准日志
Extended Log 扩展日志 (选择)
Parameter substitution 查看参数替代信息 (选择)
说明:调试脚本时经常启用扩展日志,分析数据获取的规律
4)Think time: 选择Replay think time 启用
-> Use random percentage of recorded think time:
使用 随机 百分比 脚本已记录 思考时间
Min: 50% Max: 150%
假如脚本中:
lr_think_time(10); 随机等待5~15秒 比如:8.76秒
目的:模拟用户不规律的等待时间,更真实
建议:测试数据时,减小压力,促进成功。
配置完成 -> 编译 回放
方式2:两个参数共享一个数据文件 username.dat
前提:username和password有关系
打开day04\reg脚本 另存为 reg2
-> 将脚本中www -> {username}
123 -> {password}
技巧:双击 ctrl+f F3 新的、已存在的代替
-> 准备数据 + 策略:
data.xls 拷贝数据 -> 粘贴到username.dat文件
编辑文件:两列属性共享一个文件
使用批量替换技巧,将制表符Tab 替换成英文的逗号 ,
username,password
qq1,1
qq2,2
...
qq30,30
| <-- ctrl+a 检查格式
在Select Column中:可以指定选择哪一列
1)根据列号:1 2 3 ...
2)根据列名:username password 见名知意 推荐使用
在File format中:指定格式
默认使用逗号分隔每一列 Comma 推荐使用
其它:Tab 制表符 或 Space 空格
-> 针对username设置:选择列号1 或 列名username
First data: 11 从qq11开始
策略:默认SE组合 顺序+每次迭代
-> 针对password设置:
将File:改为username.dat 共享一个文件
选择列号2 或 列名 password
技巧:重新开启窗口才更新
First data: 11 从11开始
策略:默认SE组合
或 Same line as username 和username同行取值
此时First data失效
-> OK
设置Run-time Settings: (同方法1)
1)迭代次数:20次
2)Pacing: 随机2.000~3.000秒
3)Log: 扩展日志,查看参数替代信息
4)Think time: 随机50%~150% 也可忽略
-> 编译 -> 运行
提示:某些系统中,为了恢复数据库的数据,需要使用SQL
比如删除qq开头的账户信息?
delete from user
where username like 'qq%';
目前:只要删除账户文件
回顾:
1、LoadRunner的多个组件
(结合工具组成原理图理解记忆)
1)VuGen 脚本生成器 *
2)Controller 控制台 *
3)Analysis 结果分析器 *
4)Load Generator 负载生成器 *
5)Agent 代理程序
6)Monitor 监控系统
2、脚本增强:参数化 以不变应万变
参数名 数据
{username} jojo qq qq1 ...