• loadrunner提高篇


    插入检查点                                  

        靠LR自动生成的脚本是不够的,很难达到业务要求,因此需要对录制完的脚本进行完善,使其能达到业务模拟的要求 ,这样尽可能地使虚拟用户模拟时更接近用户的实际使用。

      在进行压力测试时,经常会有页面间数据传递的操作。如果在测试过程中传递数据的次数逐渐增多,页面就有可能发生传递混乱,或者客户端与服务器端数据传输被中断、传输过程中产生了错误的数据等情况。为了判断数据传递的正确性,LR提供了插入检查点的方法。之前在入门篇的博客中有提到插入检查点的原因,这里就不再细说了,大概提一下,是因为当事务的结束状态为成功时,并不能说明事务真的做成功了,比如用错的账号密码去跑脚本,事务状态仍被置为pass,所以你们懂的了。

      插入检查 点的原理是通过检查点函数将返回值的结果反映在controller的状态面板上和analysis统计结果中。是基于LR中很多的API函数的返回值会改变脚本的运行结果。比如检查点函数web_find,如果它检查到的结果为空,它的返回值就为LR_FAIL,这样整个结果置为FAIL;反之,返回值则为LR_PASS,整个结果置为PASS。

      在工作原理上是在VuGen中插入Text/Image检查点。VuGen中包含Tree view和script view两种视图模式,一般情况下是使用script view模式,但在插入检查点时,一般都是在tree view模式下插入的,这样可以保证插入检查点的位置正确。插入检查点有text check和image check两种,选择的检查点函数也有两个,分别为web_find和web_reg_find,下面先介绍一下这2个函数,最后在关联函数再附上详细代码。

    一、web_find检查点函数

      检查点函数的参数格式:

     web_find("web_find",//检查点步骤名称
            "RightOf=go to",//定义查找字符串右边界
            "LeftOf=page",//定义查找字符串左边界
            "What=home",//定义检查字符串内容
            LAST);

      该函数的作用是在页面中查找相应的内容,有几点要注意的问题:

    1)只能对基于HTML模式录制的脚本进行查找

    2)该函数必须在页面内容显示出来以后才能进行查找,所以该函数必须写在查找内容所在页面的后面

    3)必须启用内容检查选项,在run-tim setting->preferences页面,把enable image and text check复选框选中,否则不执行该查找函数

    4)在VB和java语法中不支持该函数

    5)执行效率低,且不返回查找结果情况。例如要查看有多少个虚拟用户登录成功的情况,这个函数无法做到,必须进一步操作才能实现。

      插入步骤:将视图模式设置为tree view->选择在插入检查点的位置,右键选择insert after->依次选择web checks/text check->在弹出的对话框的specification选项卡中设置检查参数信息(主要有3个属性)->然后切换到general选项卡,在输入该操作的步骤名称(即命名)。

      上面插入步骤中所讲到的3个属性:

    a.search for:设置要检查的字符串,也可以单击ABC按钮对检查的内容进行参数化。

    b.right of:设置右边界值,也可以为空            c.left of:设置左边界值,也可以为空

    二、web_reg_find检查点函数

      该函数是在缓存中查找相应的内容,是一个注册函数。必须写在查找内容的请求之前,一般情况下都会写在以下6个函数之前 :web_custom_request()、web_image()、web_link、web_submit_data()、web_submit_form()、web_url()。

      与web_find函数相比:

    1)web_find只是一个普通函数,而web_reg_find是一个注册函数

    2)web_find函数使用时必须开启内容检查选项,而web_reg_find函数没有此限制

    3)web_find函数录制时只能基于HTML模式录制的脚本中,而web_reg_find函数没有此限制

    4)web_find函数是在返回的页面中进行内容查找,而web_reg_find函数是在缓存中进行查找

    5)web_reg_find函数在执行效率上要比web_find函数高

      插入步骤:将视图模式设置为tree view->选择在插入检查点的位置,右键选择insert after或insert before(如图1所示)->依次选择services/web_reg_find->在弹出的对话框中设置检查参数信息(如图2所示)。

    图1(选择要插入检查点位置)

    图2(检查点属性设置说明)

      如何确定查找范围?答案如图3所示,以登录成功的页面为例,在该选项卡中可以看到录制的过程LR所抓到客户端向服务器发送的请求和服务器向客户端返回的请求,而在response body中就可以看到待查找的用户名(test1),所以检查范围就应设置为body。其实一般在实际测试过程中待查找的内容都会在body中的。

    图3(查找待检查的内容)

      检查点函数的参数格式:

    web_reg_find("Search=Body",//定义查找范围
            "SaveCount=num",//定义查找计数变量名
            "Text=home",//定义要查找的内容
            LAST);
    
        web_submit_data("login.pl",
            "Action=http://127.0.0.1:1080/WebTours/login.pl",
            "Method=POST",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Snapshot=t15.inf",
            "Mode=HTTP",
            ITEMDATA,
            "Name=userSession", "Value=120746.88035642zcVAQVHpzfiDDDDDDHczfpfAfQf", ENDITEM,
            "Name=username", "Value=test1", ENDITEM,
            "Name=password", "Value=test", ENDITEM,
            "Name=JSFormSubmit", "Value=off", ENDITEM,
            "Name=login.x", "Value=52", ENDITEM,
            "Name=login.y", "Value=11", ENDITEM,
            LAST);
    
        if(atoi(lr_eval_string("{num}"))>=1{
            lr_end_transaction("login",LR_PASS);//login是录制脚本时插入的事务,这里自然是结束事务。当事务通过时,结束状态置为LR_PASS
        }
        else{
            lr_end_transaction("login",LR_FAIL);//否则,结束状态置为LR_FAIL
        }
    web_reg_find

    三、web_image_check检查点函数

      插入步骤:将视图模式设置为tree view->选择在插入检查点的位置,右键选择insert after或insert before->依次选择web checks/image check->在弹出的对话框的specification选项卡中设置检查参数信息(如图4所示)->然后切换到general选项卡,在输入该操作的步骤名称(即命名)。

      如果web窗体中包含有JS脚本,那么在tree view中显示可能会有问题,这时需要进行设置(tool->general options->correlation选项卡->勾选enable scripting and java apples on snapshots viewer)

    图4(image检查点属性设置)

    关联函数                                      

    一、关联的原理

    1、什么情况下需要关联?

    如果录制脚本过程中,服务器会返回一个动态的、变化的值给客户端时,那么就必须对脚本进行关联,否则事务不可能正常地完成。

    2、LR使用关联函数进行函数时是如何获得这些动态数据的?即LR的关联原理是什么?

    对于这些动态的值,如果想直接获得是不可能的,因为它是变化的,所以不可能直接获得每次回放时现成的值。这样就必须使用其他的方法来获得这串变化的值,LR关联则是通过左右边界值来查找服务器返回给客户端的值,所以关联最难的是如何查找待关联值的左右边界。

    二、3种关联技术

    注:不知道什么原因用HTML模式录制后在tree view视图下没有显示想要插入检查点的的url(比如登录),尝试过直接在代码插入检查点函数web_find,运行也不成功,所以下面的代码展示用的都是URL录制模式录的脚本。

    1、录制中关联

      VuGen内自动关联引擎,可以自动找到需要关联的值,并且自动关联函数建立关联。

    1)建立规则。如录制前已经知道关联规则,那么可以先建立规则,再进行录制,这样在录制过程中会自动关联。关联规则最重要的是指定两个边界,即被关联量的左边界和右边界。

    a.内建关联规则。在录制前可以在 tools->recording options->http properties->correlation 启动需要的规则。

    b.用户自定义关联规则。如内建规则不能满足要求,可自定义,如图5所示:

    图5(新建关联规则)

    c.图6所示是规则测试功能,即对已定义好的规则进行测试,测试规则的匹配是否正确:

    图6(规则测试对话框)

    2)规则使用。录制前必须启用自动关联,如图5所示,勾选enable correlation during recording后,在录制过程中,当VuGen检查到符合关联规则的数据时,会依照设定建立关联,即自动产生关联函数web_reg_param,完整代码示例如下:

    Action()
    {
        //自动生成的存储参数长度的函数
        web_set_max_html_param_len("1024");
    
        web_url("WebTours", 
            "URL=http://127.0.0.1:1080/WebTours", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=", 
            "Snapshot=t2.inf", 
            "Mode=HTTP", 
            LAST);
    
        web_url("header.html", 
            "URL=http://127.0.0.1:1080/WebTours/header.html", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/", 
            "Snapshot=t3.inf", 
            "Mode=HTTP", 
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("hp_logo.png", 
            "URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png", 
            "Resource=1", 
            "RecContentType=image/png", 
            "Referer=http://127.0.0.1:1080/WebTours/header.html", 
            "Snapshot=t4.inf", 
            LAST);
    
        web_url("webtours.png", 
            "URL=http://127.0.0.1:1080/WebTours/images/webtours.png", 
            "Resource=1", 
            "RecContentType=image/png", 
            "Referer=http://127.0.0.1:1080/WebTours/header.html", 
            "Snapshot=t5.inf", 
            LAST);
    
        web_concurrent_end(NULL);
    
        web_url("welcome.pl", 
            "URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/", 
            "Snapshot=t9.inf", 
            "Mode=HTTP", 
            LAST);
    
        web_url("home.html", 
            "URL=http://127.0.0.1:1080/WebTours/home.html", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
            "Snapshot=t12.inf", 
            "Mode=HTTP", 
            LAST);
    
        //下面的三行注释与web_reg_save_param关联函数是录制中自动生成的
    
        /* Registering parameter(s) from source task id 53
        // {BL2} = "120705.245200486zcAiHHzpAfDHcfcpzfzD"
        // */
    
        web_reg_save_param("BL2", //BL是在建立关联规则时定义的变量参数前缀,BL2则是自动创建的变量参数
            "LB/IC=userSession value=", //LB是左边界值,IC是否匹配大小写
            "RB/IC=>", //RB是右边界值
            "Ord=1", //所匹配的内容出现的位置,默认为1(指查找待匹配的内容第一次出现的情况)
            "Search=Body",//查找范围 
            "RelFrameId=1", //帧ID参数,可以通过帧ID号指定访问不同的帧
            LAST);
    
        web_url("nav.pl", 
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
            "Snapshot=t14.inf", 
            "Mode=HTTP", 
            LAST);
    
        web_url("mer_login.gif", 
            "URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif", 
            "Resource=1", 
            "RecContentType=image/gif", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
            "Snapshot=t15.inf", 
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("8afc2fe48db9060fe1bdda2089e1d950.png", 
            "URL=http://act.cmcmcdn.com/upload/201507/8afc2fe48db9060fe1bdda2089e1d950.png", 
            "Resource=1", 
            "RecContentType=image/png", 
            "Referer=http://127.0.0.1:1080/WebTours/", 
            "Snapshot=t16.inf", 
            LAST);
    
        web_url("3b491068507d8f85ea7b35d756da7215.png", 
            "URL=http://act.cmcmcdn.com/upload/201507/3b491068507d8f85ea7b35d756da7215.png", 
            "Resource=1", 
            "RecContentType=image/png", 
            "Referer=http://127.0.0.1:1080/WebTours/", 
            "Snapshot=t17.inf", 
            LAST);
    
        web_concurrent_end(NULL);
    
        lr_start_transaction("login");
    
        lr_think_time(13);
    
        web_submit_data("login.pl", 
            "Action=http://127.0.0.1:1080/WebTours/login.pl", 
            "Method=POST", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
            "Snapshot=t18.inf", 
            "Mode=HTTP", 
            ITEMDATA, 
            "Name=userSession", "Value={BL2}", ENDITEM, //因关联函数创建了变量参数BL2,所以这里value的值自动就用变量参数BL2代替了
            "Name=username", "Value=test1", ENDITEM, 
            "Name=password", "Value=test1", ENDITEM,//password的值如果是正确的,返回 "we find the string!";如果是错误的,则返回"sorry,don't find the string!"
            "Name=JSFormSubmit", "Value=off", ENDITEM, 
            "Name=login.x", "Value=0", ENDITEM, 
            "Name=login.y", "Value=0", ENDITEM, 
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("nav.pl_2", 
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/login.pl", 
            "Snapshot=t19.inf", 
            "Mode=HTTP", 
            LAST);
    
        //插入检查点
        web_reg_find("Search=Body",//检查点插入的范围
            "SaveCount=username",//用变量username统计查找内容test1
            "Text/DIG=test1",//查找的内容
            LAST);
    
        web_url("login.pl_2", 
            "URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true", 
            "Resource=0", 
            "RecContentType=text/html", 
            "Referer=http://127.0.0.1:1080/WebTours/login.pl", 
            "Snapshot=t20.inf", 
            "Mode=HTTP", 
            LAST);
    
        web_concurrent_end(NULL);
    
        web_concurrent_start(NULL);
    
        web_url("flights.gif", 
            "URL=http://127.0.0.1:1080/WebTours/images/flights.gif", 
            "Resource=1", 
            "RecContentType=image/gif", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
            "Snapshot=t21.inf", 
            LAST);
    
        web_url("itinerary.gif", 
            "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif", 
            "Resource=1", 
            "RecContentType=image/gif", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
            "Snapshot=t22.inf", 
            LAST);
    
        web_url("in_home.gif", 
            "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif", 
            "Resource=1", 
            "RecContentType=image/gif", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
            "Snapshot=t23.inf", 
            LAST);
    
        web_url("signoff.gif", 
            "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif", 
            "Resource=1", 
            "RecContentType=image/gif", 
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
            "Snapshot=t24.inf", 
            LAST);
    
        web_concurrent_end(NULL);
    
        //判断事务结束状态
    
        if (atoi(lr_eval_string("{username}"))>0){//判断变量username(即查找内容的次数)是否大于或等于1
            lr_output_message("we find the string!");//如果大于0,则返回we find the string!
        }
    
        else{
            lr_output_message("sorry,don't find the string!");//否则,返回sorry,don't find the string!
        }
    
        lr_end_transaction("login",LR_AUTO);//下面这个事务结束状态是LR_AUTO
    
        return 0;
    }
    url录制中关联

    2、录制后关联

      当录制前内建关联规则和新建规则都不能满足需要时,或者不知道哪个地方需要关联时,只能采取录制后进行关联。录制后关联与内建关联是有区别的,录制后关联是在执行脚本后才会建立,也就是说,当录制完脚本后,脚本至少要执行一次,录制后关联才会产生效果。录制后会尝试找到录制与执行时服务器响应的差异部分,找到需要关联的数据,并建立关联。

      脚本执行后,vuser->scan script for correlations,扫描后,选择需要关联的数据,单击correlate,这时被关联的数据前面会多出一个绿色的勾,即表示关联创建完成了,如图7所示:

    图7(关联结果) 

      关联完成后也是会自动生成web_reg_param关联函数,完整代码示例如下(期间遇到报错error-35061,在代码中有说明解决方法):

    Action()
    {
    
        web_url("WebTours",
            "URL=http://127.0.0.1:1080/WebTours",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=",
            "Snapshot=t1.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("header.html",
            "URL=http://127.0.0.1:1080/WebTours/header.html",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t2.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("webtours.png",
            "URL=http://127.0.0.1:1080/WebTours/images/webtours.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/header.html",
            "Snapshot=t4.inf",
            LAST);
    
        web_url("hp_logo.png",
            "URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/header.html",
            "Snapshot=t5.inf",
            LAST);
    
        web_url("welcome.pl",
            "URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t6.inf",
            "Mode=HTTP",
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("home.html",
            "URL=http://127.0.0.1:1080/WebTours/home.html",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Snapshot=t7.inf",
            "Mode=HTTP",
            LAST);
    
        //下面的一行注释和web_reg_save_param_ex关联函数是录制后关联所自动创建的
    
    //Correlation comment - Do not change!Original value='120705.370676387zcAiHicpfAtVzzzHDHcfcpzQfAcf' Name ='CorrelationParameter_1'
    
        web_reg_save_param_ex(//这个关联函数与web_reg_save_param函数实质差别不大
            "ParamName=CorrelationParameter_1",//变量名称,表示将缓存区中查找到的内容保存到这个变量中
            "LB=userSession value=",//左边界值
            "RB=>
    <table border",//右边界值
            SEARCH_FILTERS,//指定缓冲区中需要查找的字符串
            "Scope=Body",
            //"RequestUrl=*/nav.pl*",     /*因为报错error-35061,所以要注释掉自动生成的关联函数中的这一行*/
            LAST);//结束参数标志
    
        web_url("nav.pl",
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Snapshot=t8.inf",
            "Mode=HTTP",
            LAST);
    
        web_concurrent_end(NULL);
    
        web_url("mer_login.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Snapshot=t9.inf",
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("8afc2fe48db9060fe1bdda2089e1d950.png",
            "URL=http://act.cmcmcdn.com/upload/201507/8afc2fe48db9060fe1bdda2089e1d950.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t11.inf",
            LAST);
    
        web_url("3b491068507d8f85ea7b35d756da7215.png",
            "URL=http://act.cmcmcdn.com/upload/201507/3b491068507d8f85ea7b35d756da7215.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t12.inf",
            LAST);
    
        web_concurrent_end(NULL);
    
        lr_start_transaction("登录");
    
        lr_think_time(6);
    
        web_submit_data("login.pl",
            "Action=http://127.0.0.1:1080/WebTours/login.pl",
            "Method=POST",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Snapshot=t15.inf",
            "Mode=HTTP",
            ITEMDATA,
            //用CorrelationParameter_1变量代替常量,即value的值要改为变量值
            "Name=userSession", "Value={CorrelationParameter_1}", ENDITEM,
            "Name=username", "Value=test1", ENDITEM,
            "Name=password", "Value=test1", ENDITEM,//password的值如果是正确的,返回 "PASS";如果是错误的,则返回"FAIL"
            "Name=JSFormSubmit", "Value=off", ENDITEM,
            "Name=login.x", "Value=0", ENDITEM,
            "Name=login.y", "Value=0", ENDITEM,
            LAST);
    
        web_concurrent_start(NULL);
    
    //在该位置插入检查点
        web_reg_find("Text=test1",
            "SaveCount=num",//用变量num统计查找内容test1
            "Search=Body",
            LAST);
    
        web_url("login.pl_2",
            "URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/login.pl",
            "Snapshot=t16.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("nav.pl_2",
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/login.pl",
            "Snapshot=t17.inf",
            "Mode=HTTP",
            LAST);
    
        web_concurrent_end(NULL);
    
        web_concurrent_start(NULL);
    
        web_url("flights.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/flights.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t18.inf",
            LAST);
    
        web_url("itinerary.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t19.inf",
            LAST);
    
        web_url("signoff.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t20.inf",
            LAST);
    
        web_url("in_home.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t21.inf",
            LAST);
    
        web_concurrent_end(NULL);
    
    //判断事务结束状态
        if(atoi(lr_eval_string("{num}"))>=1){//判断变量num(即查找内容的次数)是否大于或等于1
            lr_end_transaction("登录", LR_PASS);//如果是,则说明找到了,即登录成功,返回LR_PASS
        }
        else{
            lr_end_transaction("登录", LR_FAIL);//否则,返回LR_FAIL
        }
    
    return 0;
    }
    url录制后关联

    3、手动关联

      手动关联与前面所提到的两种自动关联不同,但原理是一样的,需要先找到需要关联的量,然后使用LR提供的关联函数进行关联。这方法是用于上面两种方法都不能解决的情况,步骤如下:

    1)录制两份脚本,保证事务流程和使用的数据相同;

    2)使用WinDiff工具比较两份脚本,找到需要关联的数据。(WinDiff是LR自带的文件比较工具)tools->compare with vuser,弹出的对话框中选择要和当前脚本进行比较的脚本,WinDiff会显示有差异的地方,每个差异的地方都可能是需要关联的地方,但是lr_think_time的差异部分是不需要关联的;

    3)找到左边界和右边界字符串;

    4)使用web_reg_save_param函数手动建立关联。首先找到关联函数插入的位置,选择vuser->run-time settings->general->log->extended log,将下面所有选项都选中。在replay log中找到windiff中比较不同的字符串,双击后,那行代码前面就是为要插入关联函数的位置,如图8所示:

    图8(关联函数插入位置)

    5)将脚本中的该关联数据以参数取代。当使用web_reg_save_param建立参数后,接下来就是用参数去取代脚本中的常量,如图9所示:

      完整代码示例如下(期间遇到报错error-27216及执行失败,代码中有说明解决方法):

    Action()
    {
        web_url("WebTours",
            "URL=http://127.0.0.1:1080/WebTours",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=",
            "Snapshot=t2.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("header.html",
            "URL=http://127.0.0.1:1080/WebTours/header.html",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t3.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("hp_logo.png",
            "URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/header.html",
            "Snapshot=t5.inf",
            LAST);
    
        web_url("welcome.pl",
            "URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t6.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("webtours.png",
            "URL=http://127.0.0.1:1080/WebTours/images/webtours.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/header.html",
            "Snapshot=t7.inf",
            LAST);
    
        web_url("home.html",
            "URL=http://127.0.0.1:1080/WebTours/home.html",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Snapshot=t11.inf",
            "Mode=HTTP",
            LAST);
    
        //下面是手动写的关联函数,但是运行报错(error-27216)
        //web_reg_save_param("BL",
        //    "LB=userSession value=",
        //    "RB=>",
        //    "Search=Body",
        //    LAST);
    
        //所以尝试在树模型下插入关联函数,结果运行成功了,下面是用插入方式插入的关联函数
            web_reg_save_param("BL",//创建变量BL
            "LB=userSession value=",
            "RB=>",
            "Search=Body",
            LAST);
    
        web_url("nav.pl",
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
            "Snapshot=t12.inf",
            "Mode=HTTP",
            LAST);
    
        web_url("mer_login.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Snapshot=t13.inf",
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("8afc2fe48db9060fe1bdda2089e1d950.png",
            "URL=http://act.cmcmcdn.com/upload/201507/8afc2fe48db9060fe1bdda2089e1d950.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t18.inf",
            LAST);
    
        web_url("3b491068507d8f85ea7b35d756da7215.png",
            "URL=http://act.cmcmcdn.com/upload/201507/3b491068507d8f85ea7b35d756da7215.png",
            "Resource=1",
            "RecContentType=image/png",
            "Referer=http://127.0.0.1:1080/WebTours/",
            "Snapshot=t19.inf",
            LAST);
    
        web_concurrent_end(NULL);
    
        lr_start_transaction("登录");
    
        lr_think_time(15);
    
        web_submit_data("login.pl",
            "Action=http://127.0.0.1:1080/WebTours/login.pl",
            "Method=POST",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
            "Snapshot=t20.inf",
            "Mode=HTTP",
            ITEMDATA,
            //用BL变量代替常量,即value的值要改为变量值
            //如果直接输入session的参数变量值时执行失败的话,可以尝试右键replace with a parameter(我就有遇到这个情况)
            "Name=userSession", "Value={BL}", ENDITEM,
            "Name=username", "Value=test1", ENDITEM,
            "Name=password", "Value=test1", ENDITEM,//password的值如果是正确的,返回 "PASS";如果是错误的,则返回"FAIL"
            "Name=JSFormSubmit", "Value=off", ENDITEM,
            "Name=login.x", "Value=48", ENDITEM,
            "Name=login.y", "Value=13", ENDITEM,
            LAST);
    
        web_concurrent_start(NULL);
    
        web_url("nav.pl_2",
            "URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/login.pl",
            "Snapshot=t21.inf",
            "Mode=HTTP",
            LAST);
    
        //在树模型下插入的检查点
        web_reg_find("Text=test1",
            "SaveCount=num",//用变量num统计查找内容test1
            "Search=Body",
            LAST);
    
        web_url("login.pl_2",
            "URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://127.0.0.1:1080/WebTours/login.pl",
            "Snapshot=t22.inf",
            "Mode=HTTP",
            LAST);
    
        web_concurrent_end(NULL);
    
        web_concurrent_start(NULL);
    
        web_url("flights.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/flights.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t23.inf",
            LAST);
    
        web_url("itinerary.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t24.inf",
            LAST);
    
        web_url("signoff.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t25.inf",
            LAST);
    
        web_url("in_home.gif",
            "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif",
            "Resource=1",
            "RecContentType=image/gif",
            "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
            "Snapshot=t26.inf",
            LAST);
    
        web_concurrent_end(NULL);
    
        //判断事务结束状态
        if(atoi(lr_eval_string("{num}"))>=1){//判断变量Num(即查找内容的次数)是否大于或等于1
            lr_end_transaction("登录", LR_PASS);//如果是,则返回LR_PASS
        }
        else{
            lr_end_transaction("登录", LR_FAIL);//否则,返回LR_FAIL
        }
        
    return 0;
    }
    
    url手动关联
    url手动关联

    备注:文字讲解来自《深入性能测试--LoadRunner性能测试、流程、监控、调优全程实战剖析》(黄文高、何月顺编著)一书,我是新手,参照此教程做了下实践,顺便将学到的东西写下来。

  • 相关阅读:
    Delphi XE5 for Android (六)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    如何设计并使用FireMonkeyStyle
    Indy发送邮件被kbas退掉
    Indy10收发Hotmail邮件
    一个简单的打印监控示例
    DataSnap侦听端口动态设置问题
    面试题总结一
    spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
  • 原文地址:https://www.cnblogs.com/Chilam007/p/6581665.html
Copyright © 2020-2023  润新知