在性能测试时,录制完成的脚本往往只是一个起点。要让脚本真正模拟出真实用户行为并获取有价值的性能数据,脚本增强是重要步骤。
脚本增强主要技术
在LoadRunner中,脚本增强主要通过VuGen(Virtual User Generator)完成,主要包括以下几个主要方面:
参数化:避免缓存,模拟不同用户数据。使用数据文件,设置更新方法(如每次迭代)。
插入检查点:验证结果正确性,判断事务成败。在请求前使用web_reg_find注册检查点。
关联:处理服务器返回的动态数据。用web_reg_save_param捕获动态值,后续请求中使用参数。
插入事务:测量特定操作集的响应时间。使用lr_start_transaction和lr_end_transaction,务必成对出现。
设置思考时间:模拟用户真实操作间隔,影响吞吐量。使用lr_think_time函数,事务内避免包含思考时间。
详细操作指南
1. 参数化
参数化是使用参数来替换脚本中的常量值,模拟不同用户使用不同数据的行为。
操作步骤:在VuGen中选中要替换的常量值,右键创建参数并选择参数类型(如File),然后准备数据文件并设置参数属性(如更新方法)。
示例:登录用户名和密码的参数化。
c
// 参数化后的登录代码
web_submit_data("Login",
"Action=http://example.com/login",
"Method=POST",
ITEMDATA,
"Name=username", "Value={Username}", ENDITEM, // 使用参数
"Name=password", "Value={Password}", ENDITEM, // 使用参数
LAST);
2. 插入检查点
检查点通过验证响应内容中是否存在特定文本来判断请求是否成功。
操作步骤:在HTTP请求之前插入web_reg_find函数,并设置要查找的文本和用于存储匹配次数的参数。
示例:检查登录后页面是否包含"欢迎回来"字样。
c
// 在请求前注册检查点
web_reg_find("Text=欢迎回来",
"SaveCount=LoginSuccess", // 保存匹配次数的参数
LAST);
// 接下来是具体的请求,如web_url等
// 请求后根据检查点结果判断
if (atoi(lr_eval_string("{LoginSuccess}")) > 0) {
lr_output_message("登录成功");
} else {
lr_error_message("登录失败");
}
3. 关联
关联用于处理服务器返回的动态变化的值(如SessionID、Token),将其捕获并在后续请求中使用。
操作步骤:使用关联函数(如web_reg_save_param)在动态数据出现的请求前注册,定义左右边界以精确定位,后续请求中使用捕获到的参数值。
示例:处理异步任务的完成状态检查。
c
int num = 0;
do {
// 在请求前注册关联函数,捕获状态值
web_reg_save_param("status_success",
"LB=<string>success</string><long>",
"RB=</long>",
"NotFound=WARNING",
"Search=Body",
LAST);
// 这是检查任务状态的请求
web_custom_request("xmlhttp",
"URL=http://192.168.25.22/test/xmlhttp?bid=addTaskDAO",
"Method=POST",
... // 其他部分省略
);
num = num + 1;
lr_think_time(1); // 每次检查后等待1秒
} while((strcmp( lr_eval_string("{status_success}"), "1" ) != 0) && (num < 61)); // 循环直到成功或超时
4. 插入事务
事务用于衡量一个或多个操作(即一个业务过程)的响应时间。
操作要点:
事务的开始(lr_start_transaction)和结束(lr_end_transaction)必须成对出现,且名称一致。
事务内部不应包含思考时间(lr_think_time),以确保测量的响应时间准确排除了人为等待。
示例:测量用户登录这个事务的响应时间。
c
lr_start_transaction("登录事务"); // 事务开始
// 登录操作的相关请求,如web_submit_data等
web_submit_data("Login", ...);
lr_end_transaction("登录事务", LR_AUTO); // 事务结束,LR_AUTO表示自动判断结果
5. 设置思考时间
思考时间模拟真实用户在操作之间的停顿,对吞吐量和并发数有显著影响。
设置方法:
在脚本中直接使用lr_think_time(秒数)函数。
在运行时设置(Run-Time Settings) 中灵活配置思考时间的行为:
忽略思考时间(Ignore think time):用于压测系统极限性能。
按录制时间回放(As recorded):严格按录制时的停顿执行。
使用随机百分比(Use random percentage):设置一个范围(如50%到150%),更真实地模拟用户差异。
注意:思考时间应放在事务之外,避免影响事务响应时间的准确性。
保持脚本简洁有效:只录制和增强与测试目标相关的必要请求,移除冗余操作。
善用注释:在脚本的关键部分添加注释,便于后期维护和团队协作。
版本控制:对性能测试脚本使用版本控制工具进行管理。