一万年太久,只争朝夕。

发布新日志

  • loadrunner函数译解5

    2008-08-26 09:17:48

    写socket协议脚本时会用到的第一个函数
    lrs_create_socket

    建立,初始化socket连接

    int lrs_create_socket ( char *s_desc, char *type, [ char* LocalHost,] [char* peer,] [char *backlog,] LrsLastArg );

    s_desc  一个连接描述符,给这次连接起个名。
    type  连接的socket类型,给出这是一个什么类型的连接(tcp,udp两种)。
    LocalHost  与socket绑定的本地主机名地址,端口。 "LocalHost= host_name/port_number" (可选的) 
    peer  远程主机名(地址),端口 "RemoteHost=host_name/port_number" (可选的)  给出要和谁建立连接,提供服务的端口号。
    backlog 连接时队列最大长度 "Backlog=number" (可选的) 
    LrsLastArg  参数结束标记.  标记这个函数的参数结束了。必须的。

    例子:
    int rc;

    rc=lrs_create_socket("socket1", "TCP", "RemoteHost=199.203.77.246:21", LrsLastArg);
    返回值rc=0时表示成功。成功只有一种0,失败有很多种,需要时自己查一下吧。
    实际应用中应判断返回值并给出提示。
    if (rc==0)

           lr_output_message("Socket 1 was successfully created ");

    else

           lr_output_message("An error occurred while create the socket, Error Code: %d", rc);


    与lrs_create_socket相对应的函数是
    lrs_close_socket

    关闭打开的socket连接

    int lrs_close_socket ( char *s_desc );

     s_desc  建立连接时给的名. 

    没什么好说的,打开了记得再关上,成对书写。

  • loadrunner函数译解4

    2008-08-21 11:16:51

    写脚本时常用的函数:根据给定的参数返回上一次 HTTP 请求的相应信息。很简单就不译不解了,呵呵。
    web_get_int_property 

    Returns specific information about the previous HTTP request.

    int web_get_int_property (const int HttpInfoType); 

    The meaning of the return value depends on the HttpInfoType argument. HttpInfoType can be any of the following options.
    The first constant in each pair (HTTP_*) is for C, the second (object.HTTP_*) is for object oriented languages.

    HTTP_INFO_RETURN_CODE or object.HTTP_INFO_RETURN_CODE

    The return code in HTTP response header.

    HTTP_INFO_DOWNLOAD_SIZE or object.HTTP_INFO_DOWNLOAD_SIZE

    The size (in bytes) of the last download, including the header, body, and communications overhead (for example, NTLM negotiation).

    HTTP_INFO_DOWNLOAD_TIME or object.HTTP_INFO_DOWNLOAD_TIME

    The time in (milliseconds) of the last download.

    HTTP_INFO_TOTAL_REQUEST_STAT or object.HTTP_INFO_TOTAL_REQUEST_STAT

    Returns the accumulated size of all headers and bodies since the first time web_get_int_property
     was issued with HTTP_INFO_TOTAL_REQUEST_STAT.

    HTTP_INFO_TOTAL_RESPONSE_STAT or object.HTTP_INFO_TOTAL_RESPONSE_STAT

    Returns the accumulated size, including header and body, of all responses since the first time
    web_get_int_property was issued with HTTP_INFO_TOTAL_RESPONSE_STAT

    This function is supported for all Web scrīpts, and for WAP scrīpts running in HTTP mode only.
    It is not supported for WAP scrīpts running in Wireless Session Protocol (WSP) replay mode.

    The following example uses the web_get_int_property function to check if the scrīpt successfully accessed the my_home home page.

    一个简单的例子:
    {

    int HttpRetCode;

    web_url("my_home",

           "URL=http://my_home",

           "TargetFrame=_TOP",

           LAST);

    HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);

    if (HttpRetCode == 200)

           lr_log_message("The scrīpt successfully accessed the My_home home page");

           else

           lr_log_message("The scrīpt failed to access the My_home home page ");

    }

    Output:

    HTTP_INFO_RETURN_CODE = 200

    HTTP_INFO_DOWNLOAD_SIZE = 53685

    HTTP_INFO_DOWNLOAD_TIME = 2204

     

  • 工作很忙,在做金融的项目,有很多经验、感触,我会持续更新。

    2008-08-13 14:48:33

    四个月没来我的饭桌了,呵呵,没了佳肴,只有灰尘了。
    换了一份工作,做金融系统的非功能测试,比较忙,还不可以上外网,长期没有更新。
    我要跳跳跳。。。。。。。。。
    有空我会常来和大家交流,丰富我们的知识,争强职业技能,快乐着多赚些银两,哈哈。

  • lr脚本,分析日志文件计算平均交易响应时间

    2008-08-13 14:22:12

    工作需要写的一段脚本,时间仓促,没有c环境就写到lr 里了,不是很严谨,但能用。改一下有通用性的。

    Action(){

      char line[1000];
      long file_stream;
      char *filename = "c:\\hvpsrcv.log.200806271451";
      char *cpoin = NULL;
      int sumline = 1;
      int sumtime = 0;
      int sumtime2 = 0;
      int rc = 0;

      if ((file_stream = fopen(filename, "r")) == NULL ) {

              lr_error_message("Cannot open %s", filename);
              return -1;
         }

      while (!feof(file_stream)){

       if (fgets(line, 1000, file_stream) == NULL)
        lr_output_message("fgets error" );
       else{
      
                lr_output_message( "The first line is %s", line);
       cpoin = (char *) strstr(line, "time:");
       if (cpoin == NULL) {
        continue;
       }
       else {
       
       rc = lr_save_searched_string(line, strlen(line), 0, "time:", 0, 3, "timenum");
                lr_output_message("this time is %d ",atoi(lr_eval_string("{timenum}")));
       sumtime2 = atoi(lr_eval_string("{timenum}"));
       sumtime = sumtime +sumtime2;
       sumline++;
       }
       }
      }

      if (fclose(file_stream))
              lr_error_message("Error:file name is : %s", filename);

      lr_output_message("sum line is %d", sumline);
      lr_output_message("log file name is : %s, average time is %d", filename, sumtime/sumline );
      return 0;
    }

    日志片段格式如下:

    0604213227|035190000000000|A:hvpsfb00.ec:243:3:pctMessStr=[{1:00054101000000031946                    2008060421335910020080527}{2:1000000             }{3::30A:20080527:32A:RMB000000652284246:011:402651000000:52A:402651001002:CC4:402651001002:50C:57273189437113378135405615353921:50A:客户六                                                      :50B:中华人民共和国:012:105451000016:58A:105453061785:CC5:105453061785:59C:05320438740694728691783812162207:59A:客户一                                                      :59B:中华人民共和国:CEF:61:0BC:00010191:010:6510:0B9:5840:72A:自动生成的测试实例100}]:
    0604213227|035190000000000|svc:  time: 80
    0604213227|035240000000000|A:hvpsfb00.ec:243:3:pctMessStr=[{1:00054101000000031947                    2008060421340010020080527}{2:1000000             }{3::30A:20080527:32A:RMB004146789947651:011:309551001014:52A:309551008193:CC4:309551008193:50C:77710828225705803366043141779473:50A:客户八                                                      :50B:中华人民共和国:012:105451000016:58A:105475401628:CC5:105475401628:59C:12745397428287155903412368688759:59A:客户二                                                      :59B:中华人民共和国:CEF:11:0BC:00010192:010:5840:0B9:5840:72A:自动生成的测试实例100}]:
    0604213227|035240000000000|svc:  time: 80
    0604213228|035190000000000|A:hvpsfb00.ec:243:3:pctMessStr=[{1:00054101000000031948                    2008060421340010020080527}{2:1000000             }{3::30A:20080527:32A:RMB000003037815503:011:201331000018:52A:201331000018:CC4:201331000018:50C:85335875885387240606791508172915:50A:客户九                                                      :50B:中华人民共和国:012:105451000016:58A:105468700020:CC5:105468700020:59C:32260135216869791142140825881291:59A:客户四                                                      :59B:中华人民共和国:CEF:50:0BC:00010193:010:1000:0B9:5840:72A:自动生成的测试实例100}]:
    0604213228|035190000000000|svc:  time: 140

  • lr脚本开发_模拟用户随机浏览

    2008-04-23 16:36:40

    Action()
    {
    int i,randVal;
    char addres[50],htm[10];

     web_reg_save_param("WCSParam_Text1",
      "LB=<a href=\"",
      "RB=>",
      "Ord=ALL",
      "RelFrameId=1",
      "Search=Body",
      "IgnoreRedirections=Yes",
      LAST);
     web_url("www.51testing.com",
      "URL=http://www.51testing.com/",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t1.inf",
      "Mode=HTML",
      EXTRARES,
      "URL=/images/new/com-denglu.gif", ENDITEM,
      "URL=/images/new/mysearch.gif", ENDITEM,
      "URL=/images/new/com-susuo.gif", ENDITEM,
      "URL=/images/new/searchL.gif", ENDITEM,
      "URL=/images/new/list_icon.gif", ENDITEM,
      "URL=/images/new/menu_hbg_l.gif", ENDITEM,
      "URL=/images/new/menu_hbg_r.gif", ENDITEM,
      "URL=http://www.51testing.net/index.swf", ENDITEM,
      "URL=/images/new/hotspace_bg.gif", ENDITEM,
      "URL=/images/new/com-shang-gengxin1.gif", ENDITEM,
      "URL=/images/new/com-shang-gengxin.gif", ENDITEM,
      "URL=/images/new/813diancom.swf", ENDITEM,
      "URL=/images/new/menu_hbg.gif", ENDITEM,
      "URL=/images/new/com-luntan.gif", ENDITEM,
      "URL=/images/new/com-boke.gif", ENDITEM,
      "URL=/images/new/com-jingxuan.gif", ENDITEM,
      "URL=http://com.zoosnet.net/js/JS_swf.js", ENDITEM,
      "URL=http://com.zoosnet.net/js/COM.swf", ENDITEM,
      "URL=http://com.zoosnet.net/LR/closeimg/7.gif", ENDITEM,
      "URL=http://www.51testing.net/gif/zaixian.gif", ENDITEM,
      LAST);

     web_custom_request("JS_Float1.aspx",
      "URL=http://com.zoosnet.net/js/JS_Float1.aspx",
      "Method=POST",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=http://com.zoosnet.net/js/COM.swf",
      "Snapshot=t2.inf",
      "Mode=HTML",
      "Body=%5FtimeoutID=1&lng=cn&cid=6334324364444512501290&sid=6334454461891962508879&id=24243265&e=&r=&p=http%253A%2F%2Fwww%2E51testing%2Ecom%2F",
      EXTRARES,
      "URL=http://www.51testing.com/favicon.ico", ENDITEM,
      LAST);

     web_custom_request("newsid.aspx",
      "URL=http://com.zoosnet.net/ls/newsid.aspx",
      "Method=POST",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=http://com.zoosnet.net/js/COM.swf",
      "Snapshot=t3.inf",
      "Mode=HTML",
      "Body=%5FtimeoutID=2&z=%2D8&ip2=%E7%94%B5%E4%BF%A1&ip1=%E5%8C%97%E4%BA%AC%E5%B8%82&e=&k=6334324364444512501290&lng=cn&c=32&vp=25&vc=9&fl=1208927713000&ft=1207618914000&s=1024%2A768&nk=6334454461891962508879&r=&p=http%253A%2F%2Fwww%2E51testing%2Ecom%2F&id=COM24243265",
      LAST);

     for (i = 1; i <= 5; i++)
       {
      randVal = (rand() % atoi(lr_eval_string("{WCSParam_Text1_count}")));
      sprintf( addres,"{WCSParam_Text1_%d}",randVal);
      lr_save_string( lr_eval_string(addres),"addres");
      sprintf(htm,"htm_%d",i);
      web_url("htm","URL={addres}",LAST);
      lr_think_time(3);
      web_url("www.51testing.com_2",
       "URL=http://www.51testing.com/",
       LAST);
      lr_think_time(3);
      }
     return 0;
    }
    原创,转载请注明原始链接.

  • 关于响应时间

    2008-04-22 11:34:52

        由于视角不同,对响应时间有不用的定义.
        从用户的角度,响应时间是发出请求到有显示出回应的时间.这种回应是用技巧的,比如对图片的处理,开始看到的是个大致的图片,模糊的,会逐渐清晰。这种响应时间通常是受主观影响的。国外对一个商业网站响应时间的定义是2/5/10秒,认为:2秒给人感觉快,5秒给人感觉还行,10秒是用户接受的上限,再长用户就去访问其他的网站了。但不是所用的应用都需要非常快速的响应时,比如目前纳税申报系统,由于多种因素的影响申报后提交数据到数据中心可能需几分钟或十几分钟,因为每个月只申报一次,这也是可以承受的。针对不同的应用应该有不同的响应时间衡量标准。这些可以在做性能测试分析,定义响应时间需求时做参考。
        从系统的角度是:发出请求到客户端接收到最后一个字节数据所用时间。这个时间可以细分为:网络传输时间,应用延迟时间.应用延迟时间还可以细分为:数据库系统延迟时间,应用服务器延迟等时间等等,根据系统架构的不同而有所变化。知道了响应时间的组成再借助一些工具就可以帮助我们查找和响应时间相关的系统瓶颈和进行性能调优.
       由上可知响应时间受多种因素(硬件,架构,带宽,软件本身....)的影响,在定义性能需求中确定响应时间时,应以实际使用环境,业务需求,用户需求等多种因素综合分析,制定出适合的响应时间。

  • loadrunner函数译解3

    2008-04-21 15:41:15

       今天介绍的函数在采用windows sockets协议方式录制时常用,用来实现设置检查点,关联。它的作用是在从服务器返回的数据缓冲区中查找满足条件的值,并存储在指定的变量里。

      int lrs_save_searched_string (char* s_desc, char* buf_desc, char* param_name,
    char* left_boundary, char* right_boundary, int ordinal, int offset,
    int param_len );

    s_desc:          socket连接的名称
    buf_desc:        缓冲区名称
    param_name:     变量名存储查找到的值
    left_boundary    左边界
    right_boundary   右边界
    ordinal          存储查找到的第几个值
    offset           偏移量,相对于左边界的偏移量
    param_len        提取数据的长度,没有右边界必需设置。

    例子:

    data.ws 中包含的数据如下: buf1:

           "\x00\x01\x85\x80\x00\x01\x00\x01\x00\x00\x00\x00\x07"

           "Mercury"

           "\x02"

           "co"

           "\x02"

           "il"

           "\x00\x00\x01\x00\x01\xc0"

    lrs_save_searched_string ("socket0", "buf1", "correlation", "LB/BIN=\\x00{Param1}", "RB/BIN=\\x02", 2, 3, -1);

    要存储的值是,第 2 次出现 ,相对于左边界偏移3位(字节),在 \x00\x01 之后. 为\x00\x00\x00\x07Mercury

    左边界\x00\x01共出现5次,第二次是:

    "\x00\x01\x85\x80\x00\x01".

    偏移3位的边界是:

    "\x00\x01\x85\x80\x00\x01\x00\x01\x00".

     

  • loadRunner中调用.DLL文件

    2008-04-08 14:27:17

         在实际工作中经常需要调用系统提供的一些功能或是自己编写的.DLL文件中的方法,这时就会用到loadRunner提供的lr_load_dll()函数,它用来加载windows下的.DLL文件,和unix下的(shared object)共享对象。加载时需要提供完整路径或文件所在位置已经写入环境变量中。返回0表示加载成功。

    下面是个小例子,加载user32.dll文件,调用其中提供的messageboxa方法。

    vuser_init()
    {
        int rc;

        lr_load_dll("user32.dll");

        if( rc!=0 ){
             lr_error_message("lr_load_dll of user32.dll failed.");
             lr_abort();
        }else{
             MessageBoxA(NULL, "This is the message body", "message_caption", 0);    
        }

        return 0;
    }

  • 用LoadRrunner监控apache性能

    2008-04-02 18:04:04

    环境linux v2.6.18,apache v2.2.3
    步骤:
    vi httpd.conf
    找到 #ExtendedStatus on 去掉注释符号#
    #<Location /server-status>
    #SetHandler server-status
    #Order deny,allow
    #Deny from all
    #Allow from .example.com
    #</Location>
    改成
    <Location /server-status>
    SetHandler server-status
    #Order deny,allow
    #Deny from all
    Allow from all
    </Location>
    在IE中检验一下:输入
    http://location:port/server-stauts
    之后有apache的状态信息显示
    这样就可以在loadrunner-controller中监控apache了
    说明:
    测试结束后请恢复原设置或禁用server-status命令:
    注释掉#ExtendedStatus on 语句。

  • loadrunner函数每日译解2

    2008-03-20 17:25:07

    lr_save_string
    int lr_save_string (const char *param_value, const char *param_name);

    返回值:0成功,1失败

    说明:保存非空字符串到一个参数,在关联时常用。

    例子:将字符串"中华人民共和国"保存到参数 country中,输出country的值.
        lr_save_string("中华人民共和国","country");
        lr_output_message(lr_eval_string("{country}"));

    输出:中华人民共和国

    lr_eval_string
    char *lr_eval_string (const char *instring );
    返回值:成功则返回替换后的字符串,失败返回null。
    说明:返回参数的实际值。
    例子:同上。
  • loadrunner中怎样选择录制标准(recording level)

    2008-03-20 11:34:59

       基于不同的录制标准产生的脚本不同
      loadrunner v9.0 提供了三种录制标准
      GUI-based Scrīpt , HTML-based scrīpt
              URL-based scrīpt
      需要注意的是基于Web HTTP/HTML 的用户仅能基于后两种方式录制脚本(如果在选择协议时你选的是 Web HTTP/HTML 则在录制选项中没有 GUI-based scrīpt选项)。
       那么录制时我们依据什么选择使用哪种标准呢?

      请参考下面的建议(译自loadrunner v9.0帮助)
      包含Javascrīpt的应用软件,Oracle Web Applications11i 的用户,Oracle PeopleSoft Enterprise 管理软件。推荐使用  GUI-based scrīpt

       使用浏览器的应用软件,applets应用软件,VB scrīpt 使用 HTML-based scrīpt

       不使用浏览器的应用软件 使用 URL_based scrīpt.

       下面展示了基于这三种标准录制的脚本:
    下面是基于GUI录制的脚本:根据上下文敏感用GUI函数记录http动作。

    /* GUI-based mode - CS type functions with Javascrīpt support*//

    vuser_init()

    {

    web_browser("WebTours",

                  DEscrīptION,

                  ACTION,

                  "Navigate=http://localhost:1080/WebTours/",

                  LAST);

    web_edit_field("username",

                  "Snapshot=t2.inf",

                  DEscrīptION,

                  "Type=text",

                  "Name=username",

                  "FrameName=navbar",

                  ACTION,

                  "SetValue=jojo",

                  LAST);

    下面是基于HTML-based scrīpt录制的脚本,为每一步用户操作生成单独的步骤,比较直观,易于理解阅读,但是它不能真实模拟 Javascrīpt

    /* HTML-based mode - a scrīpt describing user actions*/

    ...

    web_url("WebTours",

                  "URL=http://localhost/WebTours/",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=",

                  "Snapshot=t1.inf",

                  "Mode=HTML",

                  LAST);

    web_link("Click Here For Additional Restrictions",

                  "Text=Click Here For Additional Restrictions",

                  "Snapshot=t4.inf",

                  LAST);

    web_image("buttonhelp.gif",

                  "Src=/images/buttonhelp.gif",

                  "Snapshot=t5.inf",

                  LAST);

    ...


    下面是基于URL录制的脚本,记录全部浏览器发出的请求和从服务器得到的资源。它自动录制第一个HTTP资源在(web_url函数),如果你录制的是不基于浏览器的应用,就选择这个标准。它用 web_url 替代 web_link,web_image.....

    /* URL-based mode - only web_url functions */

    ...

    web_url("spacer.gif",

                  "URL=http://graphics.hplab.com/images/spacer.gif",

                  "Resource=1",

                  "RecContentType=image/gif",

                  "Referer=",

                  "Mode=HTTP",

                  LAST);

    web_url("calendar_functions.js",

                  "URL=http://www.im.hplab.com/travelp/calendar_functions.js",

                  "Resource=1",

                  "RecContentType=application/x-javascrīpt",

                  "Referer=",

                  "Mode=HTTP",

                  LAST);

    ...

    录制完成后,你也可以选择使用其他标准重建一个基于新标准化的脚本,方法如下:选择tools-regenerate scrīpt 单击 opations 中的recording options 设置新的录制标准重建即可,不用重新录制。
  • loadrunner函数每日译解1

    2008-03-13 15:29:41

    web_set_timeout

    返回值:0 成功
           1  失败

    在设置指定应用的等待时间。

    int web_set_timeout (const char *Action, const char *TimeOut );

    Action:CONNECT 等待建立与WEB服务器连接的最长时间

           RECEIVE 等待回复的最长时间

           SETP 等待下载的最长时间

    TimeOut 单位 秒

    说明:用于在脚本中设置某些行为的最长等待时间,这个设置会覆盖在run-time settings对话框中的设置。这个函数支持Web脚本运行,和运行在http模式的WAP脚本。不支持WSP(Wireless Session Protocol)回放模式的WAP脚本运行。
    例子:设置连接到服务器的最大等待时间为60秒

    web_set_timeout("CONNECT", "60");



  • loadrunner中与超时相关的脚本函数

    2008-03-13 14:58:52

    与Run-time Settings-Internet Preferences中超时设置相对应的脚本函数

      协议 运行时设置
      默认值最大值 对应的脚本函数
       Web  DNS caching Yes -  
      Keep-alive HTTP connections Yes - web_disable_keep_alive ();
      web_enable_keep_alive ();
      HTTP-request connect timeout (sec) 120 1000 web_set_timeout( CONNECT, "120");
      HTTP-request receive timeout (sec) 120 1000 web_set_timeout( RECEIVE, "180");
      Step download timeout (sec) 120 32000 web_set_timeout( STEP, "240");
       Winsocket: -     lrs_set_recv_timeout


  • loadrunner函数每日译解

    2008-03-12 18:41:04

    void lr_abort( );

    无返回值,无参数。

    功能:中断脚本执行。

    说明:它中断脚本的运行。停止运行 Actions 部分继续执行 vuser_end 部分后结束运行。这个函数适用于需要手工停止运行一个有明确错误结果的情况。
    这个函数在调试时很有用的,特别是脚本很长的时候。
    例子:

    如果注册失败则输出信息到输出窗口或日志文件,之后调用lr_abort中断脚本运行.

    int status;

    status = web_url("Login",
              "URL=https://secure.computing.com//login.asp?user=(username)&session={ssid}",
              "RecContentType=text/html", LAST);

    if (status == LR_FAIL) {

         lr_error_message("Error: %s", "Unable to login to secure computing");
         lr_abort();
    }

Open Toolbar