LR11-03
一、并发测试(n VU)
1、并发测试两个条件
1)脚本中要有 集合点(并发点)
2)控制台中要设置并发策略(选择第一项,所有虚拟用户到达集合点后释放)
集合点: 5个线程,代表5个VU 并发执行一次购票
o------------|o------
o------------|o------
o------------|o------
o------------|o------
o------------|o------
此时设置集合点(并发点)
等所有线程到达集合点时,才一起释放,此时的压力最大(瞬时压力)。
注意:在事务开始之前,设置并发点
2、并发点 只有在并发测试中使用。(在单脚本中用不到,可以注释掉,在控制台中做并发测试,要)
案例:在脚本中添加并发点,执行并发测试
需求:并发购票
(1)修改脚本(VUG中)
注意:在事务脚本之前添加
lr_start_transction("buy");
在事务开始之前 -> 点击Insert -> Rendezvous
-> 输入集合点名称Rendezvous Name: buy 一般与事务名相同
就会生成脚本:lr_rendezvous("buy");
-> 编译 Compile(同时会立即保存)
注意:修改完脚本,要及时编译。
打开控制台,进行并发测试。
加载day/buy脚本。注意,如果加载后修改脚本,需要在控制台中刷新脚本。
右击脚本文件路径 -> Details 细节 -> Refresh 下拉菜单,
选中Script: 刷新脚本 (很常用)
选中Runtime Settings: 控制台中的设置被覆盖 (不常用)
提示:可以在控制台中,打开某个脚本 View Script 按钮
脚本中发生变动(加了检查点、集合点、代码等)
1)一定要点击编译 Compile按钮,同时也会自动保存
2)在控制台中要刷新脚本
(2)设置并发策略(Controller中)
控制台中要设置并发策略:(参考:并发点策略_2.png)
选择Scenario菜单 -> Randezvours... 并发点-> 打开窗口,设置策略 -> 点击Policy按钮 (策略)
第1项:Release when 100% of all Vusers arrive at the rendezvous. (选择此项)
当100%虚拟用户到了集合点时释放虚拟用户VU
(所有VU的n%) 10个VU 都算 10 * n%
第2项:Release when 100% of all running Vusers arrive at the rendezvous.
当100%正在运行的VU到达集合点时释放VU
(所有正在运行的VU的n%)
如果10个VU只有5个正在运行,5 * n%
第3项:Release when 1 Vusers arrive at the rendezvous.
指定n个虚拟用户达到集合点,再释放
Timeout between Vusers: 30 sec
超时时间:两个虚拟用户之间的 (一般到不了,默认不改)
完成5个VU的并发:
控制台 -> Basic schedule -> Quantity 改为 5
Start Vusers: 用户数少,登录时间快,不用改
Duration: 选Run until completion 表示瞬时压力
继续设置Run-time Settings:
Run Logic: 迭代次数 1
Pacing: 改为As soon as the previous iteration ends.
Log: 默认
Think time: 默认 忽略 Ignore think time
好比:不停地发请求,不给喘息时间
并发测试:注意think time要忽略。
原因:think time时间越长,对AUT的压力越缓,而并发测试是严格的测试,所以要忽略该时间。
目的:将最大的压力模拟出来。
配置完毕 -> 运行场景 -> 查看结果报告
并发测试要点回顾:
1)事务前设置并发点
2)控制台中设置并发策略
3)要忽略Think time
二、参数化
类似于QTP的参数池,比如可以模拟不同的用户进行登录
以不变的业务(脚本),处理不同的数据
提示:如何提高技术表达能力?
阅读大量技术评论文章,包括每天的笔记。多熟悉技术术语。
找机会多说。
独立写出技术文章。
1、定义
对脚本中的常量进行参数化,让不同的VU在执行相同的脚本时,分别使用参数池的不同数据替代这些常量,从而达到模拟多用户真实使用系统的情况。
2、步骤:
1)确定需要参数化的数据
2)准备数据 (参数池)
3)参数化
先打开WebTours首页,注册一个用户qq 密码qq
首页 -> Sign up now 开始注册
Username: qq
Password: qq
Confirm: qq
...不填
注册后会以文件方式保存用户信息:(模拟数据库)
C:Program FilesHPLoadRunnerWebToursMercuryWebToursusers
针对buy脚本进行参数化:
为了便于还原,备份buy脚本,
另存为day03uy1 File -> Save As
找到init脚本需要参数化的常量: jojo
双击jojo 选中 -> 右击
-> Replace with Parameter 用一个参数代替
-> 弹出窗口:
Parameter name: name 参数名称
Parameter type: File 文件类型,大部分都选
Original value: jojo 例子
-> {name}
密码也类似:将bean 用同样办法替换为{pwd}
到此,定义好两个参数。
接着考虑参数的数据准备:VuGen
倒数第2个图标按钮:Open Parameter List-> 参数池 窗口
左侧可选择不同的参数名称,可编辑
点击name-> Edit with Notepad 按钮 使用记事本来编辑
name
jojo
qq
注意:用ctrl+a检查 确保光标在最后一行的下一行开头
保存关闭
First data: 1改为 2 从第2行开始取数据(原数据还在)
同理:pwd也加1行值:qq
First data: 也改为 2(从第2行开始取数据,原数据还在)
-> Close
参数池数据准备完毕
编译脚本 -> 运行脚本
如果运行失败,根据回放日志Replay Log查看原因:
Script Aborted! 脚本被放弃了!
原因:其它位置(检查点函数)使用了jojo,也需要进行参数化
选中jojo -> 右击 -> Use Existing Parameter -> 选name-> {name}
新的需求:让jojo和qq各自订一张票
首先清空AUT中jojo和qq的订票记录,观察新的结果
在Parameter List中,First data: 1 从jojo开始取
在Run-time Settings中:迭代次数:2 (Action)
编译 -> 运行
遇到的问题:jojo登录1次,订票2次
init和end只会执行一次,Action可以迭代多次
解决方法:将init中的脚本剪切到Action中,参与迭代
注意:保留原有函数的语法格式(类C语言)
vuser_init(){
return 0;
}
重新编译 -> 回放
说明:只要不退出,就是在线,就可以一直发请求。
LR主要关注的是数据包,而QTP主要关注的是界面。
3、要点归纳
1)参数化时,参数池中的数据写好后,要让光标停留在新的一行。
否则可能导致出错(白行或者缺少数据)。
技巧:ctrl + a 观察格式
2)init只执行一次,Action参与迭代,在参数化时需要注意。
3)LR依靠网络协议录制脚本,脚本中记录的是请求数据包信息,只要用户在线(登录成功),则可以继续发送请求到达任意界面,也可实现循环操作。
4、参数池的策略初步(Parameter List窗口中设置)
特点:功能强大,LR产品的一个卖点(出彩) BS/MS题 拔高点
1、Select next row (取值方式 How?)
Sequential 顺序的(默认) 取完第1行,取第2行...
Random 随机取
Unique 唯一取
Same line as pwd.. 和xxx步调一致pwd取法一样
2、Update value on (更新方式 When?)
Each iteration 每次迭代时取值 (取值)
...
作业:
1、对于查询订单,进行基准测试和5用户、10用户的并发测试,并记录其平均响应时间。(生成3项)
2、回顾之前所有内容(尤其是测试理论、数据库)
一、继续学习参数化
案例:注册30个用户,脚本要求:
1)脚本中一定有检查点
2)保证30个用户全部成功
3)用单机执行还是控制台? 使用单机VuGen
原因:使用VuGen 单机,压力较缓,容易成功。
测试数据,尽量不用控制台
提示:1VU,使用迭代
每注册1个用户,会在C:Program FilesHPLoadRunnerWebToursMercuryWebToursusers中会多1个以新注册的用户名 命名的文件
先准备用户数据:使用Excel 设计 qq1~qq30 1~30
开始录制注册脚本:
New -> New Virtual User界面说明:
左侧:
New Single Protocol Script 新的单协议脚本(较简单)
New Multiple Protocol Script 新的多协议脚本(较复杂)
New Script Recent Protocol 刚打开过的协议
上方:
Ajax..异步通信,局部刷新支持、
Flex 就是Flash动画协议、
Oracle[2-Tier]两层协议、
Oracle NCA 是.Net新技术、
Web Services技术(异构平台之间互操作 C <--> Java)
最常用的:Web[HTTP/HTML] 协议
Create -> 输入URL -> Action 注册需要迭代 -> OK
等待events数字不动后 (页面下载完毕)
-> 点击Sign up now
-> 输入Username: www Password: 1 Confirm: 1
-> 开始事务reg -> Continue -> 进入欢迎页面
-> 插入检查点: Thank you, www,
-> 结束事务reg
-> 切换为vuser_end -> 点击Continue -> Sign Off
-> 关闭浏览器 -> Stop
保存脚本:script/day04/reg
将脚本进行备份:另存为day04/reg1 File-> Save as ...
提示:LR脚本编辑器有局限,撤销ctrl+z 步数是有限的。
技巧:多备份
配置方法(2种)
方式一:做两个参数池 name 和 pwd
双击www选中 -> 右击 -> Replace with a Parameter
-> 命名 name -> {name}
双击 1 选中 -> 右击 使用参数代替 -> 命名pwd -> {pwd}
双击 1 选中 -> 右击 Use Existing Parameter
使用已存在的参数 -> 选中 pwd -> {pwd}
再检查需要替代的固定值:检查点中需要替换
双击www -> 替换成已存在的 {name}
将参数池添加完整:
Open Parameter List... -> 进入参数池配置窗口
先填name -> 将Excel中的name值拷贝 -> name.dat
-> Edit with Notepad name后粘贴 qq1~qq30
再填pwd -> 拷贝1~ 30 -> pwd.dat
-> Edit with Notepad pwd后粘贴 1~30 注意格式!(光标在最后1行开始,用ctrl+A检查)
关闭窗口
准备运行脚本(不用打开控制台)
-> 打开Run-time Settings:
Run Logic -> Number of Iterations: 10
Pacing -> 选第2项:random 随机 2 ~ 3 秒
After the previous iteration ends:with a random delay of 2.000to 3.000 sec
提示:机器配置高,一般配置2~3秒;若配置低,延长些:6~9秒
Log 不变 当前是标准日志,如果让日志更详细,可使用扩展日志
Standard Log 标准日志
Extended Log 扩展日志 选择
Parameter subsitution 进一步查看 参数替代信息 选择
Think time -> 单选 Replay think time
-> Use random percentage of recorded think time:
Min: 50% Max: 150%
根据录制时间给出百分比,比如录制10秒,50%到150%就是5到15秒
原因:(做数据,要保证成功)
配置完成,开始运行...
10次迭代,大约10分钟、
方法一的局限:如果是1个大型项目,用户名和密码较多,多个用户名和密码一般在一起
问题:2个参数值,能否写在一起?
解决:name.dat、pwd.dat-》xxx.dat(分列方式)采用方式二
方式二:将两个参数表的参数放在一起。
name的本质:就是一个name.dat文件 进入脚本文件夹 打开
将reg另存为reg2 File -> Open -> reg
做两个参数池:{name} {pwd}
选中www -> 替换为参数 -> {name}
选中1 -> 替换为参数 -> {pwd}
选中1 -> 使用已有的代替 -> {pwd}
检查点 选择www -> 使用name代替 -> {name}
Open Parameter List... -> 配置参数池
选择name -> Add Column 加列 -> 起列名 pwd 名字任意
Edit with Notepad 编辑文本
-> 大量替换:将Tab字符全部替换成逗号, -> 关闭
name,pwd
qq1,1
qq2,2
...
qq30,30
此时,完成两列数据写在一个文件中。
在File format中,默认指定Column: Comma 逗号分隔
还可以选择:Tab 制表符 或 Space 空格
选择pwd参数 -> File 选成 name.dat 共享一个文件
之后针对name和pwd选择列:
Select column: 两种办法
By number: 1 列号 name选1 pwd选2
或By name: 根据列名指定
避免数据重复,First Date都从11行开始
-> Close 编译
打开Run-time Settings:
Run Logic: 迭代 10次
Pacing: 第2项 随机 2~3秒
Log: 选择扩展日志,进一步查看参数替代信息
Think time: 单选Replay think time
使用随机的 50% 150%
配置完成 -> 运行脚本
结论:推荐使用第二中方式,比较常用。
(曾经的一道上机题,主要考察参数化、关键是参数池策略)
二、参数池的策略 (BS/MS题:讲讲参数池的策略)
1.参数化:(关心的是数据)
1)、含义:同样的业务,出现不同的数据,考虑采用脚本参数化技术
2)、步骤:
确定参数化的数据-->准备数据->提供策略-->参数化
3)、准备数据 (目前:File方式)
<1> 每个参数使用独立文件 (参数池)
<2> 多个参数共享同一个文件 (常用)
Excel工具、Column(序号、列名)、First Data(从哪开始)
4)、参数池策略 (重点、难点)
Select next row: 选择下一行(How?如何取?)
a) Sequential 默认 顺序的
b) Random 随机取
c) Unique 唯一取
d) Same line as xxx 和xxx步调一致
Update value on: 更新方式(When?何时取)
a) Each iteration 默认 每次迭代
b) Each occurrence 每次遇到该参数时取值
c) Once 取值仅一次
When out of values: 数据不足时的处理情况
a)放弃虚拟用户 Abort Vuser
b)以循环的方式继续 Continue in a cyclic manner
c)持续取最后一个值 Continue with last value(原地踏步)
1、选择下一行 (How? 如何取?)Select next row
1)顺序的 Sequential :从第一行开始顺序向下取值
2)唯一的 Unique: 从第一行开始,唯一的向下取值
(用过了,就取新的值)
例如:数据a b c d e f g ...,现有3个用户(甲乙丙)取值;循环2次。
A) 顺序方式:甲(a, b) 乙(a, b) 丙(a, b)
B) 唯一方式:甲(a, b) 乙(c, d) 丙(e, f)
如果是注册,采用唯一方式,用过了就不能再用
c) 对于单用户来说,顺序和唯一取值序列是相同的。
3)随机的 Random: 随机取值。(值可能重复)
4)Same line as xxx: 取值策略与xxx相同 (行相同)
2、更新方式(When? 何时取?)Update value on
1)每次循环 Each iteration: 每次迭代时取值 (常用)
指的是:Action中的脚本,每次迭代时更新值
2)每次遇到 Each occurrence: 每次遇到该参数时取值
指的是:比如每次遇到{name}时,都会换一次值
3)取值一次 Once: 脚本运行过程中只取值一次
值的是:一次选择,终身不变
另外,When out of values: 当选择Unique时才出现,表示取值越界后的处理方式
3、数据不足时的处理情况(只有选择Unique时适用)
说明:顺序、随机时认是数据时充足的
规律:当选择顺序方式时,数据取到最后一行,再循环从第一行选取。
When out of values: 有三种策略
1)放弃虚拟用户 Abort Vuser
2)以循环的方式继续 Continue in a cyclic manner
3)持续取最后一个值 Continue with last value(原地踏步)
5)、需求:注册脚本,多用户,则数据池取值策略?
注册脚本,多用户 --- UEA组合(Unique+Each iteration+Abort Vuser)(唯一+每次迭代+放弃虚拟用户)
另外常见的组合:-----SE组合(Sequential+Each iteration)(顺序 + 每次迭代)
Parameter List窗口中:
三、综合场景测试 --- 号称能够最真实的模拟实际生产环境
综合场景案例1
综合场景的几个要素:
多用户、
多个脚本(至少3个)、
在线执行(多种操作)一段时间(1小时、50分钟等),一般是不加并发点。
注意:只要是多用户,就存在并发
综合场景测试过程中,所有用户循环执行相应的操作。
1、录制三个脚本(测试点):购买机票、查询线路、浏览航班;每个脚本都加检查点(手工)。准备进行综合场景。
首先做一个设置:(目的:为了让页面标题变为自动的检查点)
VuGen中 点击录制选项按钮 Edit Recording Options
General-> 选择第三项 Recording 脚本录制方式 不用改 (默认选择HTML方式)
HTTP Properties-》选择HTML Advanced高级 ->
选择Preferences复选框:
Generate web_reg_find functions for page titles
为页面标题生成检查点函数
再选择:Support charset -> UTF-8 对中文网站支持比较好
-> OK
以后都可生效。
练习:录制一个登陆脚本,查看配置效果
新建脚本 -> OK -> 输入jojo和bean
-> 开始事务login -> 点击Login按钮 -> 结束事务login
-> 插入检查点"Welcome, jojo, to the"
-> 改为vuser_end -> Sign Off -> 关闭浏览器 -> Stop
发现:web_reg_find("Text=Web Tours", LAST);
每个页面都有,只验证页面的标题。比如:跳转到错误页面,则标题是不同的。
规律:虽然在事务结束后,插入检查点,由于web_reg_find函数是注册性函数,
所有还是在相应请求之前。
开始练习录制脚本:day05目录下/ buy search scan
(1)购买机票 buy
录制过程和之前一样,注意添加检查点、事务点
(2)查询路线 search
New脚本 -> vuser_init -> 输入jojo和bean
-> 开始事务login -> 点击Login -> 结束事务login
-> 改为Action -> 点击Flights按钮
-> 选择城市从Denver到 Paris -> 开始事务search
-> 点击Continue -> 添加检查点 "Denver to Paris"
-> 结束事务search
-> 改为vuser_end -> Sign Off -> 关闭浏览器 -> Stop
(3)浏览航班 scan
New新建 -> 改为vuser_init -> 输入jojo和bean
-> 开始事务login -> 点击Login -> 结束事务login
-> 改为Action -> 开始事务scan -> 点击Itinerary按钮
-> 设置检查点 "A total of" -> 结束事务scan
-> 改为vuser_end -> Sign Off -> 关闭浏览器 -> Stop
注意:检查点会浪费性能,所以手工添加检查点时,只需1~2个即可
场景设置的前提:确保脚本录制、调试、回放成功。
2、需求:10用户综合场景
综合场景设置要求:
1)修改脚本:
2)设置场景:
3)虚拟用户加载部署情况:
4)Run-time Settings设置
1)修改脚本:
脚本事务中的think time时间要删除或或者移到事务之外。
原因:如果综合场景测试保留think time,在事务之内会起作用,从而影响事务的响应时间,导致结果不准确。
操作:对三个脚本都要移动 buy search scan
(包括:init、Action、end都要找遍)
lr_think_time(25);
lr_start_transaction("login");
...其中没用思考时间...
lr_end_transaction("login", LR_AUTO);
注意:修改后脚本都需要重新编译
如果脚本中有并发点,要注释掉;因为综合场景中有并发,但是不需要产生瞬时压力,无需设置集合点。