发布新日志

  • web_custom_request函数实例

    2013-12-19 14:22:48

    背景:

    工时系统项目经理审核工时,使用现网数据测试时,每个项目经理审核的记录条数不确定,脚本中web_submit_data函数实现全部提交需要列出所有的记录数,使用参数化只能实现多个项目经理各自审核相同条数的记录,但使用web_custom_request就用代码拼一个POST请求的Body值实现多个项目经理各自审核不同条数的记录。使用这种方法处理脚本能真实反映服务期的处理能力。

    语法:

    web_custom_request (const char *RequestName, <List of Attributes>,

      [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值
    返回LR_PASS0)代表成功,LR_FAIL1)代表失败。

    参数:
    RequestName
    :步骤的名称,VuGen中树形视图中显示的名称。

    List of Attribute:支持的属性有以下几种:

    1. URL:页面地址。

    2. Method :页面的提交方式,POSTGET

    3. TargetFrame:包含当前链接或资源的frame的名称。参见List of Attributes的同名参数。

    4. EncType:编码类型。

    5. RecContentType:响应头的内容类型。参见List of Attributes的同名参数。

    6. Referer:参见List of Attributes的同名参数。

    7. Body:请求体。参见List of Attributes的同名参数。

    8. RAW BODY:参见List of Attributes的同名参数。

    9. BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinaryBodyUnicode RAW_BODY_STARTBinary=1

    10. ResourceResourceByteLimitSnapshotMode:参见List of Attributes的同名参数。

    11. ExtraResBaseDir:参见List of Attributes的同名参数。

    12. UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。

    开工~~

    web_custom_request在录制中不一定可以录出来,我们可以通过通过树型模式查看web_submit_data向服务器发送的实际数据,如图1

    web_submit_data脚本如下:

             web_submit_data("ApproveDetailManager.jsp_2",

    "Action=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp",

                       "Method=POST",

                       "TargetFrame=",

                       "RecContentType=text/html",

             "Referer=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03",

                       "Snapshot=t7.inf",

                       "Mode=HTML",

                       ITEMDATA,

                       "Name=chk0", "Value=on", ENDITEM,

                       "Name=status_code0", "Value=2", ENDITEM,

                       "Name=row_num0", "Value=0", ENDITEM,

                       "Name=employeeId0", "Value=10236", ENDITEM,

                       "Name=chk1", "Value=on", ENDITEM,

                       "Name=status_code1", "Value=2", ENDITEM,

                       "Name=row_num1", "Value=0", ENDITEM,

                       "Name=employeeId1", "Value=16610", ENDITEM, 

                       "Name=row_count", "Value=2", ENDITEM,

                       "Name=operateFlag", "Value=approve", ENDITEM,

                       "Name=approve_person_id", "Value=0", ENDITEM,

                       "Name=approve_last_name", "Value=null", ENDITEM,

                       LAST);

     

    ITEMDATA的值转换成Body值为

    Body=chk0=on&status_code0=2&row_num0=0&employeeId0=10236&chk1=on&status_code1=2&row_num1=0&employeeId1=16610&row_count=2&operateFlag=approve&approve_person_id=0&approve_last_name=null

    使用web_custom_request函数,请求变为

       web_custom_request("ApproveDetailManager.jsp",

                       "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03",

                       "Method=POST",

                       "RecContentType=text/html",

                       "Snapshot=t6.inf", “Body=chk0=on&status_code0=2&row_num0=0&employeeId0=10236&chk1=on&status_code1=2&row_num1=0&employeeId1=16610&row_count=2&operateFlag=approve&approve_person_id=0&approve_last_name=null

    ”,

        LAST);

    下面的任务则是对body部分的内容进行处理,row_numemployeeId的值需要进行参数化,

    chk0=on&status_code0=2&row_num0=0&employeeId0=10236这一条记录内部需要进行参数拼接,多条记录的获取需要进行循环。

    1、参数化:

    由于row_numemployeeId的值也不太好确定,此处采用注册函数参数化,使用web_reg_save_param获取。

        web_reg_save_param("person",

                       "LB/BIN=<input personId=\"",

                       "RB/BIN=\" projectId",

            "Ord=ALL",

                       "Search=Body",

                       LAST);

     

    2、循环:

    web_reg_save_param获取参数时,将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,关联值返回两条记录,则LR分别将值保存到person_1, person_2中,同时,LR还将自动创建一个person_count变量来保存总的记录数,在这里person_count值等于2。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了

    2.1 声明变量,变量大小≈单个大小x300(目前最多不超过300条记录)

    int count;

    int i;

    char form[20480];

    char personvalue[2500];

    char personeva[200];

    char rowvalue[3500];

    char roweva[2000];

    char tp[2500];

    char tp1[5000];

    char tp2[3500];

    char tp3[1000];

    char tp4[4500];

    char tp5[2500];

    char tp6[20];

    2.2 将返回的记录数保存到count变量里:

    count=atoi(lr_eval_string("{person_count}"));

    2.3 使用for循环

    for(i=1;i<=count;i++)

     {

     sprintf(tp,"chk%d=on",i-1);//把格式化的数据写入tp  chk0=on

     

     sprintf(tp1,"&status_code%d=2",i-1);//&status_code0=2

     

     sprintf(tp2,"&row_num%d",i-1);//&row_num0

     

     sprintf(rowvalue,"{row_%d}",i);

     strcpy(roweva,lr_eval_string(rowvalue));// 取出row的值,并把值传给roweva

     sprintf(tp3,"=%s",roweva);//=0

     

     sprintf(tp4,"&employeeId%d",i-1);//&employeeId0

     

     sprintf(personvalue,"{person_%d}",i);

     strcpy(personeva,lr_eval_string(personvalue));// 取出person的值,并把值传给personeva

     sprintf(tp5,"=%s&",personeva);//= 10236&

    }

    2.4 拼接

    strcpy(form,"Body=");

    sprintf(tp6,"row_count=%s",lr_eval_string("{person_count}"));//row_count=1

    strcat(form,tp6);//Body=chk0=on&status_code0=2&row_num0=1&employeeId0=96818&row_count=1

     strcat(form,"&operateFlag=approve&approve_person_id=0&approve_last_name=null");

    2.4 打印

       lr_output_message("form. 的值为%s",form);

    2.5 web_custom_request函数中的body值用变量代替

       web_custom_request("ApproveDetailManager.jsp",

             "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03",

                       "Method=POST",

                       "RecContentType=text/html",

                       "Snapshot=t6.inf",

            form,

        LAST);

    2.6 打完收工~完整脚本如下,粗体为脚本中修改的部分:

    #include "web_api.h"

    int count;

    int i;

    char form[10240];

    char personvalue[128];

    char personeva[128];

    char rowvalue[128];

    char roweva[128];

    char tp[1024];

    char tp1[1024];

    char tp2[1024];

    char tp3[1024];

    char tp4[1024];

    char tp5[1024];

    char tp6[1024];

     

    Action()

    {

             web_submit_data("loginConsole.jsp",

                       "Action=http://192.168.18.31/TimeSheet/loginConsole.jsp?fg=1",

                       "Method=POST",

                       "TargetFrame=",

                       "RecContentType=text/html",

                       "Referer=http://192.168.18.31/TimeSheet/login.jsp",

                       "Snapshot=t2.inf",

                       "Mode=HTML",

                       ITEMDATA,

                       "Name=userCode", "Value={usercode}", ENDITEM,

                       "Name=userPass", "Value=1", ENDITEM,

                       LAST);

     

        web_reg_save_param("person",

                       "LB/BIN=<input personId=\"",

                       "RB/BIN=\" projectId",

            "Ord=ALL",

                       "Search=Body",

                       LAST);

             web_reg_save_param("row",

                      "LB/BIN=\" lineNo=\"",

                       "RB/BIN=\"",

                       "Ord=ALL",

                       "Search=Body",

                       LAST);

     

             web_url("工时管理",

             "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03",

                       "TargetFrame=main",

                       "Resource=0",

                       "RecContentType=text/html",

                       "Referer=http://192.168.18.31/TimeSheet/TabMenu.jsp",

                       "Snapshot=t5.inf",

                       "Mode=HTML",

                       LAST);

     

      strcpy(form,"Body=");

     count=atoi(lr_eval_string("{person_count}"));

    for(i=1;i<=count;i++)

     {

     sprintf(tp,"chk%d=on",i-1);

     sprintf(tp1,"&status_code%d=2",i-1);//&status_code0=2

     

     sprintf(tp2,"&row_num%d",i-1);//&row_num0

     

     sprintf(rowvalue,"{row_%d}",i);

     strcpy(roweva,lr_eval_string(rowvalue));

     sprintf(tp3,"=%s",roweva);//=1

     

     sprintf(tp4,"&employeeId%d",i-1);//&employeeId0

     

     sprintf(personvalue,"{person_%d}",i);

     strcpy(personeva,lr_eval_string(personvalue));

     sprintf(tp5,"=%s&",personeva);//=96818&

     

     strcat(form,tp);

     strcat(form,tp1);

     strcat(form,tp2);

     strcat(form,tp3);

     strcat(form,tp4);

     strcat(form,tp5);

     }

     sprintf(tp6,"row_count=%s",lr_eval_string("{person_count}"));

     strcat(form,tp6);//Body=chk0=on&status_code0=2&row_num0=1&employeeId0=96818&row_count=1

     

     strcat(form,"&operateFlag=approve&approve_person_id=0&approve_last_name=null");

     

       lr_start_transaction("全部提交");

     

       web_custom_request("ApproveDetailManager.jsp",

             "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03",

                       "Method=POST",

                       "RecContentType=text/html",

                       "Snapshot=t6.inf",

            form,

        LAST);

     

             lr_end_transaction("全部提交", LR_AUTO);

     

             return 0;

    }

    说明:lr_save_string函数返回脚本中的一个参数当前的值,C的变量不能直接在LR 查看(7871) 评论(2) 收藏 分享 管理

  • lr监控weblogic配置方法

    2012-09-26 16:59:26

    LR监控linuxWeblogic8.1.3 
    虽然LR8.1手册对设置Weblogic监视器有说明,但觉得自己的实际操作更为简洁,写下来与大家共享:

    1 配置监控环境

    1 首先要在controller所在的机器上安装JDK,有朋友说此JDK必须要和Weblogic所使用的JDK为同一个版本,我没测试过版本不同时会出什么问题,但我想还是保证两个版本一样为好。另外,我在Linux下装好Weglogic后,在访问Weblogic控制台(http://192.168.10.200:7001/console)时,左边的控制树列不出来,想了半天,原来是在Windows客户端没装JDK

    2 修改在\LR安装目录\dat\monitors下的weblogiMon.iniJVM的路径和版本。

    例:

    JVM="javaw.exe" 修改成 JVM="c:\jdk142_07\jre\bin\javaw.exe" (由于设置了路径,此处没改也通过了)

    JavaVersion=1.3   修改成 JavaVersion=1.4 (这是因为weblogic8.1JAVA版本是1.4,所以需要修改版本)

    3 Linux/home/bea/weblogic81/server/lib/weblogic.jar拷到\LR安装目录\classes

    4 删除\LR安装根目录下\classes\目录下的jmxri.jar文件

    2 添加Weblogic监视器

    1 添加Weblogic所在服务器的IP

    2 添加用户名和密码。我在此处用的用户名和密码是Weblogic(安装weblogic时的默认账户),也可以在Weblogic中添加自己的用户名和密码,方法如下:

    a)       打开 WebLogic 控制台 http://<主机 : 端口 >/console)。

    b)      在左侧的树中,依次选择 “Security> Realms > myrealm >user”,单击屏幕右侧的“Configure a new User...”,分别键入用户名和密码,单击 “apply”

    c)      “Group”选项卡中,选择性Monitors,单击“apply”

    3 配置WeblogicJMX)监控器,有关各度量类别中所包含度量的详细信息,请参阅 Mercury 的负载测试监控网站http://www.mercury.com/us/products/performance-center/loadrunner/monitors/bealogic.html

  • loadrunner关联

    2012-03-16 19:29:36

    工作流引擎自动生成entry_id,由于每次生成的entry_id不能精确判断,使用文件参数化不能满足要求。

     web_reg_save_param参数从源文件中获取entry_id。

    可以在tree view模式下对此参数进行编辑,可以自动生成如下的属性。

    语法:web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
    ParamName: 存放得到的动态内容的参数名称 
    list of Attributes:
    其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写 
    Notfound:
    当在返回信息中找不到要找的内容时应该怎么处理 
    Notfound=error:
    当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。 
    Notfound=warning:
    当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。 
    LB( Left Boundary ) :
    返回信息的左边界字串。该属性必须有,并且区分大小写。 
    RB( Right Boundary ):
    返回信息的右边界字串。该属性必须有,并且区分大小写。 
    RelFrameID:
    相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。 
    Search :
    返回信息的查找范围。可以是HeadersBodyNoresourceAll(缺省)。该属性质可有可无。 
    ORD :
    说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。 
    SaveOffset :
    当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0 
    SaveLen
    :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。 
    Convert :
    可取的值有以下两种: 
      HTML_TO_URL : HTML-encoded 资料转成 URL-encoded 资料格式
      HTML_TO_TEXT : HTML-encoded 资料转成纯文字资料格式

    //注册关联参数

    web_reg_save_param("entryid",

             "LB/BIN=ENTRY_ID=",

             "RB/BIN=&",

             "NotFound=ERROR",

             "Search=Body",

             LAST);

         web_submit_data("itembook_entry.jsp_2",

             "Action=http://ip/Budget/Jsp/Itembook/itembook_entry.jsp?time=Thu%20Mar%2015%2018:58:24%20UTC+0800%202012",

             "Method=POST",

             "TargetFrame=",

             "RecContentType=text/html",

             "Referer=http://ip/Budget/Jsp/Itembook/itembook_entry.jsp?time=Thu Mar 15 18:58:24 UTC+0800 2012",

             "Snapshot=t9.inf",

             "Mode=HTML",

             ITEMDATA,

             "Name=itemcode", "Value={itemcode}", ENDITEM,

             "Name=carrier", "Value=", ENDITEM,

             "Name=area", "Value=", ENDITEM,

             "Name=tbOrgazitionCode", "Value=", ENDITEM,

             "Name=Searchcontrol1", "Value=", ENDITEM,

             "Name=action", "Value=查 询", ENDITEM,

             LAST);

         web_url("审核",

             "URL=http://ip/Budget/Jsp/Itembook/itembook_audit.jsp?item_id={itemid}&ENTRY_ID={entryid}&STEP_ID=1",

             "TargetFrame=",

             "Resource=0",

             "RecContentType=text/html",

             "Referer=http://ip/Budget/Jsp/Itembook/itembook_entry.jsp?time=Thu Mar 15 18:58:24 UTC+0800 2012",

             "Snapshot=t10.inf",

             "Mode=HTML",

             LAST);

         lr_log_message("getvalue : %s", lr_eval_string("{entryid}"));//打印

  • run-time settings

    2011-05-11 11:22:07

    1、清除IE缓存
       browser
          browser emulation
               clear cache on each iteration打勾
               函数 web_cache_clearup()
  • URL -based script与HTML -based script区别

    2011-04-08 17:23:35

    在Web(HTTP/HTML)录制中,有2种重要的录制模式。用户该选择那种录制模式呢?
    HTML-mode录制是缺省也是推荐的录制模式。它录制当前网页中的HTML动作。
    在录制会话过程中不会录制所有的资源。在回放时,HTML-mode脚本积极地解析返回的信息来获得要下载的资源。
    HTML-mode是亦称上下文敏感方式因为它只能在先前请求的结果的上下文之内执行。由于许多的HTTP 请求数据都是从内存中取出来的,所以语句必须在正确的前个请求之后执行。

    HTML-based 方式对每个页面录制形成一条语句,对LoadRunner来说,在该模式下,访问一个页面,首先会与服务器之间建立一个连接获取页面的内容,然后从页面中分解得到其他的元素(component),然后建立几个连接分别获取相应的元素。

    HTML-mode录制的优点是:
    1.资源从内存中取出且在回放时下载。因此,脚本比其他的录制方式更小且更容易阅读。
    2.由于只有较少的硬编码脚本,因此只有较少的动态数值需要关联。
    3.可以插入图片检查之类的语句以检查结果是否正确。
    4.因为HTML模式回放时需要积极地解析返回的信息,因此它可能会比其他录制模式更加占用资源。然而,HTML模式record/replay有相当大的改善,使得差异最小化且微不足道。


    URL-based 方式
    URL-mode选项指导VuGen录制来自server的所有的请求和资源。它自动录制每一个HTTP资源为URL的步骤。这种录制模式甚至抓取非HTML应用程序,例如applets和非浏览器的应用程序。

    URL-based 方式将每条客户端发出的请求录制成一条语句,对LoadRunner来说,在该模式下,一条语句只建立一个到服务器的连接,LoadRunner提供了web_concurrent_start和web_concurrent_end函数模拟HTML-based的工作方式。

    推荐使用这种录制方式录制以下情况:
    1。录制非browser的应用程序
    2。取得在下载或不下载哪些资源上更好的控制,既然你可以在脚本中修改。
    3。当使用LR6.x时,录制使用applet和/或javascript的浏览器应用程序
    由于URL-模式录制了所有的请求和资源,需要做更多的关联。脚本看起来也会相当的长。

    如何决定选择何种录制方式?
    1、如果应用是WEB应用,首选是HTML-based方式;
    2、如果应用是使用HTTP协议的非WEB应用,首选是URL-based方式;
    3、如果WEB应用中使用了java applet程序,且applet程序与服务器之间存在通讯,选用URL-based方式;
    4、如果WEB应用中使用的javascript、vbscript脚本与服务器之间存在通讯(调用了服务端组件),选用URL-based方式。

  • LR运行场景时出现的error

    2011-03-29 11:06:30

    1、Action.c(24): Error -27740: Overlapped transmission of request to "home.asiainfo-linkage.com" for URL "http://home.asiainfo-linkage.com/TimeSheet" failed: WSA_IO_PENDING

    *********************************************************

    2、Step download timeout (300 seconds) has expired when downloading resource(s). Set the "Step Timeout caused by resources is a  Run-Time Setting to Yes/No to have this message as a warning/error, respectively

    解决方法:

       1、 修改run time setting中的请求超时时间,增加到600s,其中有三项的参数可以一次都修改了,HTTP-request connect timeout,HTTP-request receieve timeout,Step download timeout,分别建议修改为600、600、5000;run time setting设置完了后记住还需要在control组件的option的run time setting中设置相应的参数;

      2、 办法一不能解决的情况下,解决办法如下:

       设置runt time setting中的internet protocol-preferences中的advaced区域有一个winlnet replay instead of sockets选项,选项后再回放就成功了。切记此法只对windows系统起作用,此法来自zee的资料。

       3、

    负载生成器的性能太好,发数据包特别快,服务器也响应特别快,从而导致负载生成器的机器的端口在没有timeout之前就全部占满了。在全部占满后,就会出现上面的错误。执行netstat –na命令,可以看到打开了很多端口。所以就调整TCP的time out。即在最后一个端口还没有用到时,前面已经有端口在释放了。
    成功的解决方法:

    在负载生成器的注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里,有如下两个键值:
    TcpTimedWaitDelay
    MaxUserPort
    1,这里的TcpTimedWaitDelay默认值应该中是30s,所以这里,把这个值调小为5s(按需要调整)。
    2,也可以把MaxUserPort调大(如果这个值不是最大值的话)

      1,这里的TcpTimedWaitDelay默认值应该中是30s,所以这里,把这个值调小为5s(按需要调整)。

      2,也可以把MaxUserPort调大(如果这个值不是最大值的话)。

    **********************************************************

    3、Action.c(366): Error -26366: "Text=0898" not found for web_reg_find

    4、Action.c(143): Error -27782: Timeout (300 seconds) exceeded while waiting to receive data for URL "http://home.asiainfo-linkage.com/TimeSheet/Jsp/TimeSheetManage/TimeSheetDetail.jsp?DropSession=201103P3"

    5、Action.c(24): Error -27791: Server "home.asiainfo-linkage.com" has shut down the connection prematurely

    一般是在访问应用服务器时出现,大用户量和小用户量均会出现;

      来自网上的解释:

      1> 应用访问死掉

      小用户时:程序上的问题。程序上存在数据库的问题

      2> 应用服务没有死

      应用服务参数设置问题

      例如:

      在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%

      Java连接池的大小设置,或JVM的设置等

      3> 数据库的连接

      在应用服务的性能参数可能太小了

      数据库启动的最大连接数(跟硬件的内存有关)

      以上信息有一定的参考价值,实际情况可以参考此类调试。

    **********************************************************

    6、Action.c(24): Error -27796: Failed to connect to server "home.asiainfo-linkage.com:80": [10060] Connection timed out

    ***********************************************************

    7 问题描述Connection reset by peer

      这个问题不多遇见,一般是由于下载的速度慢,导致超时,所以,需要调整一下超时时间。

      解决办法:Run-time setting窗口中的‘Internet Protocol’-‘Preferences’设置set advanced options(设置高级选项),重新设置一下“HTTP-request connect timeout(sec),可以稍微设大一些”;

    ************************************************************

     三、问题描述connection refused

      这个的错误的原因比较复杂,也可能很简单也可能需要查看好几个地方,解决起来不同的操作系统方式也不同;

      1、 首先检查是不是连接weblogic服务过大部分被拒绝,需要监控weblogic的连接等待情况,此时需要增加acceptBacklog,每次增加 25%来提高看是否解决,同时还需要增加连接池和调整执行线程数,(连接池数*Statement Cache Size)的值应该小于等于oracle数据库连接数最大值;

      2、 如果方法一操作后没有变化,此时需要去查看服务器操作系统中是否对连接数做了限制,AIX下可以直接vi文件limits修改其中的连接限制数,还有 tcp连接等待时间间隔大小,wiodows类似,只不过wendows修改注册表,具体修改方法查手册,注册表中有TcpDelayTime项;

    ************************************************************* 

     四、问题描述open many files

      问题一般都在压力较大的时候出现,由于服务器或者应用中间件本身对于打开的文件数有最大值限制造成,解决办法:

      1、 修改操作系统的文件数限制,aix下面修改limits下的nofiles限制条件,增大或者设置为没有限制,尽量对涉及到的服务器都作修改;

      2、 方法一解决不了情况下再去查看应用服务器weblogic的commonEnv.sh文件,修改其中的nofiles文件max-nofiles数增大,应该就可以通过了,具体就是查找到nofiles方法,修改其中else条件的执行体,把文件打开数调大;修改前记住备份此文件,防止修改出错;

    **************************************************************

    六、问题描述Failed to connect to server

      这个问题一般是客户端链接到服务失败,原因有两个客户端连接限制(也就是压力负载机器),一个网络延迟严重,解决办法:

      1、 修改负载机器的tcpdelaytime注册表键值,改小;

      2、 检查网络延迟情况,看问题出在什么环节;

      建议为了减少这种情况,办法一最好测试前就完成了,保证干净的网络环境,每个负载机器的压力测试用户数不易过大,尽量平均每台负载器的用户数,这样以上问题出现的概率就很小了。

    ************************************************************

    问题描述Overlapped transmission of request to ... WSA_IO_PENDING

    这个问题,解决方法:
    1、方法一,在脚本前加入web_set_sockets_option("OVERLAPPED_SEND", "0"),禁用TTFB细分,问题即可解决,但是TTFB细分图将不能再使用,附图。

    2、方法二,可以通过增加连接池和应用系统的内存,每次增加25%。
      
    八、问题描述Deleted the current transaction ... since response time is not accurate
    这个问题不多遇见,一般出现在压力机器上发生ping值为负数(AMD双核CPU),可以重新启动pc机或者打补丁,附图。

    九、问题描述HTTP Status-Code=500 (Internal Server Error) for
    1、应用服务当掉,重新启动应用服务。
    2、当应用系统处于的可用内存处于阀值以下时,出现HTTP Status-Code=500的概率非常高,此时只要增加应用系统的内存,问题即可解决。
                                    
    十、问题描述Failed to transmit data to network: [10057]Socket is not connected
    这个错误是由网络原因造成的,PC1和PC2上面都装了相同的loadrunner 9.0,且以相同数量的虚拟用户数运行相同的业务(机器上的其他条件都相同),PC1上面有少部分用户报错,PC2上的用户全部执行通过。


    十一、问题描述 Error -27257: Pending web_reg_save_param/reg_find/create_html_param[_ex] request(s) detected and reset at the end of iteration number 1
    解决方法:web_reg_save_param位置放错了,应该放到请求页面前面。
                          
    十二、问题描述 通过Controler调用远程代理时报错,Error: CCI security error:You are running under secure mode and the function system is not allowed in this mode.
    解决方法:在代理开启的时候,去掉勾选防火墙选项。

    **********************************************************

    Action.c(16): 错误 -27796: 连接服务器“qurl.f.360.cn:80”失败: [10060] Connection timed out

     web_submit_data("check_outchain.php_2",
      "Action=http://qurl.f.360.cn/check_outchain.php",
      "Method=POST",
      "EncType=multipart/form-data",
      "TargetFrame=",
      "RecContentType=text/xml",
      "Referer=",
      "Snapshot=t12.inf",
      "Mode=HTML",
      ITEMDATA,
      "Name=urls", "Value=3a2b21a0bc53731c8e295501ab530e8d|81021f4a79eb773d1715d95df4bd7c59|a272be4567f4991a77374c381aebfd51|81021f4a79eb773d1715d95df4bd7c59\tnT9gMF5up2yunJ5zol1fnJ5eLJqyYzAioD==\n", ENDITEM,
      "Name=src", "Value=addrbar", ENDITEM,
      "Name=product", "Value=wd", ENDITEM,
      "Name=combo", "Value=urlproc", ENDITEM,
      "Name=v", "Value=1", ENDITEM,
      "Name=vk", "Value=2acbc92d", ENDITEM,
      "Name=mid", "Value=64a2c3a0fb3b9e8b3cf940f0156e27a4", ENDITEM,

    http://belly.javaeye.com/blog/899744

    ***********************************************************

    Action.c(82): Error -26377: No match found for the requested parameter "WCSParam_Diff1". Check whether the requested boundaries exist in the response data. Also, if the data you want to save exceeds 1024 bytes, use web_set_max_html_param_len to increase the parameter size

    请求的参数“WCSParam_Diff1”无法匹配,检查响应数据中是否存在请求边界值,另外,如果你想保存超过1024字节的数据,要使用“web_set_max_html_param_len”这种方式来增加参数的范围

    现在看来是要结合下一条错误来看的。估计是请求超时了,含有WCSParam_Diff1参数的请求就没有得到响应。

    Action.c(8): Error -27796: Failed to connect to server "192.168.18.173:80": [10060] Connection timed out

    ************************************************************

     

  • LR录制无法弹出IE

    2011-03-28 17:09:02

    1、对于Windows 2003上录制无法弹出IE,导致IE Crash,iedw.exe(IE Crash Detection)报告错误事件,可能原因是Windows Server默认对IE加载DEP(数据执行保护)特性,而Vugen.exe刚好又跟DEP冲突。方法:我的电脑>右键属性->高级->“性能”部分的“设置”->“数据执行保护”->点击“添加”按钮->将LR安装目录bin下的vugen.exe添加进去->点击确定,重启一下LR,就可以录制了。

    2、当有多个浏览器时,需要将IE置为默认浏览器。在Run-time Settings中设置Browser Emulation的User-Agent值为IE。由于IE的第三方插件的影响,需要在IE的工具-Internet选项…-高级中,将“启用第三方浏览器扩展”的选中去掉。3、

    3、在LR安装目录的\bin下,单击register_vugen.bat文件,注册信息被重新改写了,然后重启机器,注册信息才能生效。如果没有register_vugen.bat文件,可以直接将LR8.0中的文件copy来用。

  • Windows 常用的计数器

    2010-12-29 22:50:34

    MemoryAvailable Mbytes 物理内存的可用数(单位 Mbytes)至少要有10% 的物理内存值;如果Process/Private bytes Process/working set这两个计数器升高但是Available Mbytes降低则可能存在内存泄漏。

     

    Processor%Processor Time CPU 使用率。这是查看处理器饱和状况的最佳计数器。显示所有 CPU 的线程处理时间。如果一个或多个处理器的该数值持续超过 90%,则表示此测试的负载对于目前的硬件过于沉重。为多处理器服务器添加该计数器的 0 x 个实例。

     

    Processor Queue Length:是指处理列队中的线程数,小于2。处理器瓶颈会导致该值持续大于2

     

    Context Switches/sec:如果切换次数到5000*CPU个数和10000*CPU个数中,说明它忙于切换线程。如果吞吐率降低且CPU使用率高,且Context Switches/sec15000以上则可能应用程序忙于切换线程。

    比较Context Switches/sec %Privileged Time 来判断上下文切换是否过量。如果后者的值超过40%,且上下文切换的速率也很高,那么应该检查为什么会产生这样高的上下文切换

     

    Network InterfaceBytes Total/sec 为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。带宽10M=1.28MBps=1280kBps. Kilobytes per second kBps.Bytes Total/sec的计量单位是Bytes per second,该值与网络带宽相除应小于50%

     

    Disk TimePhysical_disk_total),%DPC Time(Processor) & % Processor Time(Processor),如果这三个计数器均较大,则磁盘不是瓶颈,如果只有Disk Time较大,其他适中则IO可能为瓶颈,另外,如果Disk Time保持在2.0以下且有超过3.0的磁盘队列长度(Current Disk Queue),则IO瓶颈。 Disk Bytes/sec??

    page read/sec:页的硬故障,page/sec的子集,为了解析对内存的引用,必须读取页文件的次数。阈值为>5. 越低越好。大数值表示磁盘读而不是缓存读。

    Physical Disk\ % Disk Time
    Physical Disk\ Avg.Disk Queue Length
    例如,包括 Page Reads/sec % Disk Time Avg.Disk Queue Length。如果页面读取操作速率很低,同时 % Disk Time Avg.Disk Queue Length的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。
  • LR监控设置之windows监控

    2010-12-29 15:17:08

    1、进入被监视windows系统, 开始—>运行中输入services.msc,开启Remote Procedure Call(RPC)、Remote Registry Service和server服务
    2、在被监视的WINDOWS机器上:右击我的电脑,选择管理->共享文件夹->共享在这里面要有C$这个共享文件夹
    3、在安装LR的机器上,开始—>运行,\\被监视机器IP\C$,输入管理员帐号和密码,如果能看到被监视机器的C盘了,就说明你得到了那台机器的管理员权限,可以监控
     
Open Toolbar