Loadrunner 脚本优化-事务函数简介

脚本优化-事务函数简介

by:授客 QQ1033553122

1.事务的开始和结束名称需要相同

lr_start_transaction(“transaction_name”);

…//事务处理

lr_end_transaction(“transaction_name”,LR_AUTO);

 

2.事务和子事务

VuGen中可以通过事务来完成一组操作的响应时间监控,如果想监控某一个事务中某一步操作的响应时间,就要使用子事务来完成。当然也可以使用事务嵌套

lr_start_sub_transaction(“子事务名”, “父事务名”);

lr_end_sub_transaction(“子事务名”, 子事务状态);

注意:子事务和父事务很像,但是父事务支持的很多函数在子事务中都无法实现,所以应酌情考虑。

 

例:做一个登录的事务,同时把打开登录页面和登录操作都做成一个事务,这样就可以得到三个事务的时间:打开页面和登录操作及整个操作的时间。

Action()

{

    //开始登录事务

    lr_start_transaction("login");

   

    //打开登录界面

    lr_start_sub_transaction("loginpage", "login");  

    web_url("WebTours",

        "URL=http://127.0.0.1:1080/WebTours/",

        "Resource=0",

        "RecContentType=text/html",

        "Referer=",

        "Snapshot=t16.inf",

        "Mode=HTML",

        LAST);

    lr_end_sub_transaction("loginpage", LR_AUTO);

    lr_think_time(4);

 

    //提交登录页面的表单

    lr_start_sub_transaction("submit", "login");

    web_submit_form("login.pl",

        "Snapshot=t17.inf",

        ITEMDATA,

        "Name=username", "Value=jojo", ENDITEM,

        "Name=password", "Value=bean", ENDITEM,

        "Name=login.x", "Value=0", ENDITEM,

        "Name=login.y", "Value=0", ENDITEM,

        LAST);

    lr_end_sub_transaction("submit", LR_AUTO);

 

    lr_end_transaction("login", LR_AUTO);

}

 

运行结果:

Loadrunner <wbr>脚本优化-事务函数简介

 

3.事务状态

在默认情况下使用LR_AUTO来作为事务状态,对于一个事务有以下4个状态可以选择。

1) LR_AUTO

指事务的状态由系统自动根据默认规则来判断,结果为PASS/FAIL/STOP

LR_AUTO也是根据服务器的返回状态信息来决定事务是以LR_PASS状态通过还是以LR_FAIL状态结束,只要服务器返回页面,那么事务就会认为请求成功发出去了,服务器看懂了请求也返回了内容,自然事务就是PASS状态

这样由于事务的自动判断,导致虽然操作失败的,但是得到了一个响应时间,并且这个响应时间又没正确反映出做这件事情的真正时间,最终影响测试结果。添加检测函数有时候可以解决这个问题

 

例:判断是否登录成功(lr自带web站点为例)

Loadrunner <wbr>脚本优化-事务函数简介



Action2()

{

    lr_start_transaction("login");

 

    //打开登录界面

    web_url("WebTours",

        "URL=http://127.0.0.1:1080/WebTours/",

        "Resource=0",

        "RecContentType=text/html",

        "Referer=",

        "Snapshot=t16.inf",

        "Mode=HTML",

        LAST);

 

    lr_think_time(4);

 

    //注意函数的位置

    // jojo1为要查找的文本(实际文本如上图,jojo,仅在登录后才出现,这里为了演示故意找不存在的文本)

web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo1", LAST);

 

    //提交登录页面的表单

    web_submit_form("login.pl",

        "Snapshot=t17.inf",

        ITEMDATA,

        "Name=username", "Value=jojo", ENDITEM,

        "Name=password", "Value=bean", ENDITEM,

        "Name=login.x", "Value=0", ENDITEM,

        "Name=login.y", "Value=0", ENDITEM,

        LAST);

 

    lr_think_time(4);

   

    if(atoi(lr_eval_string("{login_times}")) >= 1) //找到“jojo”,说明登录成功

        lr_end_transaction("login", LR_PASS);

    else  //未找到,说明登录失败

    lr_end_transaction("login", LR_FAIL); 

    return 0;

}

运行结果:

Loadrunner <wbr>脚本优化-事务函数简介
 

2) LR_PASS

指事务是以PASS状态通过的,说明改事务正确地完成了,并且记录下对应的时间,这个时间就是指做这件事情所需要消耗的时间。

 

3) LR_FAIL

LR_FAIL是指事务以FAIL状态结束,该事务是一个失败的事务,没有完成事务中脚本应该达到的效果,得到的时间不是正确操作的时间,这个时间在后期的统计中将被独立统计。

 

4) LR_STOP

LR_STOP将事务以STOP状态停止。

 

说明:

事务的PASSFAIL状态会在场景的对应计数器中记录,包括通过的次数和事务的响应时间,方便后期分析改事务的吞吐量以及响应时间的变化情况

 

4.事务相关的函数

//获得对应事务达到该函数运行位置时持续的时间,返回double类型

lr_get_transaction_duration(“事务名”);

 

//获得对应事务达到该函数运行位置时的wasted时间,返回double类型。

lr_get_transaction_wasted_time(“事务名”);

 

//为一个事务添加wasted时间,无返回值

lr_wasted_time(毫秒)

 

 

//将一个事务暂停,该函数后的操作都不会被记录事务时间

lr_stop_transaction(“事务名”);

 

Action2()

{

    double duration  = 0;

    double wastedtime = 0;

 

    lr_start_transaction("login");

    //打开登录界面

    web_url("WebTours",

        "URL=http://127.0.0.1:1080/WebTours/",

        "Resource=0",

        "RecContentType=text/html",

        "Referer=",

        "Snapshot=t16.inf",

        "Mode=HTML",

        LAST);

 

    lr_think_time(4);

 

    //事务达到该函数运行位置时持续的时间

    duration = lr_get_transaction_duration("login");

    lr_output_message("duration %f", duration);

 

    //事务达到该函数运行位置时浪费的时间

    wastedtime = lr_get_transaction_wasted_time("login");

    lr_output_message("wastedtime %f", wastedtime);

 

    //为事务添加一个浪费时间 5s//该浪费时间无法直接通过lr_get_transaction_wasted_time获得

    lr_wasted_time(5);

    wastedtime = lr_get_transaction_wasted_time("login");

  lr_output_message("wastedtime %f", wastedtime);

 

    //暂停事务

    lr_stop_transaction("login");

 

    //注意函数的位置

    web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo", LAST);

 

    //提交登录页面的表单

    web_submit_form("login.pl",

        "Snapshot=t17.inf",

        ITEMDATA,

        "Name=username", "Value=jojo", ENDITEM,

        "Name=password", "Value=bean", ENDITEM,

        "Name=login.x", "Value=0", ENDITEM,

        "Name=login.y", "Value=0", ENDITEM,

        LAST);

 

    lr_think_time(4);

 

    //事务达到该函数运行位置时浪费的时间

    wastedtime = lr_get_transaction_wasted_time("login");

    lr_output_message("wastedtime %f", wastedtime);

 

    if(atoi(lr_eval_string("{login_times}")) >= 1)

        lr_end_transaction("login", LR_PASS);

    else

        lr_end_transaction("login", LR_FAIL);

  

    return 0;

}

注意:通过代码stop事务后可以重新通过lr_start_transaction函数恢复被暂停的事务

 

5.包含“资源下载”的事务处理

一般情况都可以十分简单地获得请求的响应时间,但是对于下载操作来说就并不是那么方便了,这个时候需要利用一个web_get_int_property()函数来解决。

Action()

{

int i;

lr_start_transaction(“download”);

web_url(“LoadRunner”,”RUL=http://127.0.0.1/loadrunner.iso”,LAST); //下载操作请求

i=web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

if(i>5000) //当下载的文件大小大于5000个字节时认为下载成功,否则失败。

lr_end_transaction(“download”,LR_PASS);

else

lr_end_transaction(“download”,LR_FAIL);

}

一般来说,对于下载操作的性能测试集中在需要多少时间弹出下载对话框,而后面的内容其实属于网络带宽的问题了,另一个方面现在很少使用IE进行直接下载,而采用迅雷一类的p2p下载工具,所以很少考虑具体下载文件操作对网络和服务器读写操作的影响。

原文地址:https://www.cnblogs.com/shouke/p/10158354.html