author: selfimpr
blog: http://blog.csdn.net/lgg201
mail: lgg860911@yahoo.com.cn
的柳胜前辈精彩的讲解
以下是我的读书笔记, 在公司是程序员, 工作需要, 简单学习一下, 分享出来, 不足之处, 请邮件指点, 谢谢.
Vuser
脚本语言基础
1
脚本结构
:
1.1
vuser_init:
脚本初始化操作
,
一般放置登录操作
,
分配内存等
,
在播放
vuser_init
时
, Controller
的
Vuser
状态区域会显示
initialize
状态
1.2
Action:
虚拟用户要做的业务操作
.
1.3
vuser_end:
与
vuser_init
对应
,
做收尾工作
.
2
脚本中使用的三种函数
2.1
VU
通用函数
: lr_
系列函数
2.2
协议相关函数
:
一般以协议名开头
,
比如
web
协议就是
web_
系列
2.3
语言相关函数
:
由
VU
脚本的生成语言决定
.
多用于用户自定义函数进行脚本扩展
.
3
以
C
语言的
VU
脚本为例
,
实际上是隐式的存在
main
函数的
,
然后在
main
中去依次调用了
vuser_init, Action, vuser_end
几个函数
.
4
录制
HTTP
协议的
web
系统测试脚本时
,
会生成一个
globals.h
文件
,
这个文件用来负责
vuser_init,
Action, vuser_end
三个脚本都可用的全局变量的声明
.
5
lr_whoami(*userid, char
**groupname, int *sceneid)
可以用来获取当前运行
vuser
的
vuserid,
组名
,
场景
id,
在动态参数化的时候
,
可以使用这些值来构建动态参数
.
6
自定义函数
:
6.1
直接引用
:
以
C
语言产生的脚本
,
可以直接在
Action
外部定义函数
,
然后在
Action
内使用
.
6.2
本地加载
:
使用
lr_load_dll(char *dll_file_name);
加载动态链接库
,
然后调用库中的函数
.
6.3
include
模式
:
把多个函数写在一个文件中
,
在
vuser_init,
Action, vuser_end
中的
include
并调用
6.4
全局加载
(dll)
模式
:
在
LoadRunnder/data
目录下的
mdrv.dat
文件中
,
查找对应协议
,
然后在下面按照已有内容格式配置链接库即可
7
通用
vu
函数
:
构建在
C
语言基础上的脚本框架函数
,
以
lr
开头
,
分为以下几类
7.1
事务和事务控制函数
:
7.1.1
lr_end_sub_transaction:
标记子事务的结束以便进行性能分析
7.1.2
lr_end_transaction:
标记
LoadRunner
事务的结束
7.1.3
lr_end_transaction_instance:
标记事务实例的结束以便进行性能分析
7.1.4
lr_fail_trans_with_error:
打开事务的状态设置为
LR_FAIL
并发送错误消息
.
7.1.5
lr_get_trans_instance_duration:
获取事务实例的持续时间
7.1.6
lr_get_trans_instance_wasted_time:
获取事务实例浪费的时间
7.1.7
lr_get_transaction_duration:
获取事务的持续事件
(
按事务名称
)
7.1.8
lr_get_transaction_think_time:
获取事务的思考时间
(
按事务名称
)
7.1.9
lr_get_transaction_wasted_time:
获取事务浪费的时间
(
按事务的名称
)
7.1.10
lr_resume_transaction:
继续收集事务数据以便进行性能分析
7.1.11
lr_resume_transaction_instance:
继续收集事务实例数据以便进行性能分析
7.1.12
lr_set_transaction_instance_status:
设置事务实例的状态
7.1.13
lr_set_transaction_status:
设置打开事务的状态
7.1.14
lr_set_transaction_status_by_name:
设置事务的状态
7.1.15
lr_start_sub_transaction:
标记子事务的开始
7.1.16
lr_start_transaction:
标记事务的开始
7.1.17
lr_start_transaction_instance:
启动嵌套事务
(
由它的父事务的句柄指定
)
7.1.18
lr_stop_transaction:
停止事务数据的收集
7.1.19
lr_stop_transaction_instance:
停止事务实例的数据收集
7.1.20
lr_wasted_time:
消除所有打开事务浪费的时间
.
7.2
命令行分析函数
:
当
LoadRunner
以命令行方式启动和运行时
,
以下函数用来分析命令行
7.2.1
lr_get_attrib_double:
检索脚本命令行中使用的
double
类型变量
7.2.2
lr_get_attrib_long:
检索脚本命令行中使用的
long
行变量
7.2.3
lr_get_attrib_string:
检索脚本命令行中使用的字符串
7.3
系统信息函数
:
获取
VU
的系统信息
7.3.1
lr_user_data_point:
记录用户定义的数据采集点
7.3.2
lr_whoami:
将有关
vuser
的信息返回给
vuser
脚本
7.3.3
lr_get_host_name:
返回执行
vuser
脚本的主机名
7.3.4
lr_get_master_host_name:
返回运行
LoadRunner Controller
的计算机名
7.4
字符串函数
:
7.4.1
lr_eval_string:
返回参数的当前值
7.4.2
lr_save_string:
将以
NULL
结尾的字符串保存到参数中
7.4.3
lr_save_var:
将变长字符串保存到参数中
7.4.4
lr_save_datetime:
将当前日期和时间保存到参数中
7.4.5
lr_advance_param:
前进到下一个可用参数
7.4.6
lr_decrypt:
解密已编码的字符串
7.4.7
lr_eval_string_ext: lr_eval_string
的扩展
,
为指向包含参数数据的缓冲区的指针
7.4.8
lr_eval_string_ext_free:
释放由
lr_eval_string_ext
分配的指针
7.4.9
lr_save_searched_string:
在缓冲区中搜索字符串实例
,
并将该字符串实例保存到参数中
.
7.5
消息函数
:
7.5.1
lr_debug_message:
将调试信息发送到输出窗口
7.5.2
lr_error_message:
将错误消息发送到输出窗口
7.5.3
lr_get_debug_message:
得到当前的消息类
7.5.4
lr_log_message:
将输出消息直接发送到
output.txt
文件
,
此文件位于
vuser
脚本目录
7.5.5
lr_output_message:
将消息发送到输出窗口中
7.5.6
lr_set_debug_message:
为输出消息设置消息类
7.5.7
lr_vuser_status_message:
生成格式化输出并将其打印到
Controller Vuser
状态区域
7.5.8
lr_message:
将消息发送到
vuser
日志和输出窗口
.
7.6
运行时函数
:
7.6.1
lr_load_dll:
加载外部
dll
7.6.2
lr_think_time:
暂停脚本的执行
,
以模拟思考时间
7.6.3
lr_continue_on_error:
指定脚本如何处理错误场景
,
是继续还是退出
7.6.4
lr_rendezvous:
在
vuser
脚本中设置集合点
8
HTTP
协议函数
:
8.1
HTTP
协议
:
8.1.1
header
设置
:
8.1.1.1
web_add_header
8.1.1.2
web_clean_heander
8.1.2
点击链接
:
8.1.2.1
web_link(
文字链接
)
8.1.2.2
web_image(
点击图片链接
)
8.1.3
提交表单
:
8.1.3.1
web_submit_data
8.1.3.2
web_submit_form
8.2
web
系统设置
8.2.1
cache
设置
:
8.2.1.1
web_cache_leanup
8.2.1.2
web_load_cache
8.2.2
cookie
设置
8.2.2.1
web_add_cookie
8.2.2.2
web_cleanup_cookies
8.2.3
proxy
设置
8.2.3.1
web_set_proxy
8.2.3.2
web_set_secure_proxy
8.3
LoadRunner
框架支持
8.3.1
检查点
:
8.3.1.1
web_find
8.3.1.2
web_image_check
8.3.2
关联
8.3.2.1
web_create_html_param
8.3.2.2
web_create_html_param_ex
8.3.2.3
web_reg_save_param
8.3.2.4
web_set_max_html_param_len
8.3.3
控制
8.3.3.1
lr_start_transaction
8.3.3.2
lr_rendezvous
8.3.3.3
lr_think_time
用户行为模拟器
—VUSER
1
录制
HTTP
协议的脚本时
,
录制方式的选择原则
:
1.1
基于浏览器的应用程序使用
HTML-basedScript
1.2
不是浏览器的应用使用
URL-based Script
1.3
如果基于浏览器的应用程序中包含了
Javascript
并且该脚本向服务器产生了请求
,
比如
DataGrid
的分页按钮等
,
也要使用
URL-based
方式录制
1.4
给予浏览器的应用程序中使用了
HTTPS
安全协议
,
使用
URL-based
方式录制
.
2
几种有用的日志
:
脚本能够正常运行后
,
应当禁用日志以降低消耗
.
2.1
执行日志
:
2.1.1
脚本运行时产生
.
2.1.2
描述
Vuser
运行时执行的操作
2.1.3
黑色表示标准输出消息
,
红色表示标准错误消息
,
绿色用引号括起来的文字字符串
(
例如
URL),
蓝色表示事务信息
(
开始
,
结束
,
状态
,
持续时间
);
2.2
录制日志
:
在脚本录制过程中产生
,
详细描述录制过程中客户端与服务器之间的各种交互动作
.
2.3
产生日志
:
记录了脚本录制的设置
,
网络实践到脚本函数的转换过程
.
3
Tools/General Options/Display/Show
browser during replay
选中后可以在
VU
运行时查看浏览器活动
,
不过这只是一个不完整的解释器而不是浏览器
,
因此一些脚本可能会加载不完全
.
打开运行时查看器后在运行脚本时就会实时播放动作
.
4
关联
:
对于一些请求
,
需要以前面某次请求服务器响应的数据去作为请求参数
,
因此
,
不能把这些数据硬编码
,
而是以参数的方式提供
,
同样
,
要使用的前面某次请求响应的数据也要写入到变量中以便使用
.
5
录制前自动关联
:
在录制脚本之前
,
已知寻找需要关联数据和关联的规则
,
就可以通过为
VU
设置规则来让其自动关联
.
5.1
内建关联规则
:
对于一些常用系统
, VU
有内建的关联规则
,
通过
Recording Options/HTTP
Properties/Correlation
中启用关联规则
,
然后选择相应的关联规则
,
则在录制对应的系统时
,
就会自动建立关联
.
5.2
自定义关联规则
: Recording Options/HTTP Properties/Correlation
中建立新的关联规则
(
也需要启用关联
)
6
录制后自动关联
:
录制完成后
,
脚本至少需要执行一次
,
在执行中
,
录制后关联会试图找出录制时和执行时服务器响应内容的差异部分
,
藉以找出需要关联的数据并建立关联
.
7
手动关联
:
7.1
找出需要关联的数据
7.1.1
使用相同的业务流程和数据
,
录制两份脚本
7.1.2
使用
WinDiff
工具找出不同点
: Tools/Compare with Vuser
7.2
使用
web_reg_save_param
函数手动建立关联
7.3
web_reg_save_param
函数放在要检查内容的请求之前
7.4
原理
:
捕获第一个操作的输出
à
保存为参数
à
将参数作为另一个操作的输入
8
关联的用户和意义
:
8.1
简化和优化脚本代码
8.2
动态生成数据
: session
等服务器端返回数据的利用
8.3
支持唯一数据
9
除了显式的以
lr_start_transaction
控制事务外
,
还可以在
vuser
的运行时设置中的
miscellaneous
选项中定义自动事务
.
10
集合点
(
同步点
):
为了模拟较重的用户负载
,
需要模拟多个
vuser
同时向服务器发送请求
,
此时
,
就可以在
vuser
脚本中通过
lr_rendezvous
来创建集合点
, Controller
在遇到集合点时会暂停脚本
,
等待其他
vuser
到达后
,
一起释放
vuser
运行
.
需要注意的是只能在
action
中添加集合点
,
而不能在
vuser_init
和
vuser_end
中创建
.
11
思考时间
:
为了模拟用户在操作过程中的停顿
,
可以用
lr_think_time
来设置思考时间
,
思考时间的单位是秒
.
有时测试不需要思考时间
,
这时就可以通过
Run-time Settings/Think time
中设置忽略思考时间
.
12
由于集合点和思考时间在
Controller
运行中都会产生等待
,
因此如果在事务中有这两项操作
,
就可能会对事务的响应时间产生影响导致结果不准确
.
13
参数化的过程
:
13.1
在脚本中用参数取代常量值
13.2
设置参数的属性以及数据源
.
14
参数数据源类型
:
参数的信息在脚本目录下的
”
脚本名
.prm”
文件中
14.1
Data Files:
数据保存在文件中
14.2
User-Defined Functions:
调用外部
dll
函数生成数据
14.3
Internal Data:
虚拟用户内部产生的数据
14.3.1
Date/Time:
用当前日期
/
时间替换参数
,
需要指定
Date/Time
格式
.
14.3.2
Group Name:
用虚拟用户组名称替换参数
14.3.3
Load Generator Name:
用脚本负载生成器的名称替换参数
,
负载生成器是虚拟用户在运行的计算机
14.3.4
Iteration Number:
用当前迭代数目替换参数
14.3.5
Random Number:
用一个随机数替换参数
14.3.6
Unique Number:
用一个唯一的数字来替换参数
.
14.3.7
Vuser Id:
用运行时分配给
Vuser
的
id
替换参数
15
Tools/General
Options/Parameterization
可以定义参数的括号类型
.
16
直接的参数化
,
只有在其作为函数参数时才能够使用
,
而且
,
有些函数的有些参数是不能被参数化的
,
在这种情况下
,
如果想要参数化
,
可以使用
lr_eval_string()
来代替要参数化的内容
,
而我们去参数化
lr_eval_string()
的参数
.
17
由于
lr_eval_string
返回的是一个指向参数值的指针
,
内容在每次
Iteration
后自动释放
,
因此
,
对于一个大的
Iteration,
如果使用
lr_eval_string
做参数化可能导致内存迟迟不能释放
,
此时可以使用
lr_eval_string_ext
和
lr_eval_string_ext_free