发布新日志

  • LoadRunner-使用web_get_int_property、关联、file操作函数进行文件下载保存

    2015-11-30 15:00:15


    LoadRunner进行文件下载保存,主要利用如下函数:

    一、web_get_int_property函数
    1、函数用途
    记录http响应的信息
    2、函数属性
    1)HTTP_INFO_RETURN_CODE:        返回http代码
    2)HTTP_INFO_DOWNLOAD_SIZE:    返回页面字节数
    3)HTTP_INFO_DOWNLOAD_TIME:    返回页面下载时间

    二、web_reg_save_param函数
    1、函数用途
    关联函数,保存文件下载信息

    三、file操作函数
    1、函数用途
    1)fopen:文件打开函数
    2)fwrite:文件内容写入函数
    3)fclose:文件关闭函数


    代码如下:

        int iflen; //文件大小
        long lfbody;  //响应数据内容大小
        int HttpRetCode; //HTTP返回码
        
        ......
       
        web_set_max_html_param_len("1024000");

        //将响应信息存放到fcontent变量,SEARCH范围为BODY
        web_reg_save_param("fcontent","LB=","RB=","SEARCH=BODY",LAST);

        web_link("下载文件",
            "Text=下载文件",
            "Snapshot=t9.inf",
            LAST);
        HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);
       
        //返回200,表示成功
        if (HttpRetCode == 200)
            lr_output_message("The script. successfully accessed the page");
        else
            lr_error_message("The script. failed to access the page ");

        //获取响应大小
        iflen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
        lr_output_message("iflen=%d",iflen);

        if(iflen > 0)   
        {
            //以写方式打开文件
            if((lfbody = fopen("E:\\test.rar", "wb")) == NULL)
            {
                lr_error_message("文件操作失败!");
                return -1;
            }
            //写入文件内容
            fwrite(lr_eval_string("{fcontent}"), iflen, 1, lfbody);
            //关闭文件
            fclose(lfbody);
        }

    回放脚本,相关信息如下:

    Action.c(164): web_set_max_html_param_len was successful      [MsgId: MMSG-26392]
    Action.c(167): Registering web_reg_save_param was successful      [MsgId: MMSG-26390]
    Action.c(169): Linking to "http://xx.xx.xx/Download/detail/id/5.html", Target Frame=""      [MsgId: MMSG-27994]
    Action.c(169): HTML parsing not performed for Content-Type "application/force-download" ("ParseHtmlContentType" Run-Time Setting is "TEXT"). URL="http://31.match.peak.com/Download/detail/id/5.html"      [MsgId: MMSG-26548]
    Action.c(169): web_link("下载文件") was successful, 592497 body bytes, 418 header bytes      [MsgId: MMSG-26386]
    Action.c(173): web_get_int_property was successful      [MsgId: MMSG-26392]
    Action.c(177): The script. successfully accessed the page
    Action.c(184): web_get_int_property was successful      [MsgId: MMSG-26392]
    Action.c(185): iflen=592915
    Action.c(202): Notify: Transaction "xiazai" ended with "Pass" status (Duration: 0.7112 Wasted Time: 0.1642).


    细心的你,也许会发现:
    Action.c(169): web_link("下载文件") was successful, 592497 body bytes, 418 header bytes
    Action.c(185): iflen=592915
    下载保存的文件,有592915字节,而实际文件body只有592497字节,差的418正好为header字节数

    原因是:
    iflen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
    iflen为HTTP_INFO_DOWNLOAD_SIZE = header + body

    所以正确的fwrite写入大小应为:fcontent的大小
    web_reg_save_param("fcontent","LB=","RB=","SEARCH=BODY",LAST);

    但strlen(lr_eval_string("{fcontent}")),无法取到fcontent的大小
    因为:fcontent为二进制数据,strlen只能获取以'\0'为结束符的字符串的长度;

    没有更好的方法,暂且用lflen代替body长度;

    对比过LR保存的文件和真实下载的文件,只在结尾处,多了NUL,即空;正常打开时也不影响。
    (注:测试使用的文件为RAR文件,可正常解压,解压后的doc文件大小相同)
  • loadrunner-error -86401 Failed to connceted问题解决

    2015-07-27 17:50:08

    windows 2003上安装的LoadRunner11做为负载机
    在SMTP协议压测时,遇到:并发4K,一直固定失败27个

    失败信息:
    error -86401 Failed to connceted xxx.xxx.xxx.xxx:25

    如果是服务端问题,应该不会每次固定都失败27个,而且另外有几台负载机是正常的
    怀疑是客户端自己的问题(虽然正常的几台负载机和有问题的负载机,硬件配置,软件版本都一样,但有问题的一直有问题,正常的一直正常)

    看起来比较像是TCP连接数做了限制
    亲测结果,以下两个方法都处理后,有效果,记录如下:

    方法一:
    windows 2003对tcp的连接数做了限制,超多这个数目就会出现系统缓冲区空间不足或队列已满错误。

    增加tcp链接数,修改注册表如下:

    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "MaxUserPort" /d "65534" /t REG_DWORD /f
    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "TcpTimedWaitDelay" /d "30" /t REG_DWORD /f
    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "TcpNumConnections" /d "65534" /t REG_DWORD /f

    我的2003LR负载机,MaxUserPort已经是65534,TcpTimedWaitDelay已经是30,只是没有TcpNumConnections

    方法二:

    在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大 线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。
      (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。
      (2)找到Windows关键字,Windows关键字如下所示:
      %SystemRoot%\system32\csrss.exe bjectDirectory=\Windows
      SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1
      ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2
      ProfileControl=Off MaxRequestThreads=16
      SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。
      (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。

    注意,上面两种方法,因为修改注册表,都是重启服务器才会生效,只重启LR没有用。
  • loadrunner-vuser在Failed状态,影响集合点释放

    2015-07-27 14:57:15

    使用Loadrunner11

    场景集合点策略:
    所有在运行用户到达集合点时,再释放,超时时间30秒


    场景4000VUSER并发,3973个VUSER到达集合点,剩下的27个用户失败直接进入Failed状态


    但这时,3973个VUSER仍需要等待30秒超时时间才被释放

    Failed也算running Vusers??
    ==============================================

    发现受未启用的测试组影响:


    场景中,有测试组未启用,这时如果出现如上所说的Failed用户,就需要等待超时才会释放;
    但如果虚拟用户都是正常执行的,则正常释放。

    不明白未启用的测试组,为什么会影响这个。
  • loadrunner-winsocket-组装数据包进行发送-yc

    2013-09-27 17:42:26

    有个项目需要使用winsocket协议测试,数据包为十六进制格式
    send数据包中,有一个字段,使用时间戳转十六进制
    为了达到要求,需要进行send数据包的组装

    把代码记录下,以后备查!

    ######################################################################

    Action()
    {
        typedef long time_t;
        time_t t;

        char timec[10];
        char *tmp;
        char Buffer[1024];


        //time(&t)当前时间戳存入timec
        sprintf(timec, "%ld",time(&t));

        //建立socket连接
        lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.148.7:12001",  LrsLastArg);


        //当前时间戳转换为十六进制
        tmp=lrs_decimal_to_hex_string("socket0",timec,10);
        //lr_output_message("tmp=%s",tmp);
       
        //组装Buffer数据
        strcpy(Buffer,"\\x00\\x00");
        strcat(Buffer,tmp);
        strcat(Buffer,"\\x00\\x00\\x0B\\x4A");
        //lr_output_message("Buffer length=%d, Buffer=%s",strlen(Buffer),Buffer);


        //lrs_set_send_buffer,设置send数据,strlen(Buffer)为Buffer的实际长度
        lrs_set_send_buffer("socket0", Buffer, strlen(Buffer));

        lrs_send("socket0", "buf0", LrsLastArg);
        lrs_receive("socket0", "buf1", LrsLastArg);


        return 0;
    }

    ######################################################################

  • loadrunner:Run-time Settings之Pacing-yc

    2013-02-25 16:56:24


    loadrunner的Run-time Settings中,有一个Pacing的设置
    这个和lr_think_time的作用类似,即为了更真实的模拟用户的压力

    但lr_think_time是在脚本中设置,这些时间包含在脚本的action等事务中;
    Pacing是在两次迭代间设置的缓冲时间;可以满足另外一些使用场景;


    Pacing有三个选项:
    1、As soon as the previous iteration ends
    前一个迭代结束后,立即开始新的迭代;

    2、After the previous iteration ends(with a fixed/randrom delay of x sec)
    前一个迭代结束后,延时X秒(可为固定值,也可为某个区间的随机值)

    3、At fixed/randrom intervals,every x sec
    前一个迭代开始到新的迭代开始前,中间间隔X秒(可为固定值,也可为某个区间的随机值)
    (个人觉得这个比较有用,如混合场景中,模拟每个脚本的每秒事务数固定什么值时,比较有用)

    第一个就是结束后立即开始新的迭代,不再举例解释



    第二个和第三个选项举例如下:

    脚本:
    Action()
    {
        typedef long time_t;
        time_t t;

        lr_message ("Time in seconds since 1970-01-01: %ld\n", time(&t));
        lr_think_time(2);

        return 0;
    }


    Run-time Settings运行时设置如下:
    Run Logic:action迭代三次;
    Pacing:After the previous iteration ends(with a fixed delay of 5 sec)
    Think Time:Replay think time回放思考时间;



    运行结果如下:
    Running Vuser...
    Starting iteration 1.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781794
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 1.

    Waiting 5.0000 seconds for iteration pacing.

    Starting iteration 2.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781801
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 2.

    Waiting 5.0000 seconds for iteration pacing.

    Starting iteration 3.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781808
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 3.
    Ending Vuser...


    下一次迭代开始前,固定等待5秒的时间;再加上2秒的思考时间,相当于两次迭代间隔7秒;



    Run-time Settings运行时设置如下:
    Run Logic:action迭代三次;
    Pacing:At fixed intervals,every 5 sec
    Think Time:Replay think time回放思考时间;


    运行结果如下:
    Running Vuser...
    Starting iteration 1.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781043
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 1.

    Waiting 2.9460 seconds for iteration pacing.

    Starting iteration 2.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781048
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 2.

    Waiting 2.8350 seconds for iteration pacing.

    Starting iteration 3.
    Starting action Action.
    Time in seconds since 1970-01-01: 1361781053
    Action.c(8): lr_think_time: 2.00 seconds.
    Ending action Action.
    Ending iteration 3.
    Ending Vuser...


    前一个迭代开始到新的迭代开始前,中间间隔5秒;
    因为思考时间去了2秒,其它脚本内容占用0.05——0.15秒左右,所以下一次迭代开始前要等待5秒-2秒-(0.05——0.15秒)=2.9460/2.8350;



    另外,运行时设置中只设置一次迭代,在场景中设置运行时长X分钟,这时脚本也会循环运行,Pacing也会有作用;


  • loadrunner-JAVA VUSER-Compilation process failed错误解决

    2012-04-25 15:07:03

    今天同事使用loadrunner的JAVA VUSER协议,并且调用负载生成器时
    遇到报错:Compilation process failed

    网上看到的解决方案,多是说,要把脚本目录放到负载机相同的路径下
    后尝试无法解决该问题

    最后的解决方案记录如下:
    在负载机上,把脚本中使用到的其它jar包或class文件,放到loadrunner安装路径下的classes目录下
    如:D:\Program Files\HP\LoadRunner\classes

    注意:
    如果import 时,调用的class文件,有路径,则放到classes时,也需要对应放置
    如:import org.test.JAVATest;
    那么,放到D:\Program Files\HP\LoadRunner\classes下的,也要为org\test\JAVATest.class
    即,完整路径为:D:\Program Files\HP\LoadRunner\classes\org\test\JAVATest.class


    确认过,脚本目录不COPY到负载机上,单进行上面的class处理,可解决问题!

    ##################################################

    补充:
    一些项目使用的额外的jar包,即在Run-time Settings中,需要在Java Environment Settings-Java VM中特别指定的jar包;
    直接放到loadrunner安装路径下的classes目录下,是没有用的,会提示找不到类;
    这些jar包,需要在负载机上,相同的路径下放置;
  • loadrunner11下载安装

    2011-10-16 14:56:31

    因个人电脑为WIN7操作系统
    下载了一个loadrunner11安装
     
    下载地址:
    ed2k://|file|%5B%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7LR11.00%5D.loadrunner-11.iso|4313382912|b95afeb3a879c6b8146435bb79e8cb97|h=ntupkaxx5ltzwovgdkv7uexj7ukal5hu|/
    安装过程中,提示:少了Microsoft Visual c++2005 sp1运行时组件,安装时会提示命令行选项语法错误,键入“命令/?”可获取帮肋信息,无法正常安装;
    解决方法:
    1、进入loadrunner-11\Additional Components\IDE Add-Ins\MS Visual Studio .NET
    2、安装:LRVS2005IDEAddInSetup.exe
    3、再安装loadrunner
     
    破解:
    同8.1、9.5一样:
    1、把loadrunner相关程序全部退出;
    2、把lm70.dll、mlr5lprg.dll放到安装目录的bin目录下;
    3、运行lr注册表删除工具,lr_Del_license(regedit).exe;
    4、修改license;
    5、OK;
     
    license:
    golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
    golba-1000:AEACFSJI-YASEKJJKEAHJD-BCLBR
     
    提供一个超级license 最高支持6.5w个并发:AEACFSJI-YJKJKJJKEJIJD-BCLBR

     
     
     
  • loadrunner监控windows资源注意项

    2011-08-10 08:51:31

    loadrunner监控windows资源时注意项:

    1、被监控服务器,需开启下述三个服务:
    server
    Remote Procedure Call(RPC)
    Remote Registry


    2、监控端,运行-net use \\192.168.100.166\ipc$ /user:administrator passwd
    net use \\被监控服务器IP\ipc$ /user:administrator administrator的密码
    提示:命令成功完成

    3、如果上述命令没有成功完成;
    确认:
    安全策略的设置问题(管理工具 -> 本地安全策略 -> 安全选项 ->“网络访问:本地帐户的共享和安全模式”)。默认情况下,XP的访问方式是“仅来宾”的方式,如果你访问它,当然就固定为Guest来访问,而 guest账户没有监控的权限,所以要把访问方式改为“经典”模式,这样就可以以administrator的身份登陆了。修改后,再次执行步骤2

     

     

  • [论坛] 使用LR9.52版本进行flex网页游戏测试

    2010-08-27 13:24:41

    但遇到了下面几个问题:
    1、录制完成生成脚本时,会提示找不到一些类,这些类为程序代码中使用的类;
    但我有让开发把java程序整个打成jar包,并加到recording options中
    我打开开发打的jar包,确认里面存在那些提示找不到的class文件

    为什么还会报说找不到类呢?还是因为打jar包有什么注意事项?


    2、使用flex+http协议录制脚本后,回放时,总报错:

    Action.c(161): Error: Decoding of AMF message failed. Error is : Externalizable parsing failed:

    java.lang.reflect.InvocationTargetException
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at hp.flex.HPExternalizableWrapper.ReadObject(HPExternalizableWrapper.java:96)
    Caused by: flex.messaging.MessageException: Cannot create class of type 'DSK'. Type 'DSK' not found.
            at flex.messaging.util.ClassUtil.createClass(ClassUtil.java:65)
            at flex.messaging.io.AbstractProxy.createInstance(AbstractProxy.java:84)
            at flex.messaging.io.amf.Amf3Input.readScriptObject(Amf3Input.java:409)
            at flex.messaging.io.amf.Amf3Input.readObjectValue(Amf3Input.java:149)
            at flex.messaging.io.amf.Amf3Input.readObject(Amf3Input.java:128)
            ... 5 more

    3、使用amf+http协议录制脚本后,回放时,报错:

    Start auto log messages stack - Iteration 1.
    Action.c(188):     edData\x13faultCode\x13messageId\n
    Action.c(188):     \x03\x01\x01\x01\x06I57FF2F4E-B30A-E366-3E35-89248BD292C8\x01\x06俥Detected duplicate HTTP
    Action.c(188):     -based FlexSessions, generally due to the remote host disabling session cookies. Session c
    Action.c(188):     ookies must be enabled to manage the client connection correctly.\x01\x05\x00\x00\x00\x00\x00
    Action.c(188):     \x00\x00\x00\x06\x1FlogInFlexRemote\x05Br痈\xC0\x00\x01\x06UServer.Processing.DuplicateS
    Action.c(188):     essionDetected\x06IDAE33E60-CC0B-A2AD-2516-AFCC95DAD83A
    Action.c(188): t=106852ms: Request done "http://IP/loginserver/messagebroker/amf;jsessionid=A774AD66163D9034C1A0C57E4F6C1C88"

            [MsgId: MMSG-26000]
    Action.c(188): Error: Server returned error for message #1 : description="AMF call returned an error, described in XML seen in extended log"
    End auto log messages stack.


    对flex不太了解,请有相关经验的同仁指教下,谢谢了
  • LoadRunner实现计算字符串Md5 -zt

    2010-01-25 15:25:19

    尝试在LR里实现字符串的MD5计算。

        在LR里添加头文件md5.h,在globals.h里添加引用
    #include "md5.h";md5.h代码如下:

    ---------------------------------------------------------------------------------

    #ifndef MD5_H
    #define MD5_H
    #ifdef __alpha
    typedef unsigned int uint32;
    #else
    typedef unsigned long uint32;
    #endif
    struct MD5Context {
            uint32 buf[4];
            uint32 bits[2];
            unsigned char in[64];
    };
    extern void MD5Init();
    extern void MD5Update();
    extern void MD5Final();
    extern void MD5Transform();
    typedef struct MD5Context MD5_CTX;
    #endif
    #ifdef sgi
    #define HIGHFIRST
    #endif
    #ifdef sun
    #define HIGHFIRST
    #endif
    #ifndef HIGHFIRST
    #define byteReverse(buf, len)    /* Nothing */
    #else
    void byteReverse(buf, longs)unsigned char *buf; unsigned longs;
    {
        uint32 t;
        do {
        t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |((unsigned) buf[1] << 8 | buf[0]);
        *(uint32 *) buf = t;
        buf += 4;
        } while (--longs);
    }
    #endif
    void MD5Init(ctx)struct MD5Context *ctx;
    {
        ctx->buf[0] = 0x67452301;
        ctx->buf[1] = 0xefcdab89;
        ctx->buf[2] = 0x98badcfe;
        ctx->buf[3] = 0x10325476;
        ctx->bits[0] = 0;
        ctx->bits[1] = 0;
    }
    void MD5Update(ctx, buf, len) struct MD5Context *ctx; unsigned char *buf; unsigned len;
    {
        uint32 t;
        t = ctx->bits[0];
        if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
        ctx->bits[1]++;
        ctx->bits[1] += len >> 29;
        t = (t >> 3) & 0x3f;
        if (t) {
        unsigned char *p = (unsigned char *) ctx->in + t;
        t = 64 - t;
        if (len < t) {
            memcpy(p, buf, len);
            return;
        }
        memcpy(p, buf, t);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += t;
        len -= t;
        }
        while (len >= 64) {
        memcpy(ctx->in, buf, 64);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += 64;
        len -= 64;
        }
        memcpy(ctx->in, buf, len);
    }
    void MD5Final(digest, ctx)
        unsigned char digest[16]; struct MD5Context *ctx;
    {
        unsigned count;
        unsigned char *p;
        count = (ctx->bits[0] >> 3) & 0x3F;
        p = ctx->in + count;
        *p++ = 0x80;
        count = 64 - 1 - count;
        if (count < 8) {
        memset(p, 0, count);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        memset(ctx->in, 0, 56);
        } else {
        memset(p, 0, count - 8);
        }
        byteReverse(ctx->in, 14);
        ((uint32 *) ctx->in)[14] = ctx->bits[0];
        ((uint32 *) ctx->in)[15] = ctx->bits[1];
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        byteReverse((unsigned char *) ctx->buf, 4);
        memcpy(digest, ctx->buf, 16);
        memset(ctx, 0, sizeof(ctx));
    }
    #define F1(x, y, z) (z ^ (x & (y ^ z)))
    #define F2(x, y, z) F1(z, x, y)
    #define F3(x, y, z) (x ^ y ^ z)
    #define F4(x, y, z) (y ^ (x | ~z))
    #define MD5STEP(f, w, x, y, z, data, s) ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
    void MD5Transform(buf, in)
        uint32 buf[4]; uint32 in[16];
    {
        register uint32 a, b, c, d;
        a = buf[0];
        b = buf[1];
        c = buf[2];
        d = buf[3];
        MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
        MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
        MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
        MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
        MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
        MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
        MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
        MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
        MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
        MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
        MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
        MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
        MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
        MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
        MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
        MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
        MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
        MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
        MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
        MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
        MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
        MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
        MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
        MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
        MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
        MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
        MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
        MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
        MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
        MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
        MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
        MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
        MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
        MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
        MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
        MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
        MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
        MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
        MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
        MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
        MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
        MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
        MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
        MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
        MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
        MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
        MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
        MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
        MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
        MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
        MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
        MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
        MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
        MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
        MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
        MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
        MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
        MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
        MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
        MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
        MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
        MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
        MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
        MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
        buf[0] += a;
        buf[1] += b;
        buf[2] += c;
        buf[3] += d;
    }
    char* CMd5(const char* s)
    {
         struct MD5Context md5c;
         unsigned char ss[16];
         char subStr[3],resStr[33];
         int i;
         MD5Init( &md5c );
         MD5Update( &md5c, s, strlen(s) );
         MD5Final( ss, &md5c );
         strcpy(resStr,"");
         for( i=0; i<16; i++ )
         {
             sprintf(subStr, "%02x", ss[i] );
             itoa(ss[i],subStr,16);
             if (strlen(subStr)==1) {
                 strcat(resStr,"0");
             }
             strcat(resStr,subStr);
         }
         strcat(resStr,"\0");
         return resStr;
    }


     
    ---------------------------------------------------------------------------------
        源码都是网上共享的,仅CMd5()函数稍作了改动,要验证可以上http://www.cmd5.com/。在LR里调用就非常简单:
    ---------------------------------------------------------------------------------
    Action()
    {
        lr_output_message(CMd5("a"));
     return 0;
    }

    ---------------------------------------------------------------------------------
    输出结果:
    ---------------------------------------------------------------------------------
    Running Vuser...
    Starting iteration 1.
    Starting action main.
    main.c(3): 0cc175b9c0f1b6a831c399e269772661
    Ending action main.
    ---------------------------------------------------------------------------------

    转自:http:/ /higkoo.blog.sohu.com/108798728.html

  • [论坛] LR中运行支持flex的QTP脚本-问题

    2010-01-22 13:09:32

    QTP录制支持flex3的脚本,在QTP中好不容易可以正常运行了

    但是放到LR中运行,总会报下面这样的错误:

    Error:  Line(8): Failed to run the test due to an unknown error.

    大家有没有遇到这样的问题??

  • Loadrunner监控Tomcat

    2010-01-20 13:03:29

    LoadRunenr没有监控Tomcat的专用监控器,为了用lr达到监控tomcat的目的可以通过打开Tomcat自带的Status页面之后,利用lr的关联技术得到相关的数据,把数据输出到lr自定义的监控器中。

      1、打开Tomcat的status页面,方法为编辑Tomcat的conf目录下的tomcat-users.xml文件,在文件中添加

    <tomcat-users>
      <role rolename="manager"/>
      <user username="admin" password="pass" roles="manager"/>
    </tomcat-users>

     

    修改配置并重启服务后:

    访问:http://192.168.146.228/manager/status

    输入用户名密码,即可以看到相应信息; 

     2、开发lr脚本

    vuser_init()

    {

      double atof(const char *string); //一定要记得声明函数,否则得到的数据都是错误的;

       //保存JVM内存数值
        web_reg_save_param("JVM_FreeMemory",
                           "LB=Free memory: ",
                           "RB= MB",
                           "Ord=1",
                           LAST);

        web_reg_save_param("JVM_TotalMemory",
                           "LB=Total memory: ",
                           "RB= MB",
                           "Ord=1",
                           LAST);

        web_reg_save_param("JVM_MaxMemory",
                           "LB=Max memory: ",
                           "RB= MB",
                           "Ord=1",
                           LAST);


        //保存http-80连接数值
        web_reg_save_param("http_MaxThreads",
                           "LB=Max threads: ",
                           "RB= ",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_CurrentThreadCount",
                           "LB=Current thread count: ",
                           "RB= ",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_CurrentThreadBusy",
                           "LB=Current thread busy: ",
                           "RB= ",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_MaxProcessingTime",
                           "LB=Max processing time: ",
                           "RB= ms",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_ProcessingTime",
                           "LB=Processing time: ",
                           "RB= s",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_RequestCount",
                           "LB=Request count: ",
                           "RB= ",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_ErrorCount",
                           "LB=Error count: ",
                           "RB= ",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_BytesReceived",
                           "LB=Bytes received: ",
                           "RB= MB",
                           "Ord=1",
                           LAST);

        web_reg_save_param("http_BytesSent",
                           "LB=Bytes sent: ",
                           "RB= MB",
                           "Ord=1",
                           LAST);

      //定义tomcat内存使用情况的监视器事务 

     lr_start_transaction("status");

     web_set_user("admin", "123456","192.168.146.146:80");


     web_url("status",
      "URL=http://192.168.146.146/manager/status",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t1.inf",
      "Mode=HTML",
      LAST);

     lr_end_transaction("status", LR_AUTO);

    // 使用lr_user_data_point()添加数据到图表中去

        lr_user_data_point("Tomcat JVM FreeMemory", atof(lr_eval_string("{JVM_FreeMemory}")));

        lr_user_data_point("Tomcat JVM TotalMemory", atof(lr_eval_string("{JVM_TotalMemory}")));

        lr_user_data_point("Tomcat JVM MaxMemory", atof(lr_eval_string("{JVM_MaxMemory}")));

        lr_user_data_point("Tomcat http MaxThreads", atof(lr_eval_string("{http_MaxThreads}")));

        lr_user_data_point("Tomcat http CurrentThreadCount", atof(lr_eval_string("{http_CurrentThreadCount}")));

        lr_user_data_point("Tomcat http CurrentThreadBusy", atof(lr_eval_string("{http_CurrentThreadBusy}")));

        lr_user_data_point("Tomcat http MaxProcessingTime", atof(lr_eval_string("{http_MaxProcessingTime}")));

        lr_user_data_point("Tomcat http ProcessingTime", atof(lr_eval_string("{http_ProcessingTime}")));

        lr_user_data_point("Tomcat http RequestCount", atof(lr_eval_string("{http_RequestCount}")));

        lr_user_data_point("Tomcat http ErrorCount", atof(lr_eval_string("{http_ErrorCount}")));

        lr_user_data_point("Tomcat http BytesReceived", atof(lr_eval_string("{http_BytesReceived}")));

        lr_user_data_point("Tomcat http BytesSent", atof(lr_eval_string("{http_BytesSent}")));

    return 0;

    }

    上述需要哪些值,可以根据实际需求来取舍!

  • 在LR中运行QTP脚本的注意事项

    2010-01-19 16:08:17

    在LR中运行QTP脚本的注意事项

    1、QTP的Tools--Options--Run的"Alow other Mercury products to run tests and components"选项要打勾;
    2、在QTP脚本中设置事务,Services.StartTransaction "start"与Services.EndTransaction "start"
    把需要在LR运行的脚本放在此事务里面;
    3、在LR中运行时选择QTP脚本,文件扩展名为.usr的;
    4、在LR中运行QTP脚本时,要把QTP关闭;
    5、只能在LR的Controller中运行;不能在Virtual User Generator中打开及回放;
    6、LR要使用global的license,单单WEB的license不行,会报错;
    7、Controller运行中,只能执行1个虚拟用户,大于1个以上的虚拟用户会提示错误;
    如果需要运行多个用户,只能在QTP脚本里设置循环及参数化来解决;

  • loadrunner发送邮件时附件参数化

    2009-09-23 20:01:00

    loadrunner发送邮件时附件参数化

    参考:http://www.51testing.com/index.php?uid-117865-action-viewspace-itemid-132817

    Action()
    {

     smtp1 = 0;
     smtp_logon_ex(&smtp1, "SmtpLogon",
      "URL=smtp://192.168.146.68",
      "LogonUser=spam1@spamtest.com",
      "LogonPass=123456",
      "CommonName=LoadRunner User",
      LAST);

         smtp_translate_ex(&smtp1,"ori.txt",
      "Content-Type: application/octet-stream;\n  name=\"base64_ori.txt\"\nContent-Transfer-Encoding: base64\nContent-Disposition: attachment;\n  filename=\"base64_ori.txt\"\r\n",
      BASE64_ENCODED,
      "base64_ori.txt");

    //要参数化附件时,只要参数化ori.txt就可以;
    //ori.txt要放到保存脚本的目录下,base64_ori.txt是进行BASE64编码后自动生成的文件;


     smtp_send_mail_ex(&smtp1, "SendMail",
      "To=spam1@spamtest.com",
      "From=spam1@spamtest.com",
      "Subject==?gb2312?B?bWFpbHRlc3TTyrz+suLK1NbQ?=",
      "ContentType=multipart/mixed;",                      
      MAILOPTIONS,
       "X-mailer: Foxmail 6, 15, 201, 22 [cn]",
      MAILDATA,
          "AttachRawFile=mailnote1_01.dat",
          //"AttachRawFile=mailnote1_02.dat",
          "AttachRawFile=base64_ori.txt",

          LAST);

     smtp_logout_ex(&smtp1);

     smtp_free_ex(&smtp1);

     return 0;
    }

    说明:
    1、AttachRawFile=mailnote1_02.dat;
    mailnote1_02.dat这个是存放邮件附件经过BASE64编码后生成的文件;
    在这个文件中,header部份有:
    Content-Type: application/octet-stream;
     name="ori.txt"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment;
     filename="ori.txt"

    这些是附件的header信息;表明附件名,传输编码等;

     

    2、int smtp_translate_ex (SMTP *ppsmtp, char *filename, char *content_header, ENCODING_TYPE encoding, char *output_filename);
    这个函数表示,把filename文件经过ENCODING_TYPE编码后,加上content_header头部信息,生成output_filename文件;
    打开output_filename文件,会发现里面的信息和mailnote1_02.dat这个附件文件保存的信息一样;

    3、在脚本目录下,一定要把filename放进去,不然,发送的邮件,附件会变成空;

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

    此方法慎用!!!!!!!!!!!!!

    经测试发现,大量VUSER执行上述脚本,发送的邮件,有可能出现如下情况:
    (1)附件大小变小或附件丢失,像DOC等文档会出现打不开现象,即数据不全导致;
    (2)内容区出现很多空白行,信头也一样;原附件信息变成空白行导致;

    如果只是回放脚本,则一切正常;

    所以,可以利用该方法生成的编码后的文件,替换mailnote1_02.dat文件中的内容,再执行脚本,这样就不会出现问题;

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

  • LR通过snmp监控linux下的内存使用情况

    2009-06-01 13:27:55

    在下面这个链接地址中说明了:“LR通过snmp监控linux下的mysql”

    http://www.51testing.com/index.php?uid-130600-action-viewspace-itemid-102036

    下面说明snmp如何监控linux的内存使用情况:
    (注:只在centos的linux操作系统上试验成功过)

    snmp安装方法同“LR通过snmp监控linux下的mysql”

    SNMP添加计数器:
    mgmt--mib-2--host--hrStorageTable--hrStorageEntry--hrStorageUsed

    [1]、[3]内存使用量,即free的第一行数据,used列的值;
    [6]内存buffers值,即free的第一行数据,buffers列的值;
    [7] 内存cached值,即free的第一行数据,cached列的值;
    [10]Swap的使用量,即free的第三行数据,used列的值;

     

  • loadrunner-ip欺骗经验总结

    2009-05-31 11:38:56

    loadrunner-ip欺骗经验总结

    网络上介绍如何增加IP欺骗的文章已经很多,这里就不再赘述,只说明下在使用过程中要注意的几个方面:

    1、本地的IP不能设置为“自动获取”,必须指定一个静态IP;
    原因:
    如果设置为“自动获取”,在运行IP Wizard时会弹出错误提示;
       提示信息为:IP向导不支持启用DHCP的网卡。您的卡启用了DHCP或者配置了无效设置。请与系统管理员联系。

    2、添加IP欺骗使用的IP后,会有提示框提示保存IP列表,确定,取消等按钮;建议保存IP列表后再确定完成;
    原因:保存IP列表后,下次使用时,可以直接导入IP列表;也可以直接修改保存的IP列表文件,再导入;

    3、添加IP欺骗,和释放IP,都要重启机器后才会生效;
    原因:重启后,网络配置才会生效;

    4、在controller中使用ip欺骗的注意事项;
    (1)勾选“场景”->“启用IP欺骗器”;
    (2)勾选“工具”->“专家模式”;
    (3)“场景”->“选项”->“常规”->“多个IP地址模式”;
    这个选项一定要与当前场景的模式相匹配,也就是说使用本地虚拟IP测试时需要选中线程方式,使用负载生成器使用虚拟IP测试时需要选中进程方式

    5、设置IP欺骗后,验证其是否生效;
    有两种方法查看:
    (1)可用如下代码段来查看:
    char *ip = lr_get_vuser_ip();
    if (ip)
         lr_output_message("The IP address is %s", ip);
    else
         lr_output_message("IP spoofing disabled");
    注意:如果把上面这一段加入代码中间,第一句要修改下:

    char *ip;(这句放在函数起始部位,对变量ip进行声明)
    ip=lr_get_vuser_ip();(这个和后面的if-else语句一起放在要输出的地方)

    另:这个在generator中是不生效的,所以在回放代码时看到的都是"IP spoofing disabled",在contorller中设置了启用IP欺骗,日志中就可以看到;

    (2)controller的运行页,运行完场景后,在通过、失败的虚拟用户处,右键可显示VUser日志;
    弹出的提示框头几行就有显示当前使用的IP;

    6、使用IP欺骗过程中,会有出现下述问题:
    启用IP欺骗后,运行1个虚拟用户的场景都失败;不启用IP欺骗后,运行场景通过;
    原因:查看失败的虚拟用户,使用的IP地址(查看方法可使用第5点中的方法),在服务器端通过ping等命令查看网络是否互通;
    如果服务器ping不通虚拟IP,说明网络设置有问题,检查网络设置;

  • loadrunner录制脚本时打不开浏览器问题

    2009-05-05 15:56:03

    运行loadrunner VuserGenerator,录制脚本时,打不开浏览器问题

    解决方案:
    选中:IE->工具->高级->启用第三方浏览器扩展
    再重启机器

  • LoadRunner常用函数-zt

    2009-05-04 09:38:45

    转自:http://www.51testing.com/index.php?uid-138635-action-viewspace-itemid-101833

    1.   Intweb_reg_save_param("参数名","LB=左边界","RB=右边界",LAST);/注册函数,在参数值出现的前面使用,注册成功时返回值为0,注册失败时返回值为1。左右边界需根据TreeView里相关步骤的SeverResponse代码来确定。用以上函数能获取第一个符合条件的数值。
    2.         web_reg_save_param("参数名”,"LB=左边界”,"RB=右边界","Ord=All",LAST);/当参数有多个值时,加上"Ord=All”后可获取所有的数值。注册成功后,{参数名_count}表示取得的数值个数,{参数名_1}为第一个数值,{参数名_2}为第二个数值。
    3.         lr_save_string(“字符串变量”,"参数名")/将字符变量里的值传递给指定参数。通过该函数来改变DataFile类型参数的数值。
    4.         lr_eval_string("{参数名}")/取得参数的数值。可取得已注册参数或DataFile类型参数的数值。eval就是evaluation(估价, 评价, 赋值)的缩写。
    5.         int sprintf(char * string , const char*format_string[,args]);/字符串赋值函数
    Action()
    {
    int index=56;
    charfilename[64],*suffix="txt";
    sprintf(filename,"log_%d.%s",index,suffix);
    lr_output_message("Thenewfilenameis%s",filename);
    return 0;
    }
    Output:Thenewfilenameislog_56.txt
    6.         char*strcat(char*to,constchar*from);/将一字符串追加到另一字符串后面
    7.         web_find("find_time","What=2006-03-0118:21:16.882",LAST);/增加检查点,检查 “2006-03-0118:21:16.882”这个字符串是否出现在当前页面上。find_time为自己任意输入的检查点名称。
    8.       事务函数
    lr_end_sub_transaction/标记子事务的结束以便进行性能分析
    lr_end_transaction/标记LoadRunner事务的结束
    lr_end_transaction_instance/标记事务实例的结束以便进行性能分析
    lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并发送错误消息
    lr_get_trans_instance_duration/获取事务实例的持续时间(由它的句柄指定)
    lr_get_trans_instance_wasted_time/获取事务实例浪费的时间(由它的句柄指定)
    lr_get_transaction_duration/获取事务的持续时间(按事务的名称)
    lr_get_transaction_think_time/获取事务的思考时间(按事务的名称)
    lr_get_transaction_wasted_time/获取事务浪费的时间(按事务的名称)
    lr_resume_transaction/继续收集事务数据以便进行性能分析
    lr_resume_transaction_instance/继续收集事务实例数据以便进行性能分析
    lr_set_transaction_instance_status/设置事务实例的状态
    lr_set_transaction_status/设置打开事务的状态
    lr_set_transaction_status_by_name/设置事务的状态
    lr_start_sub_transaction/标记子事务的开始
    lr_start_transaction/标记事务的开始
    lr_start_transaction_instance/启动嵌套事务(由它的父事务的句柄指定)
    lr_stop_transaction/停止事务数据的收集
    lr_stop_transaction_instance/停止事务(由它的句柄指定)数据的收集
    lr_wasted_time/消除所有打开事务浪费的时间
    lr_end_sub_transaction/标记子事务的结束以便进行性能分析
    r_end_transaction/标记LoadRunner事务的结束
    lr_end_transaction_instance/标记事务实例的结束以便进行性能分析
    lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并

    9.      命令行分析函数
    lr_get_attrib_double/检索脚本命令行中使用的double类型变量
    lr_get_attrib_long/检索脚本命令行中使用的long类型变量
    lr_get_attrib_string/检索脚本命令行中使用的字符串
    10.  信息性函数
    lr_user_data_point/记录用户定义的数据示例
    lr_whoami/将有关Vuser脚本的信息返回给Vuser脚本
    lr_get_host_name/返回执行Vuser脚本的主机名
    lr_get_master_host_name/返回运行LoadRunnerController的计算机名
    11.  字符串函数
    lr_eval_string/用参数的当前值替换参数
    lr_save_string/将以NULL结尾的字符串保存到参数中
    lr_save_var/将变长字符串保存到参数中
    lr_save_datetime/将当前日期和时间保存到参数中
    lr_advance_param/前进到下一个可用参数
    lr_decrypt/解密已编码的字符串
    lr_eval_string_ext/检索指向包含参数数据的缓冲区的指针
    lr_eval_string_ext_free/释放由lr_eval_string_ext分配的指针
    lr_save_searched_string/在缓冲区中搜索字符串实例,并相对于该字符串实例,该缓冲区的一部分保存到参数中
    12.  消息函数
    lr_debug_message/将调试消息发送到输出窗口
    lr_error_message/将错误消息发送到输出窗口
    lr_get_debug_message/检索当前的消息类
    lr_log_message/将输出消息直接发送到output.txt文件,此文件位于Vuser脚本目录中。该函数有助于防止输出消息干扰TCP/IP通信。
    lr_output_message/将消息发送到输出窗口
    lr_set_debug_message/为输出消息设置消息类
    lr_vuser_status_message/生成格式化输出并将其打印到ControllerVuser状态区域。
    lr_message/将消息发送到Vuser日志和输出窗口
    13.  操作函数
    web_custom_request允许您使用HTTP支持的任何方法来创建自定义HTTP请求
    web_image在定义的图像上模拟鼠标单击
    web_link在定义的文本链接上模拟鼠标单击
    web_submit_data执行“无条件”或“无上下文”的表单
    web_submit_form模拟表单的提交
    web_url加载由“URL”属性指定的URL
    14.  身份验证函数
    身份验证函数web_set_certificate使Vuser使用在InternetExplorer注册表中列出的特定证书
    身份验证函数web_set_certificate_ex指定证书和密钥文件的位置和格式信息
    身份验证函数web_set_user指定Web服务器的登录字符串和密码,用于Web服务器上已验证用户身份的区域
    15.  缓存函数
    缓存函数web_cache_cleanup清除缓存模拟程序的内容
    16.  检查函数
    检查函数web_find在HTML页内搜索指定的文本字符串
    检查函数web_global_verification在所有后面的HTTP请求中搜索文本字符串
    检查函数web_image_check验证指定的图像是否存在于HTML页内
    检查函数web_reg_find在后面的HTTP请求中注册对HTML源或原始缓冲区中文本字符串的搜索
    17.  连接定义函数
    连接定义函数web_disable_keep_alive禁用Keep-AliveHTTP连接
    连接定义函数web_enable_keep_alive启用Keep-AliveHTTP连接
    连接定义函数web_set_connections_limit设置Vuser在运行脚本时可以同时打开连接的最大数目
    18.  并发组
    web_concurrent_end标记并发组的结束
    web_concurrent_start标记并发组的开始
    19.  cook函数
    web_add_cookie添加新的Cookie或修改现有的Cookie
    web_cleanup_cookies删除当前由Vuser存储的所有Cookie
    web_remove_cookie删除指定的Cookie
    20.  关联函数
    web_create_html_param将HTML页上的动态信息保存到参数中。(LR6.5及更低版本)
    web_create_html_param_ex基于包含在HTML页内的动态信息创建参数(使用嵌入边界)

  • LR-windows性能计数器-zt

    2009-01-09 14:42:54

    Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁,说明内存不足。“页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况,请从以下的对象计数器开始:
    Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。


    page/sec: 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/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的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。
    要确定过多的页交换对磁盘活动的影响,请将 Physical Disk\ Avg.Disk sec/Transfer 和 Memory\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1,那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况,那么您可能需要更多的内存。


    Page Faults/sec:每秒软性页面失效的数目(包括有些可以直接在内存中满足而有些需要从硬盘读取)较page/sec只表明数据不能在内存的指定工作集中立即使用。
    Cache Bytes:文件系统缓存(File System Cache),默认情况下为50%的可用物理内存。如IIS5.0 运行内存不够时,它会自动整理缓存。需要关注该计数器的趋势变化
    如果您怀疑有内存泄露,请监视 Memory\ Available Bytes 和 Memory\ Committed Bytes,以观察内存行为,并监视您认为可能在泄露内存的进程的 Process\Private Bytes、Process\Working Set 和Process\Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视 Memory\Pool Nonpaged Bytes、Memory\ Pool Nonpaged Allocs 和 Process(process_name)\ Pool Nonpaged Bytes。


    Pages per second :每秒钟检索的页数。该数字应少于每秒一页。

    Process:
    %Processor Time: 被处理器消耗的处理器时间数量。如果服务器专用于sql server,可接受的最大上限是80-85%
    Page Faults/sec:将进程产生的页故障与系统产生的相比较,以判断这个进程对系统页故障产生的影响。
    Work set: 处理线程最近使用的内存页,反映了每一个进程使用的内存页的数量。如果服务器有足够的空闲内存,页就会被留在工作集中,当自由内存少于一个特定的阈值时,页就会被清除出工作集。
    Inetinfo:Private Bytes:此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低,则此计数器可以是内存泄漏的最佳指示器。

    Processor:监视“处理器”和“系统”对象计数器可以提供关于处理器使用的有价值的信息,帮助您决定是否存在瓶颈。
    %Processor Time:如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
    %User Time:表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。
    %Privileged Time:(CPU内核时间)是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"Physical Disk"参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM,减低"max async IO","max lazy writer IO"等措施都会降低该值。
    此外,跟踪计算机的服务器工作队列当前长度的 Server Work Queues\ Queue Length 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值,而不是一段时间的平均值。
    % DPC Time:越低越好。在多处理器系统中,如果这个值大于50%并且Processor:% Processor Time非常高,加入一个网卡可能会提高性能,提供的网络已经不饱和。

    Thread
    ContextSwitches/sec: (实例化inetinfo 和dllhost 进程) 如果你决定要增加线程字节池的大小,你应该监视这三个计数器(包括上面的一个)。增加线程数可能会增加上下文切换次数,这样性能不会上升反而会下降。如果十个实例的上下文切换值非常高,就应该减小线程字节池的大小。

    Physical Disk:
    %Disk Time %:指所选磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。如果三个计数器都比较大,那么硬盘不是瓶颈。如果只有%Disk Time比较大,另外两个都比较适中,硬盘可能会是瓶颈。在记录该计数器之前,请在Windows 2000 的命令行窗口中运行diskperf -yD。若数值持续超过80%,则可能是内存泄漏。
    Avg.Disk Queue Length:指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。该值应不超过磁盘数的1.5~2 倍。要提高性能,可增加磁盘。注意:一个Raid Disk实际有多个磁盘。
    Average Disk Read/Write Queue Length:指读取(写入)请求(列队)的平均数。
    Disk Reads(Writes)/s: 物理磁盘上每秒钟磁盘读、写的次数。两者相加,应小于磁盘设备最大容量。
    Average Disksec/Read: 指以秒计算的在此盘上读取数据的所需平均时间。
    Average Disk sec/Transfer:指以秒计算的在此盘上写入数据的所需平均时间。
    Network Interface:
    Bytes Total/sec :为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较

  • LR-使用port mapping方法录制foxmail时的注意事项

    2009-01-09 13:52:19

    LR-使用port mapping方法录制foxmail时的注意事项:

    1、做端口映射,输入本地端口;

    2、foxmail设置,SMTP及POP服务器127.0.0.1,端口为设置的本地端口;

    3、录制程序时选择loadrunner目录下的wplus_init_wsock.exe。

241/212>
Open Toolbar