这里只是简化版,方便我回忆。一点点补充,看到的都不尽完善
强子老师的很多视频,讲解的很清楚也很专业是我进入测试行业的启蒙
一、参数化
这是我录制出的部分脚本,是关于登录百度账号
我要把我的用户名:画雨江南 进行参数化
在Insert--New Parameter 打开参数化设置界面
这里是新建一个参数化窗口,部分版本可能界面不一样
如果是在脚本选中了要参数化的部分,则在 Original value 会显示将要参数化的部分,反之则为空白
点击properties,进入特性设置界面

这个界面的部分功能我已经标出
说说未标出的部分:
select colum:By number和By name,
By number:列号是包含所需要数据的列的索引,列名显示在每列的第一行
By name:是根据列明索引,更直观(多使用这个)
select next row:是针对虚拟用户来说的针对Controller的设置,在调试脚本中看不出来,其决定虚拟用户选择参数的过程
*Sequential(顺序):Vuser按顺序读取文件中的数据,如果全部都执行一遍则返回到第一行继续执行
*Random(随机):很明显就是随机读取文件中的数据
*Unique(唯一):分配一个唯一的值给Vuser作为参数,如果全部执行完则无法分配则会报错。这个在参数化手机号,银行卡号等唯一性的数据是选择使用
*Same link as***:与某个已定义好的参数去同一行值,一一对应。(在只设置了一个参数化的时候不会出现)
Update value on
设置脚本迭代过程中取值的策略,结果可以在代码调试的日志中可以看到
Each iteration:脚本没迭代一次都会访问数据表中的下一值(在一次迭代中不管某个参数出现都少次都只使用一个参数)
Each occurrence:每次迭代的过程中,参数的值都更新。(在一次迭代中,如果某个参数出现多次则每次都使用不同的参数)
Once :在同一个Vuser中一直取一个参数,表中其他数据不参与迭代过程(多次迭代都只使用同一个参数)

这里有各种组个说明:

然后开始进行运行时的设置
如下图:

因为我上面设置了2个不同的参数,
所以在在General -- Run Logic 的Number of iterations填写运行2次。
这里名为tieba的action 在这里没什么必要所以,可以选择Delete这个删除不会真的删掉脚本只是在运行时给忽略,在上面的Insert Action中可以重新添加

开始运行脚本
之前这里出现了一点问题,回放的时候用户名明明不一样为什么没报错?
需要说明的是:LR报错是根据服务器返回的的状态码,不管我们登录是否失败只要服务器给我们返回有对应数据就不会报错,例如服务器返回:你登录的用户名或密码错误。这里虽然我们登录失败但是服务器返回给我们的是200提示我们登录错误。所以LR就不会报错。(判断是否登录成功,这里需要用到检查点)
---------------------------------分隔符----------------------------------------
说明:之后的时间比较少,所以直接贴我在记事本上做的笔记。比较碎片化,不利于除自己之外的人浏览,在此抱歉!
二、录制
函数:
get请求建议使用 web_url,而不是web_link。区别:web_url 每个请求都会附带一个地址可以独立运行,web_link需要上下文支持
post请求建议使用web_submit_data,而不是web_submint_from。原因和上面的一样
lr_think_time 被记录下的停顿时间(可理解为思考时间)
web_feg_find 设置检查点,用于在HTML页面检查是否有用户指定的文本。(在lr11中,凡是带reg的函数,都是注册函数,要放到事假操作之前)
例如检查登录后的页码是否有自己昵称,应该把检查点放到登录请求之前
web_image_check 图片检查,名称-src属性。Vuser--Run-Time Setting--Preferences(Checks-√Enable Image and text check)
web_reg_save_param 也就是 发送请求的时需要某个字段或数据,需要在在服务器的响应中才能得到。而这个字段在服务器响应中是动态的,获取到之后在请求中再发出去,实现静态参数动态数据。
类似 Jmeter中的正则表达式提取服务器的某个响应数据吧
设置:
Tools--Recording Options--Recording(HTML-bassed script--HTML Advanced 这里的第二个选项就是 get和post只使用web_url和web_submit_data)
Vuser--Run-Time Setting--Run Logic(可以设置运行时循环次数和忽略的Action)
Vuser--Run-Time Setting--Pacing(设置脚本迭代过程中脚本之间的时间间隔)
as soon as...上次结束后马上执行下次
After the pervious...
Fixed 上次结束后固定时间后执行下次
Random 上次结束后随机时间执行下次(随机时间可设置范围)
At Fixed/...无论上一次是否完成,到达规定时间后就开始下一次
Vuser--Run-Time Setting--Think Time(设置用户思考时间)
Ignore think time:运行脚本时忽略思考时间
Replay think time:设置思考时间的延迟
As recorded:根据录制的思考时间来运行
Multiply recorded think time by:根据录制的思考时间的整数倍运行
User random percentage of recorded think time:分别设置一个最大值一个最小值,然后选取一个随机值(实际中多使用)
Limit think time to:设置 thime time 的最大值。如果录制超过最大值,就以最大值为准
Vuser--Run-Time Setting--Miscellaneous:
Error Handing:运行脚本时出现错误时采取的措施,默认使用缺省值
MUltithreading:把虚拟用户当做进程还是线程来处理
Run Vuser as a process:当做进程(线上用户操作都是以进程方式进行,所以选择这个)
Run Vuser as a thread:当做线程
Automatic Transactions:设置事务模式
Define each action as a transaction:将每一个action当做一个事务
Define each step as a transaction:将每一个操作步骤当做一个事务
三、检查点
Controller--Scenario Status(场景 状态)--Passed/faled Transactions 查看事务成功和失败的数据
登陆:密码错误发现事务也都是成功的(添加事务时自己判断的方式都是成功的 lr_end_Transaction("step",LR_AUTO))
自动检查:LR_AUTO 通过对响应的状态码来判断成功失败。2XX 3XX 4XX 5XX
例:登陆,密码错误。服务器响应200(响应200说明返回的页面是正常的,不管登陆成功还是失败都说明响应是正确的给出了相应的页面(提示登陆成功或失败),只是这个登陆逻辑是错误的,电脑无法判断这个事务逻辑是否正确)
这里需要一个检查点来帮忙
检查点放在Transactions前面后面都无所谓
web_reg_find,从响应中查找特定的内容,特定标识,来判断是否成功(比如登陆后的页面 有退出,用户名...)
以[退出]为例
插入函数 web_reg_find
web_reg_find 设置界面:
Search for spectic Text:退出
Search int:选择在all、Body、Headers里找(无所谓)
save count: logincount(如果找到这个内容就保存到一个参数里(logincount))--找到了多少次(判断更准确)
Failt:Found:(在找到的时候报错)
NotFound:(在没找到的时候报错)
web_reg_find("SaveCount=logincount", (通过找到几次[退出]来判断的登陆是成功的)
"Text=退出"
LAST);
根据之前学的:lr_output_message(lr_eval_string("{logincount}"));(取参数的方式打印这个参数信息[这里显示的是次数],多放在脚本最后)
直接打印失败或者成功:
if(lr_eval_string("{logincount}")==1)---这里会报错,左面是char,右面是int所以无法判断。这里需要将char转换成int,函数atoi();
lr_output_message("登陆成功");
else
lr_output_message("登陆失败");
-----
if(atoi(lr_eval_string("{logincount}"))==1)(9)
!注意当查找的是中文时,因为lr系统用的是UTF-8编码,而中文用的多是GBK这里需要
Run-Time Setting---Internet Protoc---Preferences---Option 选择UTF-8编码,不然编码格式不对还是会找不到。
--------------
同事务结合判断
LR_AUTO 自己判断是不准确的所以可以 :
if(atoi(lr_eval_string("{logincount}"))==1){
lr_end_Transaction("login",LR_PASS));
四、参数化
唯一性参数
select next row选项:Sequential 、Random 、Unique,记住它与参数列表选取值的方式有关。
update value on选项:Each iteration 、Each occurence 、 Once,记住它与迭代方式有关。
业务要求:每一个用户只能登陆一次(需要大量不同的用户)
结合虚拟用户设置:Controller
lr_output_message(lr_eval_string("{username}"));
lr_output_message 等同于 printf(打印输出)
lr_eval_string 获取一个数值
sele next row:Unique
选择下一个行,当选项是Unique时,会出现 when out of values(当运行完全部的值后的选择策略)
continue with last value(继续下一个值),当值取完后剩下的只取最后一个值
continue in a cyclic manner(继续以循环的方式)
abort Vuser(终止虚拟用户)
----------
其他参数
Random Number
Number format %--u(1-8)根据Max的位数选择,对比min不够的情况前面补0
Update value on:
each occurrence :一次迭代不管出现几次同一个参数化,每次的random参数都不同
each iteration:一次迭代如果有相同的参数化将取一样的值
once 一次
---
Date/time
---
Unique Number
start 11 (从第11个开始取值)
Block size per Vuser 12(每次取值范围在11到11+12之间)每次取值增加的范围是12
每个用户最大只能运行12次,12次后就开始了下一个用户
第一个用户取值11-23 运行5次就分别是11 12 13 14 15
第二个用户取值23-34 23 24 25 26 27
当脚本并没有使用之前错的参数,但是在运行Controller也可能会自动检测之前的参数打印出错误的log
Date wizard:通过sql语句查询,直接获取到数据。(一次性获取不会跟随数据的更新而更新 )
五、事务
作用
1.统计每一个请求或每一批请求的响应时间:处理速度
2.统计事务的成功率:系统系统稳定(测试尽量保证100%的成功率,因为线上情况更复杂)
统计每一个请求或每一批请求的响应时间,这个需要在Contraller中
图标统计:Trans Response Time - Shole scenaario(响应时间)
和 底部的详细的时间统计
系统默认是统计每个Action的响应时间,在 step(步骤,步);Transaction(事务)
run-time Settings--Miscellaneous--Automatic Transactions
Deline each action as a transaction(统计每个action的响应时间,系统默认是这个)
Deline each step as a transaction(统计每个step的响应时间,可以理解为事务,每一个请求,更详细)
-----
自定义在脚本中统计自己想要的某个step的响应时间
在某个step前 添加 Start Transaction 和 后面添加 End Transaction
Insert--Start Transaction
Insert--EndTransaction
在start和End中间可以有多个step.
!自定义的响应统计,记得
run-time Settings--Miscellaneous--Automatic
两个选项都不要勾选。
------------------------
事务只统计时间,不判断成功是不完善的
而只使用检查点也是意义不大
事务+检查点=统计事务的成功率
六、关联
web_reg_save_param
也就是 发送请求的时需要某个字段或数据,需要在在服务器的响应中才能得到。而这个字段在服务器响应中是动态的,获取到之后在请求中再发出去,实现静态参数动态数据。
类似 Jmeter中的正则表达式提取服务器的某个响应数据
左右边界为空 所以全部获取了
验证的就是先在正确响应的响应中 找到关键的信息 ,然后根据信息设置左右边界去找。实际中肯定通过左右边界精确定位获取 然后直接if判断
---
发送请求--服务器 -- 给客户端一个动态参数(类似验证)-- 再带着这个发给服务器
例1:
请求发帖--服务器 -- 响应发帖子的页面 -- 发送帖子
遇到不确定是否要关联的参数时,可以去页面源码找到这个参数
----
在请求前 插入 web_reg_save_param 带reg的函数都是放在请求的前面
如上面的例1,需要放在最前面:
web_reg_save_param---发送请求---服务器
我们要清楚我们查找的值在哪个请求当中,要使用在什么地方。
对于自身带有双引号而又需要放到引号内的参数 需要在双引号前加入反斜杠进行转义
例2:
web_reg_save_param(
"LB=name="\"varif\""、;
"RB=\"/>";
);
!输入左右边界时尽量不要手写,区别大小写 空格,直接copy
web_reg_save_param("verifycode"; //verifycode,是给这个参数定义的名称
"LB=name="\"varify\"";
"RB=\"/>";
LAST);
---
关联的核心: 本质-查找
从哪查找-从响应当中去查找
如何查找-通过左右边界
被查找内容是不是动态变化不是关键
例:查找 [课堂练习](静态不变的)
web_reg_save_param("forum";
"LB=name=id=\"fn_31\">";
"RB=</h3>";
LAST);
lr_output_message(lr_save_string("{forum}"));
这里给出打印结果。
---
phpwind
一次性获取全部板块
左右边界每一个都是不同的,一次只能获取到一个板块如(课堂练习)
例:查找 [课堂练习](静态不变的)
web_reg_save_param("forum";
"LB=name=id=\"fn_31\">"; //这里的31是每个板块都不同的
"RB=</h3>";
LAST);
这里可以把31使用通配符替换。
web_reg_save_param函数设置界面:
Left Bourdary
Maich case(勾选代表支持通配符)
minay date(图片验证码)-- 二进制数据
Use # for any digit(使用#号替换任何数字)
例:"LB=name=id=\"fn_31\">"; 这里可以两个#号替换31:"LB=name=id=\"fn_##\">"
instance:1 -- 默认只输出通过关联找到的第一个,这可以修改为几就输出第几个,一次还是只能输出一个
Relative Frame ID 查找的响应包含框架页面的响应(后台)
Not Found: 没找关联时的处理方式
ERROR 报错-会停止运行
WARNING 只给一个警告,脚本不会被中断,输出是空
Save length:50 Save offset 10
当查找到的字符串太长,进行截取 .如上:从第10个开始截取 一共保存50个,也就是10-60这些字符串
ignore Redirections 忽略重定向(例如先提示登陆成功页面再跳转到登陆后的页面)如果勾选,只查找到提示登陆页面重定向的登陆后的页面将不不查找(建议不勾选)
全部拿来用:关联数组---------------------------
phpwind
一次性获取全部板块
左右边界每一个都是不同的,一次只能获取到一个板块如(课堂练习)
例:查找 [课堂练习](静态不变的)
web_reg_save_param("forum";
"LB=name=id=\"fn_31\">"; //这里的31是每个板块都不同的
"RB=</h3>";
LAST);
这里可以把31使用通配符替换。
web_reg_save_param函数设置界面:
Left Bourdary
Maich case(勾选代表支持通配符)
minay date(图片验证码)-- 二进制数据
Use # for any digit(使用#号替换任何数字)
例:"LB=name=id=\"fn_31\">"; 这里可以两个#号替换31:"LB=name=id=\"fn_##\">"
instance:1 -- 默认只输出通过关联找到的第一个,这可以修改为几就输出第几个,一次还是只能输出一个
Relative Frame ID 查找的响应包含框架页面的响应(后台)
Not Found: 没找关联时的处理方式
ERROR 报错-会停止运行
WARNING 只给一个警告,脚本不会被中断,输出是空
Save length:50 Save offset 10
当查找到的字符串太长,进行截取 .如上:从第10个开始截取 一共保存50个,也就是10-60这些字符串
ignore Redirections 忽略重定向(例如先提示登陆成功页面再跳转到登陆后的页面)如果勾选,只查找到提示登陆页面重定向的登陆后的页面将不不查找(建议不勾选)
全部拿来用:关联数组
随机板块发帖--找到板块的编号--拿到所有板块的编号
web_reg_save_param("forum";
"LB=name=id=\"fn_31\">";
"RB=</h3>";
"Ord=All";
LAST);
怎么输出全部的编号(web_reg_save_param 设置界面--Instance(all) ),
打印会给一个{forum}(这里不是单单的参数名,而是一个存放很多个板块的数组)
单独打印想要的某一个
例:
lr_output_mssage(lr_eval_string("forum_2")); 这里会获取到第二个板块的编号
在最上面定义i
Action_Correlate() {
int i=1;
//char mystring[10]="" ; //定义一个字符串数组,用来拼接
for(i=1;i<lr_paramarr_len("forum");i++) { //lr_paramarr_len 获取到关联数组的长度
lr_output_message(lr_paramarr_idx("forum",i)); //循环输出全部板块
//lr_output_message(lr_paramarr_random);//随机输出全部板块
}
在获取到全部板块后,在进入首页有板块列表的请求后加入
lr_save_string(lr_paramarr_random("from"),"fromid"); //把获取的到值赋值给fromid
然后`在发帖请求的编号,引用fromid”
"Name=fid","value={fromid}", ENDITEM,
//for(i=1,i<10,i++) { //这种方式没办法判断 到底有多少板块,不会跟随着板块的变化而变化,所以用到 lr_paramarr_len
//printf(在命令行中输出),sprintf(格式化输出,打印在字符串中)
//sprintf(mystring,"{forum_%d}",i); %d是一个占位符,运行后会把i放到%d处,然后赋值给mystring.注;这里{forum_%d}不能少于10个字符
//lr_output_mssage(lr_eval_string(mystring));
//}
return 0;
}
七、集合点
适应场景:并发测试。主要关注大量用户并发的时候(所有用户都在发请求&所有用户都在提交同一个请求)
集合点不能模拟真实场景(重点请求,易错请求,易阻塞请求单点测试,针对某一个模块得到更精确的数据)找到服务器的瓶颈
可以理解为压力测试的一个子集
负载测试,评估性能测试(尽可能的真实场景)。例如,一百个人请求时什么情况,一千个人是什么情况
压力测试不需要思考时间
稳定性测试:长时间,标准用户数 (最佳用户-系统处于最佳状态;大用户数-某一个指标出现极限)
用法:
//插入集合点,对下面的请求进行并发.
lr_redezvous("");这有一个等待的时间,虚拟用户到达集合点的时间是不相同的,等待所有的虚拟用户走到这以后再一起进行并发。
所以当集合点放在事务里面,事务的响应时间会包含这些时间比实际可能要大。
而这个时间是lr自己运行花费的时间,不是我们进行统计的系统的时间。
所以这个时间千万不要被统计到事务里面去,因此 应该是先有集合点然后再有事务。
开始事务
登陆的请求
结束事务
集合点的设置是放在Controller中的,
集合点设置策略 Scenario---Rendegvous
Vuser:(这里没必要选择参与不参与)
虚拟用户列表(1-30)(默认是全部参与集合然后发送请求)
这里可以选择 例如选择11-20Enable Vuser,这几个虚拟用户不参与集合.(他们自己该干嘛干嘛进行下一步请求啊啥的)
剩下的20个用户会在集合点处停止然后一起进行请求
Policy(4个策略)--保持默认就行
Release when[]% of all Vuser arrive at the Rendegvous 百分之多少的虚拟用户在到达集合点后释放发请求(会等待全部的虚拟用户数,如在Controller中的慢增长用户没有全部开始前的时间都是在等待)
Release when[]% of all running Vuser arrive al the Rendegvous 百分之多少的正在运行的虚拟用户在到达集合点后释放发请求(建议这种)
Release when[] Vuser arrive at the Rendegvous 这个直接指定虚拟用户数
Timeout Between Vuser[]Sec. 等待超时的时间,时间到了后不等了就直接释放发布请求(保持默认30s)
Enable Rendegvous 可以禁用脚本里面不用的集合点,直接忽视掉
八、思考时间
在回放时如果想要思考时间生效 需要在Run time Setings 勾选Replay think time(回放事脚本会暂停对应的时间)
think time options
Replay think time
As recorede 默认勾选,同录制的一样
Multiply recorded think time by[] 会以录制的倍率设置思考时间
Use random percentage of recorded think time.
Min:[]% Max:[]% 会以录制时间的百分比设置最大和最小区间,推荐50%-200%
Limit think time[]seconds