学历代表过去、能力代表现在、学习力代表未来

发布新日志

  • loadrunner 在HTTP接口测试中的应用

    2012-05-14 23:30:12

    来源:http://www.51testing.com/?uid-23978-action-viewspace-itemid-132923

     

    对一个手机音乐播放器项目进行测试,需要测试和服务器交互的信令,分析了信令协议后,还是确定使用LR来执行

    该播放器和服务器的交互采用HTTP协议,支持POST和GET两种方式,使用Loadrunner的web_custom_request可以很轻松实现该功能

    脚本如下:

    Action()
    {
    //4.2.2 歌曲详细信息访问接口POST方式实现
     web_custom_request("music1",
      "URL=http://172.16.11.162:9055/musicSync/syncMusicDetail.do",
      "Method=POST",
      "Resource=0",
      "Referer=",
      "Mode=HTTP",
      "EncType=text/html; charset=UTF-8",
      "Body=<?xml version=/"1.0/" encoding=/"UTF-8/"?>/r/n"
      "<message>/r/n"
      "<spcode>16</spcode>/r/n"
      "<hsman>aux</hsman >/r/n"
      "<hstype>1111</hstype>/r/n"
      "<imsi>232323</imsi>/r/n"
      "<musicid>119</musicid >/r/n"
      "</message>",
      LAST);

    //4.2.2 歌曲详细信息访问接口GET方式实现
      web_custom_request("music2",
      "URL=http://172.16.11.162:9055/musicSync/syncMusicDetail.do?sp=16&hm=aux&ht=1111&is=232323&id=119",
      "Method=GET",
      "Resource=0",
      "Referer=",
      "Mode=HTTP",
      "EncType=text/html; charset=UTF-8",
      "Body=",
      LAST);

     return 0;
    }

    两种方式实现的功能是相同的,而要观察服务器的返回信息,LR的HTTP协议方式执行时只需要在日志选项中选中扩展日志中的“服务端返回的数据”即可,返回结果如下:

    虚拟用户脚本已启动
    正在开始操作 vuser_init。
    Web Turbo 重播 LoadRunner 8.1.0 for WINXP; Web 内部版本 4788   [MsgId: MMSG-27143]
    运行时设置文件: "F:/music/12530L//default.cfg"   [MsgId: MMSG-27141]
    正在结束操作 vuser_init。
    正在运行 Vuser...
    正在开始迭代 1。
    正在开始操作 Action。
    Action.c(4): “http://172.16.11.162:9055/musicSync/syncMusicDetail.do”(RelFrameId=1)的 t=1833ms: 111 个字节响应标头
    Action.c(4):     HTTP/1.1 200 OK/r/n
    Action.c(4):     Server: Apache-Coyote/1.1/r/n
    Action.c(4):     Transfer-Encoding: chunked/r/n
    Action.c(4):     Date: Wed, 24 Jun 2009 06:43:13 GMT/r/n
    Action.c(4):     /r/n
    Action.c(4): “http://172.16.11.162:9055/musicSync/syncMusicDetail.do”(RelFrameId=1)的 t=1945ms: 3 个字节成块响应开销
    Action.c(4):     3/r/n
    Action.c(4): “http://172.16.11.162:9055/musicSync/syncMusicDetail.do”(RelFrameId=1)的 t=1956ms: 3 个字节成块响应正文
    Action.c(4):     200
    Action.c(4): “http://172.16.11.162:9055/musicSync/syncMusicDetail.do”(RelFrameId=1)的 t=1966ms: 2 个字节成块响应开销
    Action.c(4):     /r/n
    Action.c(4): “http://172.16.11.162:9055/musicSync/syncMusicDetail.do”(RelFrameId=1)的 t=1977ms: 5 个字节成块响应开销
    Action.c(4):     0/r/n
    Action.c(4):     /r/n
    Action.c(4): web_custom_request("music1") 已成功,3 个正文字节,111 个标头字节,10 个成块开销字节   [MsgId: MMSG-26385]
    正在结束操作 Action。
    正在结束迭代 1。
    正在结束 Vuser...
    正在开始操作 vuser_end。
    正在结束操作 vuser_end。
    Vuser 已终止。

    响应正文中返回200代表请求成功,再配合对服务端数据库的数据检查即完美地实现了对该HTTP协议交互项目的测试.

  • LR 接口测试(Windows socket方式)

    2012-04-28 09:40:49

    1.在 data.ws 中定义发送报文(报文内容、报文长度)、接收报文长度
      ;WSRData 2 1

      //发送报文
      send  buf1 100
       "00479000<psam>;422006402831111151043130290701;<telno>0000"
      //接收报文
      recv buf2 100
     
      -1
     
    2.创建socket连接,并发送、接收报文
      lrs_startup(257);
      //设置socket连接创建超时时间
      lrs_set_accept_timeout(20,20000);
      //创建一条PC和接口服务的socket连接
      lrs_create_socket("socket0", "TCP", "LocalHost=12405", "Backlog=5",  LrsLastArg);
      lrs_accept_connection("socket0", "socket1");

      lrs_send("socket1", "buf1", LrsLastArg);
      lrs_receive("socket1", "buf2", LrsLastArg);
     
    3.接口测试中常用的函数
      char *recvbuf1;
      int recvlen1=0;
     
      lrs_create_socket("socket0", "TCP", "LocalHost=12405", "Backlog=5",  LrsLastArg);
      lrs_accept_connection("socket0", "socket1");

      lrs_send("socket1", "buf1", LrsLastArg);
      lrs_receive("socket1", "buf2", LrsLastArg);
     
      lrs_get_last_received_buffer("socket1",&recvbuf1,&recvlen1);
     
      if (recvlen1 == 100)
      {
         lr_output_message("正确接收报文");
      }
     
  • LR9.5卸载安装

    2012-04-23 15:24:33

    第一步:用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.1(9.5)安装目录下“bin”文件夹中的对应文件;
    第二步:手动修改注册表,删除下面内容
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\History]
    "AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"=""
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\PermanentLicense]
    @="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"
    "last"="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\TemporaryLicense]@="AEBGEBFS-AKEKEKEKE-KAUCA"
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{87B3ADD4-21EB-11d5-93EF-00105AA0FD2D}]
    @="IControl"
    第三步:添加下面的licence,即可使用。
     
    global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
    6.5w license:AEACFSJI-YJKJKJJKEJIJD-BCLBR
  • Loadrunner自定义监控器方法

    2011-07-15 12:02:05

    Loadrunner安装目录下 *\dat\monitors\vmon.cfg 该文件中有各监控器的信息,用户也可根据需要手动添加合适的监控器。
  • 【转载】Loadrunner中web_reg_save_param的使用详解

    2011-04-26 10:28:54

     

    【摘要】利用实际案例说明如何使用Mercury LoadRunner提取包含在HTML页内的动态信息并创建参数。

    【关键词】性能测试,压力测试,Mercury LoadRunner

    • 应用范围

    在使用Loadrunner进行性能测试时,经常遇到一种情况,需要通过web页面修改某事务的状态。于是需要首先读出当前的事务的状态,再进行修改,此时便可以使用到web_reg_save_param了。可以通过它先将事务的状态读出写入一个自定义的变量中,根据变量的值来决定下一步的动作。

    • 简要说明

    语法:

    int 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资料转成纯文字资料格式

    • 实例讲解

    目的:取得页面中的商品状态,如果状态是正常态就改为注销态,否则改为正常态。

    录制脚本使用的是URL based scrīpt

    将返回的数据记录到日志

    • 直接手工访问页面,检查URL

    该页面上点击右键,选择属性

    看到URL,对照录制下的脚本中有:
    web_url("modifyOfferingStatePage.do",
    "URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Resource=0",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/orderMenu.do",
    "Snapshot=t23.inf",
    "Mode=HTTP",
    LAST);
    于是在这段代码前添加注册函数:
    web_reg_save_param("oldstate",
    "LB/IC=
    原有商品状态:</td>",
    "RB/IC=</td>",
    "Search=body",
    "Ord=1",
    "RelFrameId=1",
    "SaveOffset=57",
    "SaveLen=4",
    LAST);
    web_url("modifyOfferingStatePage.do",
    "URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName={clientname}&nodeId=
    260000&pos1=
    定购管理&pos2=修改商品状态",

    "Resource=0",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/orderMenu.do",
    "Snapshot=t23.inf",
    "Mode=HTTP",
    LAST);
    ...............
    //
    将得到的内容存入日志用于检查
    lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));

    if ( lr_eval_string ("{oldstate}") == "正常"){
    web_submit_data("modifyOfferingState.do",
    "Action={url}/web/businessAccept/order/modifyOfferingState.do",
    "Method=POST",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Snapshot=t24.inf",
    "Mode=HTTP",
    ITEMDATA,
    "Name=offering.state", "Value=1", ENDITEM,
    "Name=offering.recentModifyReason", "Value=
    修改原因", ENDITEM,
    "Name=offering.customerId", "Value=281218", ENDITEM,
    "Name=offering.offeringId", "Value=282172", ENDITEM,
    "Name=offering.offeringSpecId", "Value=1", ENDITEM,
    "Name=offering.recentMender", "Value=root", ENDITEM,
    "Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
    "Name=nodeId", "Value=260000", ENDITEM,
    "Name=customerName", "Value={clientname}", ENDITEM,
    "Name=offeringSpecName", "Value=
    普通宽带(ADSL/LAN", ENDITEM,
    "Name=submit.x", "Value=33", ENDITEM,
    "Name=submit.y", "Value=13", ENDITEM,
    LAST);
    }
    Else
    {
    web_submit_data("modifyOfferingState.do",
    "Action={url}/web/businessAccept/order/modifyOfferingState.do",
    "Method=POST",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Snapshot=t24.inf",
    "Mode=HTTP",
    ITEMDATA,
    "Name=offering.state", "Value=0", ENDITEM,
    "Name=offering.recentModifyReason", "Value=
    修改原因", ENDITEM,
    "Name=offering.customerId", "Value=281218", ENDITEM,
    "Name=offering.offeringId", "Value=282172", ENDITEM,
    "Name=offering.offeringSpecId", "Value=1", ENDITEM,
    "Name=offering.recentMender", "Value=root", ENDITEM,
    "Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
    "Name=nodeId", "Value=260000", ENDITEM,
    "Name=customerName", "Value={clientname}", ENDITEM,
    "Name=offeringSpecName", "Value=
    普通宽带(ADSL/LAN", ENDITEM,
    "Name=submit.x", "Value=33", ENDITEM,
    "Name=submit.y", "Value=13", ENDITEM,
    LAST);
    }
    从日志中截取的真实的返回内容为:
    vuser_init.c(689): <tr bgcolor="#F6F6F6">\r\n
    vuser_init.c(689): <td width="30%" height="23" align="right">\r\n
    vuser_init.c(689):
    原有商品状态:</td>\r\n
    vuser_init.c(689): <td width="70%" height="23">
    正常</td>\r\n
    vuser_init.c(689): </tr>\r\n
    vuser_init.c(689): <tr bgcolor="#F4FBFE">\r\n
    vuser_init.c(689): <td width="30%" height="23" align="right">\r\n
    vuser_init.c(689):
    修改后的状态:</td>\r\n
    vuser_init.c(689): <td width="70%" height="23">\r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): <input type="radio" name='offering.state' value='4' checked>
    可以看到左边界是:原有商品状态:</td>
    右边界是:</td>,偏移量为:57(包括了空格),
    长度为:4(因为一个汉字长度为2),最后存入变量的值是:正常

    4.经验总结
    1)
    为了便于脚本的调试,将返回的数据都写入日志是个好办法;
    2)
    为了验证取得的数据是否是自己期望的,可以将取得的数据写入日志中进行验证,
    例:lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));
    3)
    因为它是一个注册函数,必须在返回信息前使用,所以注册的位置必须正确,否则很可能得到类似如下错误:
    4)vuser_init.c(734): Error -27190: No match found for the requested parameter "oldstate".
    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 [MsgId: MERR-27190]
    5)vuser_init.c(734): Error -27187: The above "not found"
    error(s) may be explained by header and body byte counts being 0 and 0,
    respectively. [MsgId: MERR-27187]
    6)vuser_init.c(734):
    web_concurrent_end highest severity level was "ERROR" [MsgId: MMSG-27181]
    7)
    所以使用手工方法,右键页面确定在代码中哪个位置之前注册函数至关重要
    8)
    如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。

     

    转自:http://labs.chinamobile.com/mblog/386547_55544

  • Loadrunner脚本录制时乱码处理

    2011-04-22 10:10:49

    字符串编码转换的函数lr_convert_string_encoding:

    lr_convert_string_encoding ( const char *sourceString, const char *fromEncoding, const char *toEncoding, const char *paramName);

    • sourceString:被转换的源字符串
    • fromEncoding:转换前的字符编码
    • toEncoding:要转换成为的字符编码
    • paramName:转换后的目标字符串

    编码类型:LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,LR_ENC_UNICODE

  • 【转贴]】在Loadrunner脚本目录下哪些文件可以删除呢

    2011-04-22 09:34:37

    运行Loadrunner脚本时,会产生与脚本文件名相同的文件夹。当你需要在另一台计算机上运行时,其下的大多数文件是需要的。因此,最简单的做法是把整个文件夹拷过去。如果你想删除一些不必要的文件,你可以删除一些日志和输出文件。
    具体包括:

    options.txt
    mdrv_cmd.txt
    mdrv.log
    debug.inf
    pre_cci.c
    .ci
    combined_.c
    output.txt

    除了以上,还包括所有扩展名为.idx和.bak的文件以及Result1文件夹下的文件和子目录。
    注:如果删除“脚本目录\data文件夹下的RecordingLog.txt”文件,虽然不影响脚本的回放,但是不能
    再看到在录制过程中发生的信息。

    在Loadrunner脚本目录下哪些文件可以删除呢?
    就这个问题而言不是什么问题,因为把整个脚本文件夹移过去,既快又安全。但是,通过了解这些文件,将有助于深入理解Loadrunner工作原理和开发脚本等等。
    为了提高效率,现提供一个批处理文件代替手工删除过程。如果大家发现还可以删除其它文件而不影响在另一台计算机上运行,那么可以不断地补充。具体代码如下: echo off
    cls
    echo.
    echo.
    echo  This batch file will delete the following files from every
    echo  folder and subdirectory from the folder in which it is run:
    echo.  
    echo  *.idx
    echo  mdrv*.log
    echo  mdrv.txt
    echo  options.txt
    echo  *.ci
    echo  combined_*.c
    echo  output.txt
    echo  debug.inf
    echo  *.bak
    echo  \result1
    echo.
    echo.
    if exist %temp%\FilesDeleted.txt del %temp%\FilesDeleted.txt
    del *.idx /s >%temp%\FilesDeleted.txt
    del mdrv*.log /s >>%temp%\FilesDeleted.txt
    del mdrv.txt /s >>%temp%\FilesDeleted.txt
    del options.txt /s >>%temp%\FilesDeleted.txt
    del *.ci /s >>%temp%\FilesDeleted.txt
    del combined_*.c /s >>%temp%\FilesDeleted.txt
    del output.txt /s >>%temp%\FilesDeleted.txt
    del debug.inf /s >>%temp%\FilesDeleted.txt
    del *.bak /s >>%temp%\FilesDeleted.txt
    rd result1 /s /q
    "Notepad.exe" "%temp%\FilesDeleted.txt"
    del %temp%\FilesDeleted.txt
    可以把上述代码存成fileDel.bat或fileDel.cmd,都可以,随大家意。
    最后,对代码稍作解释一下。
    首先,该批处理文件(fileDel.bat)从它所在的目录开始查找上面列出的要删除的文件,在查找之前判断是否存在FileDeleted.txt文件,
    存在则删除。
    其次,如果找到列出文件时,就把该文件删除,并把删除信息输出到FileDeleted.txt。没有找到时就会有找不到 XXX文件
    提示
    最后,当查找结束后会调用记事本打开FileDeleted.txt文件,删除信息一目了然。
    该打住了,不是问题的问题说得太多了。Enjoy!

  • Loadrunner 监控Unix系统性能指标的解释

    2011-04-21 09:27:00

    Average load  上一分钟同时处于“就绪”状态的平均进程数  
    Collision rate  每秒钟在以太网上检测到的冲突数 
    Context switches rate   每秒钟在进程或线程之间的切换次数
    CPU utilization 
    CPU 的使用时间百分比 
    Disk rate  磁盘传输速率
    Incoming packets error rate  接收以太网数据包时每秒钟接收到的错误数
    Incoming packets rate  每秒钟传入的以太网数据包数 
    Interrupt rate  每秒内的设备中断数 
    Outgoing packets errors rate   发送以太网数据包时每秒钟发送的错误数
    Outgoing packets rate  每秒钟传出的以太网数据包数 
    Page-in rate   每秒钟读入到物理内存中的页数
    Page-out rate   每秒钟写入页面文件和从物理内存中删除的页数
    Paging rate   每秒钟读入物理内存或写入页面文件的页数
    Swap-in rate   正在交换的进程数
    Swap-out rate   正在交换的进程数
    System mode CPU utilization  在系统模式下使用 CPU 的时间百分比 
    User mode CPU utilization   在用户模式下使用 CPU 的时间百分比
      

  • loadrunner -27727

    2011-04-18 11:38:43

    Error -27727: Step download timeout (120 seconds)

     

    错误提示:Error -27727: Step download timeout (120 seconds) has expired when downloading resource(s). Set the "Resource Page Timeout is a Warning" Run-Time Setting to Yes/No to have this message as a warning/error, respectively


    查阅相关信息

    1. 应用服务参数设置太大导致服务器的瓶颈
    2. 页面中图片太多
    3. 在程序处理表的时候检查字段太大多

    解决方法:

    Run-Time Setting ->Internet Protocol ->Preferences ->Option -> Step download timeout(sec)改为32000.另外还有HTTP-request connect timeout和HTTP-request receive timeout出现以上问题时最大可设为1000.

     

  • loadrunner-27796

    2011-04-18 11:34:32

    原文见:http://blog.csdn.net/zeeslo

    问题:

    曾经遇到过一个问题,在一次性能测试过程中,使用http协议的多用户向服务器发送请求。设置了持续时间,出现错误为:27796, Failed to connect to server 'hostname';port_ld': 'reason'.10048.(凭记忆写的,不知道写错了没有)

    分析:

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

    官方的troubleshooting:

    查看工具的troubleshooting,如下:

    复制内容到剪贴板

    代码:

    Message Code 27796

    Failed to connect to server 'hostname';port_ld': 'reason'.

    Unable to connect to the specified server and port.

    Troubleshooting

    o      Try to address the reason provided for the connection failure.

    o      Try to access the application with a browser from the injector machine and from another machine (such as the recording machine).

    o      Check that you accurately specified the correct host name and port.

    o      Ping the host/port.

    o      Check if the server application you are trying to access is running.

    o      If you used a hostname, check if it was resolved to the correct address.

    o      Check if the server application is listening to the right port.

    均不是解决之道。

    成功的解决方法:

    在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里,有如下两个键值:

    TcpTimedWaitDelay

    MaxUserPort

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

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

    反复验证,问题解决

  • 转载:Loadrunner进程和线程

    2011-04-18 09:17:38

    1、进程与线程的区别:
       
    进程和线程的区别是什么?

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
    线程的划分尺度小于进程,使得多线程程序的并发性高。
    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
     
    2、按线程运行VUSER和按进程运行VUSER的区别
    1. 按线程运行VUSER,LR默认情况下,每50个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;
    2. 按进程运行VUSER,系统为每1个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;
    3. 在Runtime setting中设置为按线程运行VUSER,设置Controller中的虚拟用户数小于等于50的话,打开windows资源管理器可以看到有一个进程mmdrv.exe; 设置Controller中的虚拟用户数在51与100之间的话,打开windows资源管理器可以看到有两个进程mmdrv.exe.
     
    http://blog.sina.com.cn/s/blog_4b856ec401000aov.html
  • 【转载】LoadRunner参数化时的各个选项说明

    2011-04-11 16:13:50

    通过创建表方式和数据向导方式都可以成功创建数据文件,操作员可以随意选择自己习惯的方式。总之,能坚守数据文件放数据的原则,就不会出问题了。

    当回到“参数属性页面”中后,发现数据已经准备好了,而且原来灰色的区域目前也可以选择了。

    “选择下一行”共有下面几个选项:

    Sequential:

        按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取。

    Random:

        任意选择。但是在每一次迭代中,将不发生变化。

    Unique:

        唯一的数。当使用该选项时,需要保证准备的数据文件中有足够的数据。比如要做20个虚拟用户,每个用户要进行5次迭代,第一个用户在5次迭代中分别使用数据文件中的数据1~数据5,第二个用户在5次迭代中分别使用数据文件中的数据6~数据10,类推以后20个用户将使用到100个数据。那么必须保证准备的数据文件中有100个以上的数据,否则运行时会出错。

    Same line as 某个参数:

    和前面定义的参数取同行的记录。通常用在有关联性的数据上面。比如当我做登录密码的参数化时,由于它和UserID是有关联的,所以会用到这种选择方式。

    “更新值的时间”共有下面几个选项:

    Each iteration:

    每次迭代更新一个新的值。

    Each occurrence:

    每次出现时该参数时更新一个新的值。

    Once

    不管迭代多少次该参数的值一直保持不变。

    *****注意*****

    1、  参数类型:

    在创建参数的时候,我选择了参数类型为File。参数类型共有9种,现在来简单介绍一下所有的参数类型以及意义。

    1.1、DateTime:

    在需要输入日期/时间的地方,可以用DateTime 类型来替代。其属性设置也很简单,选择一种格式即可。当然也可以定制格式。

    1.2、Group Name:

    很少用到。在实际运行中,LoadRunner使用该虚拟用户所在的Vuser Group 来代替。但是在VuGen 中运行时,Group Name将会是None。

    1.3、Load Generator Name:

    在实际运行中,LoadRunner 使用该虚拟用户所在LoadGenerator 的机器名来代替。

    1.4、Iteration Number:

    在实际运行中,LoadRunner 使用该测试脚本当前循环的次数来代替。

    1.5、Random Number:

    随机数。很简单。在属性设置中可以设置产生随机数的范围。

    1.6、Unique Number:

    唯一的数。在属性设置中可以设置第一个数以及递增的数的大小。注意:使用该参数类型必须注意可以接受的最大数。例如:某个文本框能接受的最大数为99。当使用该参数类型时,设置第一个数为1,递增的数为1,但100 个虚拟用户同时运行时,第100 个虚拟用户输入的将是100,这样脚本运行将会出错。这里说的递增意思是各个用户取第一个值的递增数,每个用户相邻的两次循环之间的差值为1。举例说明:假如起始数为1,递增为5,那么第一个用户第一次循环取值1,第二次循环取值2;第二个用户第一次循环取值为6,第二次为7;依次类推。

    1.7、Vuser ID:

    设置比较简单。在实际运行中,LoadRunner 使用该虚拟用户的ID 来代替,该ID 是由Controller 来控制的。但是在VuGen 中运行时,Vuser ID 将会是 –1。

    1.8、File:

    需要在属性设置中编辑文件,添加内容,也可以从现成的数据库中取数据(就是我用到的那种类型)。

    1.9、User Defined Function:

    从用户开发的dll 文件提取数据。


    有关各种参数类型属性的详细设置这里就不多介绍了,到用到的时候大家可以多看看帮助文档。

    本文来自CSDN博客,转载请标明出:http://blog.csdn.net/windone0109/archive/2009/03/27/4028586.aspx

  • 【转载】关于LoadRunner中参数值的引用

    2011-04-11 15:00:22

    昨天在研究脚本的时候偶然遇到一个问题,今天正好有了点时间,就拿来再研究一下。
    问题是这样的:我想用strcpy函数把一个字符串赋给一个变量,再将这字符串做一个参数化,然后我想看看参数化是否成功,于是我用了lr_message函数把它打印出来。脚本代码很简单,如下所示:
      Action()
    {
        char a[10];
        strcpy(a,"{a}");
        lr_message(a);
        return 0;

    其中,{a}我已经做了参数化,参数值为11。
    运行这个脚本后,发现运行日志里打印出来的a值显示为{a}。
    在尝试了N遍以后,我把lr_message(a);这句代码改成lr_message(lr_eval_string(a));后问题解决,运行日志里打印出了我所期望的值11。
    问题虽然解决了,但我还是很纳闷,为什么在用lr_message的时候不能直接引用参数,而我记得之前在web_url、web_submit_data等函数里都是可以直接引用参数化的值,而从来没有出现过问题。也许是在LoadRunner里,这几个函数对参数值的引用方式不同吧,不知道我这样想是否正确,希望大家批评指正!
    昨天和Zee讨论了一个下午,结论还是没有明确。今天上午继续试验,试验结果表明Zee说的是正确的,不能直接将C语言里的变量直接当作LR变量使用,而需要做一些转换。事实上,执行strcpy(a,"{a}");后,并没有真正将参数值传给a。需要这样写:strcpy(a,lr_eval_string("{a}"));这样就没问题了。

    转载自http://guanfengde.blog.163.com/blog/static/2947162200711654611664/

    不过,问题还没有结束,在tuxedo协议中,用 lrt_strcpy函数则没有这个问题存在,例如:lrt_strcpy(sendBuf1, sendBuf);则可以成功地将sendBuf中的参数值赋值给sendBuf1。目前怀疑是该函数在内部已经进行过转换,但并不肯定,尚待证实。

    再次针对以上问题进行试验,我在lrt_strcpy(sendBuf1, sendBuf);语句的前后各加了一句调试信息:lr_output_message("sendBuf:%s",sendBuf);
    和lr_output_message("sendBuf1:%s",sendBuf1);
    打印出来的结果截然不同,前者的输出显示没有传入参数值,而后者则成功传入参数。这表明确实是lrt_strcpy这个函数在搞鬼。
    至此,这个问题可以圆满结束了!感谢Zee同学的热情解答!^_^

  • 【转载】Loadrunner 测试sql语句性能

    2011-03-02 16:38:42

    本次通过loadrunner录制Sql Server介绍一下如何测试一个sql语句或存储过程的执行性能。

    z{'fj%],v154372

    主要分如下几个步骤完成:

    4G ZP'}P'o9v154372

    第一步、测试准备

    "i!RNDX;VVw}154372

    第二步、配置ODBC数据源51Testing软件测试网T'?Z!_ zrI

    第三步、录制SQL语句在Sql Server查询分析器中的运行过程

    T4Qei EX7R_)v154372

    第四步、优化录制脚本,设置事务51Testing软件测试网/iR Gg+x$aTv1N

    第五步、改变查询数量级查看SQL语句的性能51Testing软件测试网 DP*F!y;{a ^F-o

    第六步、在controller中运行脚本51Testing软件测试网$m&jxFY2fy ^

    转载请注明出处:http://www.51testing.com/?41972

    (|C P8Tvu2Q154372

    下面开始具体的介绍:51Testing软件测试网;SAT#W k-O(Y$a$|$Y

    测试准备阶段我们首先要确认测试数据库服务器:我们可以在本地安装SQL SERVER数据库服务端及客户端,也可以确定一台装好的SQL SERVER服务器。51Testing软件测试网$MNy0[ ~ lfGG4_

    接下来,准备测试数据:对数据库测试时我们要考虑的不是SQL语句是否能够正确执行,而是在某数量级的情况下SQL语句的执行效率及数据库服务的运行情况,所以我们分别准备不同数量级的测试数据,即根据实际的业务情况预估数据库中的记录数,在本次讲解中我们不考虑业务逻辑也不考虑数据表之间的关系,我们只建立一张表,并向此表中加入不同数量级的数据,如分别加入1000条、10000条、50000条、100000条数据查看某SQL语句的执行效率。

    ,e8dr#xC2K&hzl154372

    在查询分析器中运行如下脚本:51Testing软件测试网+G~"W9N6r*gT

    --创建测试数据库

    Y]kid5E vR5fF'V154372

    create database loadrunner_test;51Testing软件测试网V)Z,ek8o(Kp

    use loadrunner_test51Testing软件测试网l/BB5mx1c+m

    --创建测试数据表

    lG-Y)@9y[+@/U0|*X154372

    create table test_table

    w4n:sL/R%s6u"@154372

    (username varchar(50),sex int,age int,address varchar(100),post int)

    }(_;vR\154372

    --通过一段程序插入不同数量级的记录,具体的语法在这里就不多说了

    i)J l-q1L#G}4A154372

    declare  @i  int  

    X%Ejw|)j:QVP154372

     set  @i=0  

    %U+b;d0L7w,n\!q154372

     while  @i<1000   //循环1000次,可以根据测试数据情况改变插入条数51Testing软件测试网x4N8}$lRm*y{

     begin

    s f(f$LY w SJa*p154372

         BEGIN TRAN T151Testing软件测试网 lg8p0YH"V

         insert into test_table (username,sex,age,address,post) values ('户瑞海'+cast(@i as varchar),@i-1,@i+1,'北京市和平里'+cast(@i as varchar)+'',123456); 51Testing软件测试网+imX],a&I

         IF @@ERROR <> 0

    T,LU u`3J'h+~154372

            begin

    7o3Ll-i!}S154372

              rollback;

    D4f E's2Z'a q}@_154372

              select @@error

    YPD#Kt)Ug0}[`4X154372

            end51Testing软件测试网 } g(t'aS7r9S.JP S

         else51Testing软件测试网D~._ h6K

            begin51Testing软件测试网ft7~X;G

              commit;51Testing软件测试网v^.s4Z1v.@3^s

              set  @i  =  @i+1

    6y\4b*]t)j h'\U154372

            end    

    0h;i&P PU'h+a154372

     end

    ?0z lWUIT6X Z154372

    转载请注明出处:http://www.51testing.com/?4197251Testing软件测试网\W#r0q B,eP/N

    好了,执行完上述语句后,建立的数据表中已经有1000条记录了,下面进行第二步的操作,配置ODBC数据源,为了能让loadrunner能够通过ODBC协议连接到我们建立的SQL SERVER数据路,我们需要在本机上建立ODBC数据源,建立方法如下:51Testing软件测试网a^_0_"H {7V

    控制面板性能和维护管理工具数据源(ODBC--添加,在列表中选择SQL SERVER点击完成,根据向导输入数据源名称,链接的服务器,下一步,输入链接数据库的用户名和密码,更改链接的数据库,完成ODBC的配置,如果配置正确的话,在最后一步点击“测试数据源”,会弹出测试成功的提示。

    $L2ZOg5jo t154372

    配置好ODBC数据源后就要录制SQL语句在查询分析器中的执行过程了:

    BJ*f|;ea!k/I154372

    1、 打开loadrunner,选择ODBC协议51Testing软件测试网Kd6Y S)eR;wn

    2、 start recording中的application type选择win32 applicationprogram to record中录入SQL SERVER查询分析器的路径“..\安装目录\isqlw.exe51Testing软件测试网Z c|*~G$E7@6]0d

    3、 开始录制,首先通过查询分析器登录SQL SERVER,在打开的查询分析器窗口中输入要测试的SQL语句,如“select * from test_table;51Testing软件测试网'A"wJ4VA w)d;l

    4、 在查询分析器中执行该语句,执行完成后,结束录制

    w.f{ q*h8i p154372

    好了,现在就可以看到loadrunner生成的脚本了(由于脚本过长,在这里就不粘贴了,有需要的朋友可以加我QQ,我把脚本发给你们),通过这些语句,我们可以看出,登录数据库的过程、执行SQL语句的过程

    | wPr-Lu154372

    转载请注明出处:http://www.51testing.com/?41972

    #W YloZ4{ b[N$@154372

    接下来,我们来优化脚本,我们分别为数据库登录部分和执行SQL语句的部分加一个事物,在增加一个double的变量获取事务执行时间,简单内容如下:51Testing软件测试网 ^@*qv.y7K.od/Z)a

    Action()

    D,m:mw;|h` d"vt(B154372

    { double trans_time; //定义一个double型变量用来保存事务执行时间

    jO,S_&c#L3m g!Y`.XC154372

      lr_start_transaction("sqserver_login"); //设置登录事务的开始51Testing软件测试网8J%@MP+`&Gzr

    lrd_init(&InitInfo, DBTypeVersion);  //初始化链接(下面的都是loadrunner生成的脚本了,大家可以通过帮助查到每个函数的意思)51Testing软件测试网$wT/s0U+o#}X

          lrd_open_context(&Ctx1, LRD_DBTYPE_ODBC, 0, 0, 0);51Testing软件测试网3m,o*UpFW/i MR

          lrd_db_option(Ctx1, OT_ODBC_OV_ODBC3, 0, 0);

    P3Ci$m\H`154372

          lrd_alloc_connection(&Con1, LRD_DBTYPE_ODBC, Ctx1, 0 /*Unused*/, 0);

    9ms e1y-yb-}!K*H154372

       ………………51Testing软件测试网.p#Q8u S&_

    trans_time=lr_get_transaction_duration( "sqserver_login" ); //获得登录数据库的时间

    [s&v-rN X`%dw3U154372

       lr_output_message("sqserver_login事务耗时%f", trans_time); //输出该时间

    1]W%Hw3}(m7NZh154372

       lr_end_transaction("sqserver_login", LR_AUTO); //结束登录事务

    5vlHb%v9aC,O154372

    lr_start_transaction("start_select");//开始查询事务

    2sH0WKD9G154372

    lrd_cancel(0, Csr2, 0 /*Unused*/, 0);

    x QZ%Hn K/w154372

    lrd_stmt(Csr2, "select * from test_table;\r\n", -1, 1, 0 /*None*/, 0);//此句为执行的SQL51Testing软件测试网~]%C$Q#df#IW

    lrd_bind_cols(Csr2, BCInfo_D42, 0);51Testing软件测试网/| e6[6l p%Gp?*@

    lrd_fetch(Csr2, -10, 1, 0, PrintRow24, 0);51Testing软件测试网S{ `5H;B5Z

    ……………..

    f-k ]s(X]7K/X ]154372

    trans_time=lr_get_transaction_duration( "start_select" ); //获得该SQL的执行时间

    o Qpk p\Krc154372

    lr_output_message("start_select事务耗时%f", trans_time); //输出该时间

    B f$F1lBx ~;nT i154372

    lr_end_transaction("start_select", LR_AUTO); //结束查询事务51Testing软件测试网&_5S\:Ys#v!\

    优化后,在执行上述脚本后,就可以得到登录到数据库的时间及运行select * from test_table这条语句的时间了,当然我们也可以根据实际情况对该条语句进行参数化,可以测试多条语句的执行时间,也可以将该语句改为调用存储过程的语句来测试存储过程的运行时间。51Testing软件测试网1Ii6\2X+YVt YO&`

    接下来把该脚本在controller中运行,设置虚拟用户数,设置集合点,这些操作我就不说了,但是值得注意的是,没有Mercury授权的SQL SERVER用户license,在运行该脚本时回报错,提示“You do not have a license for this Vuser type.51Testing软件测试网8lE%r |KCUt

    Please contact Mercury Interactive to renew your license.”我们公司穷啊买不起loadrunner,所以我也无法继续试验,希望有license朋友们监控一下运行结果!51Testing软件测试网dj.TE:g+wv{

    最起码在VUGen中运行该脚本我们可以得到任意一个SQL语句及存储过程的执行时间,如果我们测试的B/S结构的程序,我们也可以通过HTML协议录制的脚本在CONTROLLER中监控SQL SERVER服务器的性能情况,这样两方面结合起来就可以对数据库性能做一个完整的监控了。

    8g"C8U1[,F X N*K154372

    本人对LOADRUNNER也是在摸索中,如果文章有写的不对,或理解错误的地方请指出,不甚感激

    J_,U4y#@$a154372

    转载请注明出处:http://www.51testing.com/?41972

  • 转载:LoadRunner web_add_cookie函数

    2011-01-10 13:57:30

    1、为什么要使用cookie模拟

    从日常项目测试过程中的问题说起。比如要进行论坛中的文件下载功能的测试。我们都知道只有登录用户才能进行下载操作,这样我们的测试过程可能就变成了先登录系统,然后再进行下载操作。在使用loadrunner设计脚本时就要先在初始化部分写登录脚本,然后再action中写下载操作,当单个用户运行时我们可能看不到什么问题。当用户并发量较多时,问题马上暴露出来了。大部分用户可能很长时间也没有下载成功,大量的初始化登录操作已经给系统造成了很大的压力,而在日常访问中,这种大量短时间登录的压力是不容易出现的。这样的测试结果可能无法达到我们的测试目标。

    的确,不能处理较大的登录吞吐可能已经是系统的瓶颈了,我们可以通过这种全流程的测试方式发现登录的问题。但是后续的测试我们可能就无法进行下去了。当项目组解决了登录的吞吐问题时,可能项目工期已经十分紧张了,再进行重要的下载功能测试可能已经太晚了。

    这种情况在测试过程中经常会出现,我们要如何绕过登录尽早的进行后续的下载操作呢?如果网站使用了cookie的机制,则我们可以尝试使用下面的方法。

    2、怎么使用loadrunner模拟

        Loadrunner的web函数中提供了几个关于cookie的函数。
        web_remove_cookie()
        web_add_cookie()
        web_cleanup_cookies();
        web_reg_add_cookie();

    这里我们为了模拟cookie绕过登录使用web_add_cookie();

    首先获取网站留在客户端上的cookie都存储了什么。通常主要内容包括名字,值,过期时间,作用域和路径,分为会话cookie和文件cookie。会话cookie存储在内存里,关闭浏览器后就没有了,这种很难模拟。文件cookie是将cookie信息写到硬盘上,关闭浏览器再次打开后仍可以使用。

    我们要模拟的就是存储在硬盘文件里的cookie。我们观察cookie文件的内容,如果使用ie的话,在“C:\Documents and Settings\用户名\LocalSettings\Temporary Internet Files”中的用户名@域名的文件里,cookie存储都是加密的,所以我们直接看并看不出什么特别的东西,也搞不清楚具体是什么。这时我们借助IE webdeveloper 工具获取cookie值如下所示:cdb_cookietime=2592000;cdb_smile=1D1; cdb_sid=71WKOd; cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s; cdb_visitedfid=20; cdb_onlineusernum=28

    获得了cookie信息后,我们进行编辑loadrunner脚本。将cookie每个分号分行,使用UltraEdit进行列模式操作,在每句后面加上域名。(域名在webdeveloper的Attributes下也可以找到domain对应值),修改完成后如下:
    web_add_cookie("cdb_cookietime=2592000;domain=172.16.1.3");
    web_add_cookie("cdb_smile=1D1;domain=172.16.1.3");
    web_add_cookie("cdb_sid=71WKOd;domain=172.16.1.3");
    web_add_cookie("cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s;domain=172.16.1.3");
    web_add_cookie("cdb_visitedfid=20;domain=172.16.1.3");
    web_add_cookie("cdb_onlineusernum=28;domain=172.16.1.3");

    把这些值放在要访问的url的web函数之前,你就可以绕过登录进行后续操作了。
    如:
    Action()
    {

    web_add_cookie("cdb_cookietime=2592000;DOMAIN=172.16.1.3");
    web_add_cookie("cdb_smile=1D1;DOMAIN=172.16.1.3");
    web_add_cookie("cdb_oldtopics=D280D39523D39418D;DOMAIN=172.16.1.3");
    web_add_cookie("cdb_sid=eSuWgw;DOMAIN=172.16.1.3");
    web_add_cookie("cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s;DOMAIN=172.16.1.3");
    web_add_cookie("cdb_visitedfid=20;DOMAIN=172.16.1.3");

            web_url("cookies",
            "URL=http://172.16.1.3:8080/bbs/index.php",
            "referer=http://172.16.1.3/newiweb/index/dealIndex.do?action=Index",
            "Mode=HTML",
            "RecContentType=text/html",
            LAST
            );

            return 0;
    }

        最后注明一下:loadrunner的web录制功能是自动的增加cookie的,只要在cookie不过期的情况下,我们不需要手工的增加cookie,当出现录制不上或录制的值发生变化时可以手工进行添加。

        在loadrunner场景设计使用其他负载机器时,同样可以使用你本机的这个cookie值进行,不会因为客户端机器发生变化而产生影响。

  • Loadrunner脚本回放 场景运行过程中常见错误分析

    2011-01-07 16:22:59

    引用自http://www.bybdqn.com/open_xue.asp?Newsid=1541

    问题一:Loadrunner超时错误问题描述

      Loadrunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同。

      问题现象Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)。

      错误分析对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner中修改),客户端发送一个请求到服务器端,如果超过120秒服务器端还没有返回结果,则出现超时错误。

      解决办法首先在运行环境中对超时进行设置,默认的超时时间可以设置长一些,再设置多次迭代运行,如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功。

      问题现象Error -27498: Timed out while processing URL=http://172.18.20.70:7001/workflow/bjtel/leasedline/ querystat/ subOrderQuery.do

      错误分析

      这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。

      如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置。

      解决办法例如上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。分析一下服务器,最好对其性能进行优化。

      如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。

      备注:增加一下运行时的超时设置,在“Run-Time Settings”>“Internet Protocol:Preferences”中,单击“options”,增加“HTTP-request connect timeout”或者“HTTP-request receive”的值。

    问题二:LoadRunner脚本中出现乱码问题现象某个链接或者图片名称为中文乱码,脚本运行无法通过。

      错误分析

      脚本录制可能采用的是URL-based script方式,如果程序定义的字符集合采用的是国际标准,脚本就会出现乱码现象。

      解决办法重新录制脚本,在录制脚本前,打开录制选项配置对话框进行设置,在“Recording Options”的“Advanced”选项里先将“Surport Charset”选中,然后选中支持“UTF-8”的选项。

    问题三:LoadRunner HTTP(404/500)服务器状态代码问题现象HTTP404 Not Found服务器没有找到与请求URI相符的资源,但还可以继续运行直到结束。

      错误分析

      此处与请求URI相符的资源在录制脚本时已经被提交过一次,回放时不可再重复提交同样的资源,而需要更改提交资源的内容,每次回放一次脚本都要改变提交的数据,保证模拟实际环境,造成一定的负载压力。

      解决办法在出现错误的位置进行脚本关联,在必要时插入相应的函数。

      错误现象HTTP 500 Internal Server Error服务器内部错误,脚本运行停止。

      错误分析

      服务器碰到了意外情况,使其无法继续回应请求。

      解决办法出现此错误是致命的,说明问题很严重,需要从问题的出现位置进行检查,此时需要此程序的开发人员配合来解决,而且产生的原因根据实际情况来定,测试人员无法单独解决问题,而且应该尽快解决,以便于后面的测试。

    问题四:LoadRunner请求无法找到错误现象Error -27979: Requested form. not found [MsgId: MERR-27979]

      web_submit_form. highest severity level was "ERROR",0 body bytes, 0 header bytes [MsgId: MMSG-27178]"

      这时在tree view中看不到此组件的相关URL。

      错误分析

      所选择的录制脚本模式不正确,通常情况下,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用HTTPS安全协议,这时则使用“URL-based script”模式进行录制。

      解决办法打开录制选项配置对话框进行设置,在“Recording Options”的“Internet Protocol”选项里的“Recording”中选择“Recording Level”为“HTML-based script”,单击“HTML Advanced”,选择“Script. Type”为“A script. containing explicit”。然后再选择使用“URL-based script”模式来录制脚本。

    问题五:LoadRunner不执行检查方法错误现象在脚本中插入函数Web_find,在脚本中设置文本以及图像的检查点,但是在回放过程中并没有对设置的检查点进行检查,即Web_find失效。

      错误分析

      由于检查功能会消耗一定的资源,因此LoadRunner默认关闭了对文本以及图像的检查,所以在设置检查点后,需要开启检查功能。

      解决办法打开运行环境设置对话框进行设置,在“Run-time Settings”的“Internet Protocol”选项里的“Perference”中勾选“Check”下的“Enable Image and text check”选项。

      =======================================================================

      在使用LoadRunner进行WEB脚本录制的时候,很多人不清楚URL-based 方式和 HTML-based方式的差别,

      以及何种情况下使用何种录制方式,这里给出一个简单的判断方法。

      HTML-based 方式

      HTML-based 方式对每个页面录制形成一条语句,对LoadRunner来说,在该模式下,访问一个页面,

      首先会与服务器之间建立一个连接获取页面的内容,然后从页面中分解得到其他的元素(component),

      然后建立几个连接分别获取相应的元素。

      URL-based 方式

      URL-based 方式将每条客户端发出的请求录制成一条语句,对LoadRunner来说,在该模式下,一条语句只建立一个到服务器的连接,

      LoadRunner提供了web_concurrent_start和web_concurrent_end函数模拟HTML-based的工作方式。

      如何决定选择何种录制方式?

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

    测试Web的常见问题

    • 网络带宽问题。

    对Web进行压力测试时,通常百兆网络是不够的,当网络带宽不够的时候server端没有足够压力。用LoadRunner所在的Windows的性能管理器看一下网络利用率就知道了。

    • Vuser脚本的检查。

    虽然Loadrunner提供了方便的脚本录制功能,但由于录制时可能出现的操作偏差,也应手工检查生成的Vuser脚本。去除某些与压力测试无关的东西。否则可能会出现Loadrunner测试结果有误或压力上不去的情况(比如vuser访问一些不存在的资源)。

    • Runtime setting。

    在创建Loadrunner scenario时,每台机器的vuser的runtime setting都应该分别设置并检查,不能只对第一个vuser的runtime setting进行设置。通常你会关掉think time,以便能用较少的机器达到较大的压力。另外,如果返回页面里包含了一些访问其它资源的链接比如图片服务器,这时应关掉 download non-html resources。

    • 没有检查返回页面。

    当server端出错时应用程序有可能返回错误信息,但对HTTP来讲仍是成功的响应,返回码为200 O.K. 这样在Loadrunner就被记为成功的transaction。于是,server端出错越多,Loadrunner测出的性能越好。解决办法:开启并检查应用的错误日志;或者启用Loadrunner的返回内容检查功能。

    • 当心Loadrunner所在机器的磁盘空间。

    缺省情况下Loadrunner会把运行结果的详细信息放在C盘的Documment and Settings的用户目录下,当大压力长时间运行或有大量出错时,Loadrunner会生成大量的数据到该目录下。当磁盘空间满了后,机器的响应将变得很慢。

  • LoadRunner的并发concurrent

    2010-12-21 16:48:01

    web_concurrent_start和web_concurrent_end函数间的脚本是URL并发执行。(脚本先顺序编译,最后一起发送)
  • LoadRunner常用功能

    2010-12-13 10:01:33

    1、事务

    事务就是一个计时标识。通常事务时间所反映的是一个操作过程的响应时间。

    使用事务的原因:

    a.事务是LoadRunner度量系统性能指标的唯一手段;(没有事务则没有办法衡量系统的响应时间,也许有人说LoadRunner可以通过编程来计时得到,不错如果你编程能力够强是能够实现的,但肯定不如LoadRunner中的事务用的简单而且方便)

    b.事务能够用于度量高风险业务流程的性能指标;

    c.事务能够度量在一组操作中每一步的性能指标;

    d.通过事务计时实现了不同压力负载下的性能指标对比;

    e.通过事务计时可以帮助定位性能瓶颈;

    lr_start_transaction

    lr_end_transaction

    2、集合点(常用于并发)

    集合点(Rendezvous)就是一个并发访问的点。当在系统上模拟大量的用户负载,需要同步各个Vuser以便在同一时刻执行任务。通过创建集合点,可以确保多个Vuser同时执行操作。

    只能在Action部分。一般是配合事务适用。

    lr_rendezvous

    3、检查点(文本和图像)

    对于查询类的脚本,通过添加检查点来保证在测试时结果的正确性(是否返回正确网页,页面内容是否齐全)。

    4、虚拟IP

    开始-〉程序-loadrunner-tools-ip wizard

    模拟多个用户多台PC操作的情况

    5、参数化

    避免重复使用数据,可以动态更换数据。

  • LR8.1(中文版)破解方法大公布

    2010-12-11 20:12:21

    http://bbs.51testing.com/thread-47514-1-1.html

    LR8.1版本已经将7.8和8.0中通用的license封了,因此目前无法使用LR8.1版本,包括该版本的中文补丁。

    破解思路:由于软件的加密程序和运行的主程序是分开的,因此可以使用7.8的加密程序覆盖8.1中的加密程序,这样老的7.8和8.0中通用的license就可以使用了。

    操作步骤:
    1、用官方版的LR8.1安装,也可以安装中文补丁。安装包可以到51testing的ftp上下载
    地址是:
    LR8.1安装文件:
    http://www.17testing.com/download/LR_8.1.iso

    LR8.1中文补丁
    http://www.17testing.com/download/LR_8.1ChinesePack.iso

    2、
    将LR7.8或者LR8.0(安装包或者安装后目录中的都可以)中的
    lm70.dll
    mlr5lprg.dll
    这两个文件复制并粘贴到LR8.1安装目录下的bin文件夹下,一般是C:\E:\Program Files\Mercury\LoadRunner\bin;

    lm70.dll 文件的描述是 with conbined license support,是一个license的支持文件;
    mlr5lprg.dll应该是一个保存license的文件。
    大家可以试一试,其实不要替换mlr5lprg.dll也是可以的,只替换lm70.dll文件,老的license一样能注册通过,但是软件的试用的license还在。

    3、运行LR8.1,打开license管理器,点击添加new license,将老license复制进去,OK,验证通过!
    7.8、8.0通用的license有:
    golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

    此方法适用于英文原版8.1和中文版8.1。

  • LoadRunner录制脚本不弹出IE浏览器

    2010-12-11 20:07:13

    设置IE为默认浏览器。启动IE,进入Internet选项,切到高级,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可。通常安装Firfox等浏览器后,都会勾选这个选项,导致不能正常录制。

Open Toolbar