3.2.5.其它实用函数

  3.2.5.1. lr_get_vuser_ip

  功能:获得VUser的IP地址。

  应用场合:在使用IP欺骗时,为了验证IP欺骗是否成功,可以使用该函数。

  举例:在场景运行过程中,将每一个VUser的IP在VUser运行状态窗口中显示出来。

char *ip;
ip = lr_get_vuser_ip();
if (ip)
{
lr_vuser_status_message("The IP addressis %s", ip);
}

  注意点:为了使IP欺骗成功,使用IP欺骗向导设置好IP后,还要将打开才可。

  3.2.5.2. lr_load_dll

  功能:加载外部DLL。

  应用场合:脚本需要使用外部DLL时,使用该函数加载DLL。

  举例:函数getDateTime(char * time,int seconds,char * resultTime)已封装在timeutil.dll中,getDateTime的功能是根据传入的日期字符串time(如2008-09-24 16:56:24),秒偏移量seconds,计算返回结果日期字符串resultTime,代码如下:

int hours =atoi(lr_eval_string("hours"));
char acceptEndTime[20];
lr_load_dll("../timeutil.dll");
getDateTime(lr_eval_string("{acceptBeginTime}"),3600*hours,acceptEndTime);

  注意点:该函数为LoadRunner提供了调用外部接口的能力。

  3.3.封装,构建可重用脚本

  3.3.1.简单函数封装

  LoadRunner使用C语言作为脚本,因此只要是合法的C代码都可以在LoadRunner中运行。为了提高脚本可读性和脚本生产效率,有必要将性能测试脚本模块化。

  客服3.0工作流系统,查询工单池是一个很常见的操作。我们可以把查询工单池操作封装为一个queryTTPool函数,函数体如下,在脚本中,将所有的查询工单池操作替换为queryTTPool函数调用,提高了脚本的可读性:

//查询工单池
int queryTTPool(char* nodeType){
lr_save_string(nodeType,"nodeType");
lr_save_datetime("%Y-%m-%d 00:00",DATE_NOW-2*ONE_DAY, "acceptBeginTime");
lr_save_datetime("%Y-%m-%d 23:59", DATE_NOW,"acceptEndTime");
lr_start_transaction("WF_查询工单池工单");
web_submit_data("IWFController",
"Action=http://{wf_sysurl}/IWFController",
"Method=POST",
"RecContentType=text/html",
"Referer=http://{wf_sysurl}/iwflow/common/UnitQueryDealForm.jsp?pageNo=1",            "Snapshot=t32.inf",
"Mode=HTML",
ITEMDATA,
"Name=ACTIONID","Value=UniteQueryDealAction", ENDITEM,
"Name=pageNo", "Value=1", ENDITEM,
"Name=sortType", "Value=", ENDITEM,
"Name=sortField", "Value=", ENDITEM,
"Name=reSortFlag", "Value=", ENDITEM,
"Name=acceptPhone", "Value=", ENDITEM,
"Name=serialNo", "Value=", ENDITEM,
"Name=serialFlag", "Value=0", ENDITEM,
"Name=serviceName", "Value=", ENDITEM,
"Name=serviceID", "Value=", ENDITEM,
"Name=acceptBeginTime","Value={acceptBeginTime}", ENDITEM,
"Name= acceptEndTime ", "Value={acceptEndTime}",ENDITEM,
"Name=urgentID", "Value=", ENDITEM,
EXTRARES,
"Url=/iwflow/image/kms-1_23.gif", ENDITEM,
"Url=/iwflow/buttons/obtainProcess-2.gif", ENDITEM,
LAST);
lr_end_transaction("WF_查询工单池工单",LR_AUTO);
}

  3.3.2.DLL封装

  使用DLL有很多好处。高度重用的函数制作成DLL,方便脚本调用。将与IVR交互的消息函数封装成DLL后,便可利用LoadRunner测试IVR性能。制作DLL可以选择VC或者MinGW Developer Studio等工具,至于DLL的制作细节,本文不作介绍,请参见相关指导书。

  4   脚本调试

  LoadRunner的VUser Generator本身的调试功能比较弱,只能设置断点,无法单步跟踪。当脚本出现问题时,可以使用lr_debug_message,lr_output_message,lr_eval_string等函数协助定位。

  脚本错误大部分原因都是向服务器发送的数据不对,因此还可以利用HttpAnalyzer工具进行HTTP协议跟踪,通过比较LoadRunner发送的数据和浏览器发送的数据,便能很快定位出问题根源。