本篇博客
1 录制时的设置
2 运行脚本时设置:
3 学习函数
4 参数化
注意:如果看不清图片,可以点击编辑进行查看。
1 录制时的设置
Option打开:已近录制的脚本,有两种打开option方法。
第一种:点击Start Record
第二种:点击Edit Recording Options(蓝色2)
1.1 HTML-based script和URL-based script的区别:
1)HTML-based方式
Based-HTML(默认):将与打开一个网页(HTML)有关的的所有请求“封装”为一个步骤
web_link、web_submit_form(示范):
- 依赖上下文关系
- 编写规则:web_link("访问首页","Text=LoadRunner",LAST);
web_url、web_submit_data(示范):
- 不依赖上下文关系
- 编写规则:web_url("访问首页","url=http://www.baidu.com",LAST);
2)URL-based 方式
将每一个不同url的请求封装为步骤
3)HTML和URL适用场景:
1. 如果应用是WEB应用,首选是HTML-based script
2. 不是基于浏览器的应用程序推荐使用URL-based script
1.2 解决录制乱码:选择UTF-8
2 脚本回放设置
2.1 参数的介绍
1.Run logic--->设置Action的迭代次数
用户建模:
- init
- action
- end
2.pacing---->迭代之间的步长
1).上一次迭代一结束就开始新的迭代
2).在上一次迭代结束之后
延迟固定的时间xx开始新的迭代
延迟随机的时间段开始新的迭代
3).延迟
固定的时间xx开始新的迭代
随机的时间段开始新的迭代
注意:延迟的时间包括上一迭代运行的时间
3.日志log---->Enalbe logging--->无论是否有错误记录日志、只有出错时才记录日志
1).启用日志
只有当错误出现的时候才记录日志
扩展日志:参数置换信息
标准日志
2).关闭日志
4.Think time---->函数之间的思考时间
1)忽略思考时间
2)记录思考时间:
- 按照实际执行时间
- 按照实际时间倍数
- 按照实际时间的百分比执行
- 统一规则:限制思考时间不超过xx秒
3)作用:更加真实的去模拟用户操作之间的延迟
5.Internet protocol
checks:启用/关闭图片和文本检查
6.Miscellaneous
以进程方式运行虚拟用户:
- 进程独享一块内存,比较稳定,大约占用4M以上
- 内存资源浪费,可模拟的虚拟用户少
以线程方式运行虚拟用户:
- 线程之间共享一块内存,可以模拟的虚拟用户多,大约占用1M-2M
- 线程之间容易发生资源竞争,出现线程阻塞,不稳定
进程和线程区别
1.定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 线程自己基本上不拥有系统资源,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
2.关系和区别
a.同一个进程中的多个线程之间可以并发执行,线程不能够独立执行, 必须依存在应用程序中,由应用程序提供多个线程执行控制
b.线程同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉, 进程有独立的地址空间,一个进程崩溃
后,在保护模式下不会对其它进程产生影响
c.一个程序至少有一个进程,一个进程至少有一个线程.
d.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
e.多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
f.线程执行开销小,但不利于资源的管理和保护;而进程正相反
2.2 页面的操作,介绍上面的参数。
有两种方式打开设置页面,如下页面。
第一种打开:Vuser-----Run-Time Settings
第二种打开:点击 Edit Runtime Settings(图标)
1)Run logic:用户建模
- init
- action
- end
注意:迭代的作用点为action,不会作用在init, end
Number of Iterations:3 设置脚本运行次数为3次,指针对Action部分。Init和End只有一次。
点击三角形运行,查看结果。
2)Pacing(步长)
1.上一次迭代一结束就开始新的迭代
2.在上一次迭代结束之后
延迟固定(fixed)的时间xx开始新的迭代
延迟随机(random)的时间段开始新的迭代
例:延迟固定(fixed):迭代时间步长,固定5秒。
等待5秒
例:延迟随机(random):5-10秒随机。
查看结果,7秒多。(在5-10秒之间)
3.延迟
上一次迭代开始到下一次迭代开始之间的时间设置
固定的时间xx开始新的迭代
随机的时间段开始新的迭代
注意:延迟的时间包括上一迭代运行的时间
例:从前一次迭代开始的时间到下一次迭代开始的时间为20秒。(如果超过20秒,直接进入下一个迭代。)
第一次迭代完剩下3秒多就达到20秒了。
第二次迭代剩18秒多,就到20秒了。很快就到第三次迭代了。
例:从前一次迭代开始的时间到下一次迭代开始的时间为(随机60秒到90)秒
3)Log :日志
Enable logging(勾选上): 启用log日志。Replay Log才会显示日志。
Enable logging(勾没选上):关闭log日志。
启用log日志。Replay Log才会显示日志。
Log options:按箭头顺序
1)只有当错误出现的时候才记录日志
2)一直记录日志
3)标准日志
4)扩展日志:参数置换信息
4)Think time:按箭头顺序
作用:更加真实的去模拟用户操作之间的延迟
1)Ignore think time表示的是忽略思考时间。运行时Action就没有任何时间等待。
2)Relpay think time:运行的时候使用这个思考时间。
- As recorded:运行的思考时间和录的时间一样。
- Multiply recorded think time :运行的思考时间是录的时间的几倍
- Use random percentage of recorded think time:运行的时间是录的时间的百分之多少。(例如:录得时间是10秒,运行的时间是(Min:50% Max:150%)5秒到15秒。
- Limit think time :具体限制运行的时间是多少秒。
Ir_think_time(24)表示的是函数与函数的等待时间。
lr_think_time(24);
5)Miscellaneous:多线程的情况。
Run Vuser as a process:以进程方式运行虚拟用户,进程独享一块内存,比较稳定,大约占用4M以上,内存资源浪费,可模拟的虚拟用户少。
Run Vuser as a thread:以线程方式运行虚拟用户,线程之间共享一块内存,可以模拟的虚拟用户多,大约占用1M-2M,线程之间容易发生资源竞争,出现线程阻塞,不稳定
最好是线程的方式,但线程也有缺点:可能会出现资源争用的情况(比如用QQ,和多个人聊天,来不及切,就会卡)
任务管理器
6)Preferences:优先设置
Enable Image and text check:启用图片文本检查。(后面有个地方会用到)
3 写函数
web_url()--->发送get请求
web_submit_data()--->发送get或者post
web_custom_request()--->可以发送任何请求
学习函数:
1)lr_eval_string("{参数名}");------------>取出参数中的值
用法:
lr_eval_string("{参数}");
2)lr_save_string("string","name");--------------->保存string到参数name中
举例:
lr_save_string("51testing","name")
3)lr_output_message("输出的内容")
atoi:把字符串转换为整数,itoa:把整数转换为字符串
例:web_url函数
1)假如已经打开别的脚本,新创建一个脚本编辑区。
2)跳到录制这里,一定记得直接取消掉
3 编写web_url函数
web_url函数发送get请求
用法:
- 步骤名称:"访问首页",
- 请求地址:"URL=http://www.baidu.com"(通过抓包获取/接口文档获取)
- LAST);
4)脚本写完,保存先,编译。确认代码没有问题。
5)运行代码,看一下结果对不对。
View----Test Results
6)点击Url:open ,可以看到访问的页面。
例:web_submit_data函数
1)添加函数:Insert---New Step
如果出现下面这个:
因为光标放在了{ }外面,准确的是放在return 0 前面
2)选择Submit Data 点击Ok
如果没有找到Submit Data,也可以在下面搜索web_submit_data 搜索到点击OK
3)参数设置 (从箭头指的2开始)
Step:web_submit_data (步骤名称可以改)
Method:Post
Action:接口地址
Record mode:HTTP(响应数据形式) HTML(页面形式)
4)添加参数,点击确定。
5) 参数如下
6) 函数web_submit_data就有了,这里不是自己写的,是生成的。
web_submit_data();
作用:模拟浏览器发出get/post请求
用法:
- 步骤名称:"访问首页",
- 请求地址:"Action=http://www.baidu.com",(通过抓包获取/接口文档获取)
- 请求方法:"Method=POST",
- 只能支持get和post请求方式
- 请求模式:"Mode=HTTP/HTML",
- 表单数据Data:
- 通过抓包工具获取表单内容
- ITEMDATA,
- "Name=fastloginfield", "Value=username", ENDITEM,
- LAST);
7)编译,运行,看结果:View----Test Results
结果没成功(因为参数Usersession是之前的,所以不成功。)
例:Web_custom_request函数
1)添加,也可以通过搜索。
2)设置参数
3)这里就生成了函数web_custom_request。
web_custom_request()
作用:模拟浏览器发出HTTP支持的任何方式的请求
用法:
- 步骤名称:"访问首页",
- 请求网址:"URL=http://www.baidu.com",
- 请求方法:"Method=POST",
- http支持的任何请求方式
- 请求模式:"Mode=HTTP/HTML",
- 请求正文:"Body=abcd",
- 支持任意格式的数据提交
- 直接填写发送正文
- LAST);
注意:函数中mode为http时,Test-results中看不到浏览器中的页面
4)编译,运行,查看结果:View----Test Results(没成功,是因为之前的原因)
4 参数化
1.参数化:数据和代码分离
2.参数化取值策略:9种策略--->第7种和第8种回去再看视屏
3.函数:
打印:lr_out_message()--->是用来输出内容的、lr_eval_string()--->获取参数的值,
4.for循环
格式:
for(初始化语句;条件语句;循环变量变化){
循环体
}
注意:代码编辑区的变量一定要放在首行
4.1 参数化步骤
1)点击箭头指的P
2)点击New---Create Table
3)直接在username下面的表格里修改,原值value。添加下一个数据,点击Add Row。用 Notepad编写,点击Edit with Notepad。
4)用记事本写数据,最后一行要回车一下,留一行(只能留一行,不能多留,也不能少留),才能读到最后一行,如下图。
文件-----保存
5) 文件都建好了,要点close保存并关闭,不能点上面的叉关闭。
6)把鼠标放在“zhangyuqi”字母中间,右键---Replace with a Parameter
7)选择参数名字,刚才设置的username,点击OK。
也可以点击Properties看刚设置的内容。
8)就实现了参数化。参数的两边有花括号:{username}
9)看有几组数据,运行几遍
10) Vuser----Run Time Setting
11)Run Logic-----Number of Iteration:4------ok
12)编译,运行,查看结果:View----Test Results。查看结果:4组数据读取到了,成功了。
13)可以打印输出参数。
第一种写法:
lr_output_message(lr_eval_string("{username}"));
第二种写法:和python一样。这两种都是C语言的写法。
lr_output_message("output de neirong shi:%s",lr_eval_string("{username}"));
查看函数的文档帮助信息:选中函数,按下F1。
关于参数化的3个小技巧。
1)如果不想参数化:还原回去
选中pwd---右键----Restore orginal value
2)参数化读取的时候:为什么是从第一个数据开始读的。它的一些设置规则如下图所示。
多列数据,就按上面的规则逗号分割。还有按制表符分割,空格分割。
3)参数化标签花括号的由来:
Tools----General Options
这里不用改,只是看一下。为什么代码里的参数化是{}表示。
4.2 参数化策略
不懂一定要多看两遍(第7种和第8种),不然不会设置。到时候看Controller就乱七八糟的。
取值顺序A:控制更新时怎么取值
Sequential-------A1(顺序)
Random----------A2(随机)
Unique------------A3(唯一) 为了效果,可以做一次并发。用Controller(A3B1,A3B2)
何时更新B:控制什么时候更新
Each iteration----------B1(每次迭代)
Each occurences-----B2(每次出现)
Once---------------------B3(一旦)
注意:当A为unique时,要考虑值被用光的策略
- 放弃
- 循环
- 使用最后一个值继续
1 A1B1 每一次迭代,顺序取得。
A1B1 每一次迭代,顺序取得。
顺序取值,每次迭代更新:不管输出多少内容,只要是同一次迭代,输出的值相同。
还是A1B1组合,打印两遍。出现的值取决于迭代。只有迭代的时候,值才会发生变化。同一次迭代,永远取相同的值。
还是A1B1组合,迭代设置1次。会出现4次1。
2 A1B2 顺序取值,每次出现更新
A1B2 顺序取值,每次出现更新
每次出现取值,就会得到新的值,和迭代没有关系。取完后,再重新取第一个值。
还是A1B2
3 A1B3 顺序取值,只取一次,不再更新。
A1B3 顺序取值,只取一次,不再更新。 (选择值以后,不再发生变化。)
设置:1次迭代
还是A1B3设置:10次迭代
4 A2B1 每次迭代随机一次
A2B1 每次迭代随机一次
只有发生迭代以后,值才会发生变化,是随机取的。每次迭代中的值不会随着输出次数而变化。
设置1次迭代
还是A2B1设置10次迭代,打印1遍。
同上(还是A2B1设置10次迭代,),打印两遍。
5 A2B2 每次出现随机一次
A2B2 每次出现随机一次 只要发生变化,就会随机取值,与迭代次数无关
6 A2B3 就随机一次,不再更新
A2B3 就随机一次,不再更新 随机取值之后就不再变化。
7 A3B1 每次迭代,唯一取值
A3B1 每次迭代,唯一取值
多了一个参数,如果超过数据,做什么操作。
1.When out of values:About Vuser(当超过值,就放弃它)
A3B1,迭代10次
A3B1迭代11次
2. When out of values:Continue in a cyclic manner 当超过值,继续循环去执行
A3B1: 这里有点像A1B1
3.When out of values:Continue with last value 当超过值,继续取最后一个值。
A3B1,迭代11次。
下面关乎到性能并发的问题。
Allcate Vuser Vallues in the Controller:在Controller给Vuser分配值有自动和手动的区别。
自动(Automatically allocate block size):在Colltroller vuser的取值,自动的给一块的大小。这是默认的。
注意:只要看到Unique,就和并发数量有关系。
目前只有一个用户,不断取一个值在跑。所以下面要用到Controller,来用解决并发,看看上面一块大小是什么意思。
1)先File save as保存这个脚本。
2)Tools----create Controller Scenario :打开Controller
3)设置10个用户
4)选择Basic schedule
5) 选择迭代1次,然后点击运行。依次执行下面4个步骤。
6)选中10右键----show Vuser Log
7)会出现10 个窗口,每个用户都不一样,就表示有10个用户。
8)换为迭代10次,这里还是10个用户。
9)查看结果,1次成功,9次失败。因为没有唯一值了。
10)换为5个用户,迭代2次。这里修改的是迭代2次。
11)可以看到已经修改好5个用户,点击运行。
12)结果:出现5个窗口。其中数值两两相同,每个都有2个,一共10个。
13)换成5个用户,3次迭代,点击左1三角形运行。
14)选中5右键----show Vuser Log ,出现下面窗口。
16) 选中Failed1,右键----show vuser log
17)失败原因没有唯一值。
实际中并发数量是由Duration 持续时间来决定的(下面箭头所指)。并不是由迭代而决定的。
实际中并发数量并不是由迭代而决定的。
8 A3B2 唯一取值,每次出现更新
A3B2 很像A3B1 唯一取值,每次出现更新
要想看结果,上Controller去看
理解:每一个用户取几个值的操作
如果有10个值,每一个用户设置可以取2个值。就被分成5块。每一个用户在取的时候,迭代1次没有问题,迭代2次没有问题。迭代第3次就有问题了。因为没有唯一值了。
如果有10个值,每一个用户设置可以取5个值。就被分成2块。每一个用户在取的时候,迭代1次没有问题,迭代2次没有问题。迭代第3次没有问题了。迭代第4次没有问题,
迭代第5次没有问题,迭代第6次就有问题了。因为没有唯一值了。
1)A3B2 ,打印1遍。
2)设置A3B2,设置当超过值就放弃。设置1个值,分成了10块。
3)设置迭代2次
4)看下结果,没有问题
这里跑的都是1个用户,我自己。一个用户可以取1个值,迭代第2次,一个用户再在另一个块里取1个值。
例:A3B2,每个用户1块。迭代1次。打印2遍。1个用户。
每个用户取1个值,连续取两。第2个值超过范围了。但是这里怎么取到了呢???
因为这里是单用户,这里有10个值,够它取的。
例:A3B2,每个用户1块。超过就放弃。打印1遍。10个用户,迭代1次。
1)设置策略,保存。之前的Controller关闭。Tools---Create controller scenario 这里设置10个用户。
2)迭代次数设置1次
3 )设置并发,选择Basic schedule就可以了。点击三角型运行。
4)查看结果,10个用户都通过了。
5)如果打印两遍,file-save保存。其他设置一样。
6)查看结果,10个用户都失败了,每一个用户的值都不够用。一个块里只有一个值,每个用户还输出两个值,所以不够用,就失败了。
想一下之前单用户,连续输出两次可以成功。这里失败了,是因为10个用户一起并发的取值。只要超过值就放弃,所以这里不行。
9 A3B3 一旦选中,不再发生变化。
A3B3 一旦选中,不再发生变化。
思考:用以上9种参数化策略中,哪种可以实现注册功能?
答:可以用A3B1,或者A3B2。还要设置:一旦超过,就放弃掉。就能取唯一值。
小练习题:实现用户随机点击左边图标。
1)用抓包工具发现,每一个图标都点击,只有url中的fid参数不一样 。
2) 只要把fid的值,参数化
3)把数据添加进去,使用的策略是A2B1。每次迭代,都随机。
4) 设置迭代10次。(一个用户跑10遍,如果跑通了,Controller设置并发,多个用户跑也没有问题。)关闭日志。方便查看结果。
5) 点击运行,看打印的结果。
6) 看到底点了哪些页面,可以上View-----Test Results查看结果。
换个效果:想迭代一次,随机将所有模块点击。
其实就是学习for循环语句。(要设置A2B1,迭代1次)
for循环格式:
int i; //代码编辑区的变量一定要放在首行
for(初始化语句;条件语句;循环变量变化){
循环体
}
注意:代码编辑区的变量一定要放在首行
1)代码如下,记得设置迭代1次。
2)设置A2B2 每次出现,随机
3)查看结果
作业:完成飞机定票的。每个Action,完成不同的操作
用分析器,可以看出不同操作。花费的时间是多少。
总结:关于参数化问题:
1.参数的数据最后一行未留空行,造成错误
2.参数化取值策略不正确