一、脚本问题
问题1.1、无法弹出IE浏览器或者录制中出现0事件
原因:一般是由于电脑安装多个浏览器导致
解决:修改IE选项设置,去掉勾选“启用第三方浏览器扩展”
问题1.2、Windows 2003无法录制IE6/7
原因:可能是Windows server 2003默认对IE加载DEP(数据执行保护)特性,而Vugen.exe刚好跟DEP冲突所导致
解决:修改我的电脑→属性→高级→性能(设置)→数据执行保护→添加→将Loadrunner安装目录bin下的Vugen.exe添加进去→确定。重启Loadrunner
问题1.3、录制正常但是脚本中无数据显示
原因:有可能是协议或者是捕获数据的方式导致
解决:在录制中打开Options(选项)→Port Mapping(端口映射)→选择捕获数据的方式或者选择识别协议内容
问题1.4、录制时出现Visual Studio调试器
原因:Windows对数据的保护设置
解决:打开“我的电脑”→属性→高级→性能-设置→数据执行保护→勾选“除所选之外…”→“添加”选择“iexplore.exe”即可
问题1.5、录制时修改参数保存的方式
原因:.net协议录制时,参数默认保存为(Binary)格式
解决:录制时进入→Options→http://Microsoft.net→Recording→Serialzation中将Serialzation format的Value值更改为XML格式
问题1.6、脚本回放正常,未通过
原因:可能是缺少包头。默认情况下是不录制HTTP Header(请求包头),如果有些数据存放在Header中,导致脚本无法正常通过
解决:
利用抓包工具(如HttpWatch),进行抓包分析,找到报头,在请求前添加该报头。如:web_add_auto_header(“x-requested-with”, “XMLHttpRequest”)
查找缺少的报头名,添加包头。在录制中打开Options(选项)→Advanced(高级)→Headers(标题)→Recourd headers in list→添加包头
问题1.7、脚本回放无法正常通过
原因:录制时请求方式
解决:在录制中打开Options(选项)→Recording(高级)→URL Advanced→选择Use web_custom_request only方式录制
问题1.8、脚本出现26601错误
原因:缺少压缩包头
解决:web_add_auto_header(“Accept_Encoding”,“gzip,deflate”);
二、其他问题
问题2.1、Java执行场景时并发数上不去
原因:Spring框架重定向问题
解决:将修改为scope=”prototype”
问题2.2、在场景设置中监控不到服务器
原因:服务没有开启
解决:打开服务→开启相关服务(首先检查Remote Registry服务,然后在开启computer browser,如果computer browser无法开启,检查server、workstation服务)
问题2.3、在生成结果中采集的数据不一致
原因:由于采样的时间
在摘要中,时间是根据整个场景执行的过程进行采样
在平均事务响应时间主要是按照Loadrunner分析出来的采样频率来获取
解决:可通过“set granularity”来修改平均事务响应时间的采样频率,设为场景执行时间,结果会一致。
问题2.4、SilverLight中脚本回放错误
原因:缺少SOAPAtion包头
解决:在录制中打开Options(选项)→Advanced(高级)→Headers(标题)→Recourd headers in list→添加包头
问题2.5、http://microsoft.net协议中无法查看数据文件
原因:默认次方式离职脚本中生成的数据文件类型为Binary,需修改为XML格式
解决:在录制中打开Options(选项)→http://Microsoft.net→Recording→serializatioformat改为XML即可
三、脚本优化
3.1、检查点
函数:web_reg_find、web_image_check和web_find
web_reg_find(文本检查点)函数的使用方法和技巧
web_reg_find(
“Search=查找的范围”,
“Save Count=记录缓冲出现的次数”,
“Test=查找的参数”,
LAST);
If (atoi(lr_eval_string(“{N_count}”)) > 0 )
用法:在缓冲中查找,所以要放在查找内容之前
web_image_check(图片检查点)函数的使用方法和技巧
web_image_check(
“函数标题”,
“ALT\SRC=图片的全路径”,
LAST);
用法:在HTML中使用,要放在查找内容之前,必须勾选run-time→Perferences→Enable Image and Test Check
3.2、关联
函数:web_reg_save_param、web_reg_save_param_ex
web_reg_save_param(_ex)函数的使用方法和技巧
web_reg_save_param(_ex)(
“关联函数名”,
“LB=左边界”,
“RB=右边界”,
“Ord(Ordinal)= 出现的次数”,
“Search = 查找的范围”,
“SaveOffset = 偏移的量”,
“SaveLen = 保存的长度”,
“LAST”);
技巧:在关联参数中随机选值;
方法一:定义变量,使用LR_paramarr_random函数取值,如下:
Char *param;
Param=lr_paramarr_random(“关联函数名”);
Lr_save_string(“Param”,“新参数名”);
方法二:定义随机参数,在Ord(Ordinal)中利用参数随机参数取值,如下:
在参数列表中定义参数random_num
将Ord(Ordinal)={random_num}
3.3、参数
Parameter List界面介绍
File format中Column选项如下:
Comma:以逗号分隔
Tab:以Tab分隔
Space:以空格分隔
Select next row中选项如下:
Sequential:顺序取值
Random:随即取值
Unique:唯一取值
Update value on中选项如下:
Each iteration:每次迭代更新
Each occurrence:每次取值更新
Once:只更新一次
When out of values中选项如下:
Abort Vuser:参数超出后退出
Continue in a cyclic value:参数超出后循环
Continue with last value:参数超出后使用最后一个值
技巧1:如果所需参数中存在空格(逗号),需要在File format中选择以Comma(Tab)分隔,否则参数不可用。或者在参数中的将逗号用“”
技巧2:在Date/Time中可以设置自增自减。在offset标签中勾选Offset parameter
自增:勾选Working days onl
自减:勾选prior to current
技巧3:如果参数过多时,可以将多个参数放到一个参数表中。如下图:
3.4、思考时间
lr_think_time(3);
技巧:如果模拟用户的操作可适当添加思考时间。
如果想获取TPS的值,则不能加思考时间和集合点。
3.5、小技巧
3.5.1、 LR中浮点数相加
double atof( const char *string);//申明
float UpPrice1;
float UpPrice2;
float i=0.1;
char * UpPrice3=(char*)calloc(100,sizeof(char));
lr_save_string( lr_eval_string("{CorrelationParameter_2}"),
“UpPrice1” );
//lr_error_message(“打印结果%s”, lr_eval_string("{UpPrice1}"));
UpPrice2=atof(lr_eval_string ("{UpPrice1}"))+i;
atof( lr_eval_string("{UpPrice1}") );
sprintf( UpPrice3,"%.2f",UpPrice2 );
lr_save_string( UpPrice3,“UpPrice” );
lr_error_message(“打印结果:%s”, lr_eval_string("{UpPrice}"));
使用参数取值用{UpPrice}
3.5.2、 URL编码与解码
URL=http://www.baidu.com/s?wd=%E6%B5%B7%E6%B7"中要对%E6%B5%B7%E6%B7进行参数化,但是由“值”进行URL编码过来的,无法直接用中文参数化,由于LR提供了方法,现在要将中文进行URL编码。
解决方法如下:
URL编码:
lr_convert_string_encoding(“值”,LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 , “UnicodeString”);
lr_save_string (lr_eval_string("{UnicodeString}"),“nURLencoder” );
web_convert_param(“nURLencoder”,
“SourceEncoding=PLAIN”,
“TargetEncoding=URL”,
LAST );
lr_output_message(“Url编码 = %s”,lr_eval_string("{nURLencoder}"));
URL解码:
lr_save_string (lr_eval_string("{nURLencoder}"),“URLencoder” );
web_convert_param(“URLencoder”,
“SourceEncoding=URL”,
“TargetEncoding=PLAIN”,
LAST );
lr_convert_string_encoding(lr_eval_string("{URLencoder}"),LR_ENC_UTF8 ,LR_ENC_SYSTEM_LOCALE, “UnicodeString1”);
lr_output_message(“Url解码 = %s”,lr_eval_string("{UnicodeString1}"));
3.5.3、 Base64加密与解密
base64加密:参数化GUID={97FD2AD5-1C5E-43F6-8314-FC980CE54FBC}
void GetBase64Encode(const char* in_str,char* out_str)//加密方法
{static unsigned char base64[] =
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
int curr_out_len = 0;
int i = 0;
int in_len = strlen(in_str);
unsigned char a, b, c;
out_str[0] = ‘\0’;
if (in_len > 0)
{while (i < in_len)
{a = in_str[i];
b = (i + 1 >= in_len) ? 0 : in_str[i + 1];
c = (i + 2 >= in_len) ? 0 : in_str[i