在这里积累学习中的点点滴滴!

发布新日志

  • 如何分析LR测试结果

    2009-08-19 16:20:41

        认识LR已经好久了,很久以前就觉得自己会用LR了,简单的录制脚本然后参数化,而后再跑上N多用户,PASS就证明系统OK了,但也从不敢说我熟悉LR,最近比较有时间认真的看过Analysis手册之后才发现一直以来从未深入了解的结果分析是如此的了得!在这里浅谈一下吧!

        LR在运行场景或会话步骤时,数据将存储在扩展名为.lrr 的结果文件中。Analysis是处理收集的结果信息并生成图和报告的实用程序。在使用 Analysis 实用程序时,可以在会话中进行工作。Analysis 会话至少包含一组场景或会话步骤结果(.lrr 文件)。Analysis 将活动图的显示信息和布局设置存储在扩展名为.lra 的文件中。 (引用哦)打开Analysis的方法不多说,下来说一下如何分析。

        在结果的概述信息中可以大概了解系统的性能,一般用的比较多的就是事务的平均响应时间了,以及整个系统的响应时间,在这里可以直接判定系统是否符合性能需求,但这并不是一个真正了解系统性能的地方,每个运行结果都应该详细的做进一步的深入了解,这样我们就需要在多个图表中对比查看进行结果的分析了,以下是我个人的了解了:

    第一个看的是平均事务响应时间图,由此图可以看到事务所占用时间的走向,例如,此图中的数据走向趋高就证明系统的事务处理时间不正常,需要进一步的分析为何事务响应时间一致走高,那么此时就需要打开网页细分图了。

    (到这里就会知道为何要插入事务因为不同的事务操作的页面不同,就可以重点的分析问题了,就好比在告诉你“看看1000个用户时系统的性能”与“看看1000个用户并发登录系统时的性能”一样,换句话说就是让你知道我要找哪里的问题!但是具体该怎么定义事务就要看自己的需要了!)

    第二个看的是网页细分图,在网页细分图中就可以查看页面的详细参数包括DNS解析时间,连接服务器花费时间,第一次缓冲时间、SSL握手时间、页面组件下载时间、接受时间等,这个时候基本就可以判断出来时间花费在哪里,然后再去定位问题。比如显示第一次缓冲时间过长则去查看第一次缓冲时间细分图查找问题在服务端还是网络上。

       目前我觉的这两个图是最能说明问题的,但是前提是其他业务数据都是正常的,如何判定其他业务数据的正确性呢,这就需要根据事务图、用户图等来综合判定了!

       好了就到这里,原以为会写很多文字,但是总结一下也就这么多了,以后如果还有的话会继续写!这些东西有不到的地方还请谅解,有意见或建议经提出来大家共同学习了!


     

  • LR运行参数设置

    2009-08-18 14:39:00

    LR Record Options设置说明: 

    Recording分为两种类型

    HTML模式录制是把一个页面全部录制在一个请求里面,然后再分开录制,所以在一个请求里面就会有包含全部信息;
    URL模式会把不同的请求分开录制,一个页面打开可能有非常多的请求,LR为了要在这个模式下模拟并发情况,就用web_concurrent这个函数把同一个页面并发的情况包括起来,这样在运行脚本的时候就同时进行请求。

    Advanced

    录制脚本中含有乱码时,需要设置字符集为UTF-8

    Correlation

    是否设置自动关联

    Run time-Seting

    General->Logic 脚本运行时执行的次数

    General->Log 设置显示的日志级别,

  • LR做关联的相关说明

    2009-08-13 18:01:49

  • loadrunner- winsock 函数 一览表【转】

    2009-05-30 14:40:12

     

    lrs_accept_connection 接受侦听套接字连接

            lrs_close_socket 关闭打开的套接字

     

            lrs_create_socket 初始化套接字

     

            lrs_disable_socket 禁用套接字操作

     

            lrs_exclude_socket 重播期间排除套接字

     

            lrs_get_socket_attrib 获取套接字属性

     

            lrs_get_socket_handler 获取指定套接字的套接字处理程序

     

            lrs_length_receive 接收来自指定长度的缓冲区的数据

     

            lrs_receive 接收来自套接字的数据

     

            lrs_receive_ex 接收来自数据报或流套接字的数据(具有特定长度)

     

            lrs_send 将数据发送到数据报上或流套接字中

     

            lrs_set_receive_option 设置套接字接收选项

     

            lrs_set_socket_handler 设置特定套接字的套接字处理程序

     

            lrs_set_socket_options 设置套接字选项

     

    缓冲区函数

            lrs_free_buffer 释放分配给缓冲区的内存

     

            lrs_get_buffer_by_name 从数据文件中获取缓冲区及其大小

     

            lrs_get_last_received_buffer 获取套接字上接收到的最后的缓冲区及其大小

     

            lrs_get_last_received_buffer_size 获取套接字上接收到的最后一个缓冲区的大小

     

            lrs_get_received_buffer 获取最后接收到的缓冲区或其一部分

     

            lrs_get_static_buffer 获取静态缓冲区或其一部分

     

            lrs_get_user_buffer 获取套接字的用户数据的内容

     

            lrs_get_user_buffer_size 获取套接字的用户数据的大小

     

            lrs_set_send_buffer 指定要在套接字上发送的缓冲区

     

    环境函数

            lrs_cleanup 终止 Windows 套接字 DLL 的使用

     

            lrs_startup 初始化 Windows 套接字 DLL

     

    关联语句函数

            lrs_save_param 将静态或接收到的缓冲区(或缓冲区部分)保存到参数中

     

            lrs_save_param_ex 将用户、静态或接收到的缓冲区(或缓冲区部分)保存到参数中

     

            lrs_save_searched_string 在静态或接收到的缓冲区中搜索出现的字符串,将出现字符串的缓冲区部分保存到参数中

     

    转换函数

            lrs_ascii_to_ebcdic 将缓冲区数据从 ASCII 格式转换成 EBCDIC 格式

     

            lrs_decimal_to_hex_string 将十进制整数转换为十六进制字符串

     

            lrs_ebcdic_to_ascii 将缓冲区数据从 EBCDIC 格式转换成ASCII 格式

     

            lrs_hex_string_to_int 将十六进制字符串转换为整数

     

    超时函数

            lrs_set_accept_timeout 为接受套接字设置超时

     

            lrs_set_connect_timeout 为连接到套接字设置超时

     

            lrs_set_recv_timeout 为接收套接字上的初始预期数据设置超时

     

            lrs_set_recv_timeout 为建立连接后接收套接字上的预期数据设置超时

     

            lrs_set_send_timeout 为发送套接字数据设置超时

     

            录制会话之后,通过 VuGen 的内置编辑器可以查看录制的代码。您可以在脚本中滚动,查看应用程序生成的函数,并检查传输的数据。在主窗口中查看脚本时,可以看到VuGen 录制活动的顺序。在典型的会话期间,将录制下列函数顺序:

     

            lrs_startup 初始化 WinSock DLL

     

            lrs_create_socket 初始化套接字

     

            lrs_send 在数据报上或者向流套接字发送数++++++++++++++++++++++++++++++++++++++++++++++++++++

     

            lrs_receive 接收来自数据报或流套接字的数据

     

            lrs_disable_socket 禁用套接字操作

     

            lrs_close_socket 关闭打开的套接字

     

            lrs_cleanup 终止 WinSock DLL 的使用

            VuGen Windows 上使用 Windows 套接字协议支持应用程序的录制和重播;而在UNIX 平台上仅支持重播。

     

  • 使用Socket协议测试的一个小结

    2009-02-02 13:05:49

    在完成过程中碰到了很多的问题,初步整理如下:

     

    1、程序之间的通信使用的是非标准WinSocket协议,无法直接录制脚本,因此采用直接采用在LR中编写脚本的方法,由于自身对socket协议的不熟悉所以花费了较多的时间。

     

    2、编写好的脚本在使用时直接发送协议中的字符串到这客户端,客户端程序无法识别,因此在模拟服务器(使用WinSocket协议)的基础上采用了录制脚本的方法,但是录制的脚本在参数化后在LR中发送的缓冲区数据包含如“\0”之类的内存值,无法发送缓冲区数据,使用lrs_length_send 函数同样不可提示9015错误,采用字符串拼接的方法亦不通,此处花费的时间也是较多的,在此对于LR 的lr_eval_string函数,使用的比较多也因此熟悉的C语言函数与LR函数参数转换的方法。

     

    3、使用DLL编写消息格式转换函数,按照输入参数返回各个不同消息的最终格式,因缓冲区的内存值委托问题同样未果。

     

    4、最后使用的自己的消息发送函数可成功发送消息,在DLL直接调用C语言的SOCKET函数发送转换好的数据,且数据转换后的格式正确,唯一不足的是以客户端的角度去发送消息到客户端(原为服务端到客户端),而客户端接收服务端的消息使用的是与客户端不同的消息回调函数,因此不可识别LR以客户端发送服务端到客户端的消息,现需要协调客户端与脚本之间的消息识别。

     

    收获总结:

    • LR中调用DLL
    • DLL的编写格式
    • C语言中socket收发消息的基本了解
    • LR中直接编写脚本的初步尝试
  • lr_save_string 使用介绍【转】

    2009-01-12 11:27:44

    一、lr_save_string 使用介绍
    1.该函数主要是将程序中的常量或变量保存为lr中的参数。
          int lr_save_string (const char *param_value, const char *param_name);

          函数目的:param_value值保存到param_name变量中

          参数介绍:param_value:要保存的值

                             param_name 变量名称
    char *tmp="hello";
    lr_save_string("777","page");
    lr_output_message(lr_eval_string("{page}"));   

    //将变量保存为参数,tmp为变量
    lr_save_string(tmp,"page");

    lr_output_message(lr_eval_string("{page}"));


    结果:777

        hello
        

    二、sprintf函数

    定义函数
    int sprintf( char *str,const char * format,.........);
    函数说明
    sprintf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。
    返回值
    成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。
    附加说明
    使用此函数得留意堆栈溢出,或改用snprintf()。
    范例
    #include<stdio.h>
    main()
    {
    char * a=”This is string A!”;
    char buf[80];
    sprintf(buf,”>>> %s<<<\n”,a);
    printf(“%s”.buf);
    }
    执行
    >>>This is string A!<<<
    常用该函数代替itoa,将整数格式化为字符串形式。
    如:
    int page=0;
    char page_ch[56];
    page=page + 10;
    sprintf(page_ch,"%d",page);

  • Error -27791 connection prematurely错误解答【转】

    2008-12-25 16:00:12

    Error -27791 connection prematurely错误解答
    运行Controller时遇到这个error:
    Action.c(7): Error -27791: Server "10.10.0.88" has shut down the connection prematurely
    解决方案如下:
    1、应用服务器死掉。小用户时程序上的问题,程序上处理数据库的问题
    2、应用服务没有死。应用服务参数设置问题。例如:在许多客户端weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是weblogic中的server元素的acceptbacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%。
    3、数据库的连接
    在应用服务的性能参数可能太小了
    数据库启动的最大连接数(跟硬件的内存有关)
    4、有时关闭卡巴斯基也会解决如上问题
  • 有关WinSocekt 协议录制LR脚本

    2008-12-23 10:45:42

    看到大家都说WinSocekt 协议属于底层协议,不太常用,可是因为工作原因,我接触到的项目都是WinSocekt 协议协议,还有一些直接用Socket协议编写的程序,因此在Socekt协议这里花费了大量的时间。

    先说说WinSocekt 协议

    选择此协议录制的脚本除vuser_ini、Action、 vuser_end三大部分之外还有一个存放所收发数据包的data.ws文件,在data.ws文件中按照如下格式存放数据:

    send buf0 50  

    //send 表示准备发生的数据包  recv 表示预期接收的数据包

    //buf0表示所要发送的数据名称

    //50表示所要发送数据的长度
     "\x00"
     "2"
     "\x00\xbe\x00\x01\x03"
     "#"
     "\xbe\x00\x00\x00\x01\x00\x00\x00\x1e\x00"
     "4"
     "\x00\x01\x00"
     "オ"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00"
    在WinSocekt 协议中参数化方法:

    在data.ws文件中,按照常规的方法,选择需要参数化的数据右点选择参数化即可

    在WinSocekt 协议中做关联方法,下面的链接可以看到详细描述,这里就不多说了。

    http://www.51testing.com/?17369/action_viewspace_itemid_14091.html

     

    前一段时间还碰到一个使用Socekt协议的项目,因为无法使用LR直接录制所以自己写了一个WinSocekt 协议脚本,因为第一次写脚本所以走了很多的弯路,o(∩_∩)o...不过这本身也是一个学习的过程,先说说基本的做法吧(在LR中有关socekt的函数都是lrs开头的)

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

    参数说明:

    S_desc: 要初始化的套接字标识符,如 socket0

    type:  套接字类型,有 TCP UDP 两种。

    LocalHost:    绑定套接字的本地地址、端口,如 LocalHost=4002,也可以在端口前面加上

    本机名称或 IP 地址,如 LocalHost=overn:4002,或 LocalHost=168.3.4.127:4002。可选。

    peer: 处理套接字请求的远程机端口,如 RemoteHost=168.3.1.230:6666。可选。

    backlog:  请求连接队列的最大长度,如 backlog=20,可选。

    LrsLastArg: 参数结束标志

    返回值:

    初始化成功返回     0;如果是    VuG   错误则返回    VuG   错误码,如果是套接字错误则返回Windwos套接字错误码

    用法:

    lrs_create_socket("socket0", "UDP", "LocalHost=4002",   LrsLastArg);

    lrs_create_socket("socket0", "TCP", "RemoteHost=168.3.1.230:6666",  LrsLastArg);

    函数说明:

    lrs_create_socket 函数用来初始化一个套接字。该函数通过执行 socket 命令来打开一个

    新的套接字连接。如果提供 LocalHost 参数它将执行 bind 命令来绑定该套接字;如果指定 peer

    参数它将执行 connect 命令和远端主机建立一个连接;如果提供 backlog 参数将会执行 listen

    命令来侦听该套接字。Backlog 对队列中等待服务的请求的数目进行了限制,大多数系统缺

    省值为 20。如果一个服务请求到来时,请求队列已满,该 socket 将拒绝连接请求,客户端

    将会收到一个出错信息

    指定 LocalHost 时可以在端口前加上主机名(如"LocalHost=overn:80",如果主机的 IP

    址是绑定的也可以指定为它的 IP 地址,如"LocalHost=168.3.4.127:6666"

    该函数在客户端或服务器端的 Windows       Socket 会话期间都会被自动记录,如果是客户

    端会话则 peer port 两个参数会被记录,如果是服务器端则会记录 port backlog

    上面是create函数的详细描述,由此可用知道如果作为客户端的程序只需要指定一个远程主机的IP地址、端口即可:

    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.4.98:8690", LrsLastArg)

    作为服务端需要多一个backlog参数,比且需要一个lrs_accept_connection接受侦听套接字。且需要创建一个用来发送数据的socket1,

    lrs_create_socket("socket0", "TCP", "LocalHost=8690", "Backlog=1", LrsLastArg);

    lrs_accept_connection("socket0", "socket1");

    创建好套接字后就可用按照需要的顺序收发数据了,如果是自己写的话还需要根据程序协议的需要在data.ws文件中按照格式添加buf数据包。

    到最后用完socket的时候不要忘记关闭套接字,通常初始化套接字在vuser_ini中使用lrs_startup函数,该函数指定应用程序可用的 windows 套接字的最高版本

    终止套接字在vuser_end中调用lrs_cleanup函数。

    目前就了解这样一个顺序,还有许多有疑惑的地方,希望大家可以多多指教,共同学习。

    我这里由一个中文版的winsocket 函数的详细描述,因为上传不了所以有需要的化可用给我发邮件

  • loadrunner中调DLL中自定义的函数

    2008-12-23 09:55:25

     

                                      

    在loadrunner中调用动态链接库中的自定义函数,写一个很简单的例子,我想复杂应用过程也应该差不多。

     

    自己做一个DLL文件:

    打开VC,新建一个项目:project->Win32 Dynamic-Link Library方式,然后跟着向导操作,在选择类型时选择“A DLL that exports some symbols”,完成之后VC就打开工作区了,

    在 ZLTEST.cpp 中添加自定义的函数,很简单,就是返回传入的值。

    int fun(int  x)

    {

       return x;

    }

    在 ZLTEST.h 添加下面的代码:

    extern "C" _declspec(dllexport) int fun(int x); 

     

    运行,Debug文件夹中生成ZLTEST.dll 和 ZLTEST.lib文件。

     

    将ZLTEST.dll文件拷贝到 LoadRunner脚本的文件夹下,在LoadRunner脚本中添加代码:

    Int x=1000;

    Int ret;

    ret = lr_load_dll("ZLTEST.dll");   //加载DLL库

        ret=fun(x);//调用ZLTEST.dll文件中自定义的fun(int x)函数

        lr_output_message("DLL值= %d", ret);//输出函数返回值

     

    这样在loadrunner脚本中就调用了自定义的函数了。

    备注:在自己使用的时候如果使用char * 的参数必须使用lr_eval_string("parameter"),否则LR会报C  运行错误。

     

    全局的动态链接库的调用则需要修改mdrv.dat,路径在LoadRunner的安装目录下面(LoadRunner/dat directory);在里面修改如例:

    [WinSock]

    ExtPriorityType=protocol

    WINNT_EXT_LIBS=wsrun32.dll

    WIN95_EXT_LIBS=wsrun32.dll

    LINUX_EXT_LIBS=liblrs.so

    SOLARIS_EXT_LIBS=liblrs.so

    HPUX_EXT_LIBS=liblrs.sl

    AIX_EXT_LIBS=liblrs.so

    LibCfgFunc=winsock_exten_conf

    UtilityExt=lrun_api

    ExtMessageQueue=0

    ExtCmdLineOverwrite=-WinInet No

    ExtCmdLineConc=-UsingWinInet No

    WINNT_DLLS=user_dll1.dll, user_dll2.dll, ...

    //最后一行是加载你需要的DLL

    这样你就可以在LR中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。

     

Open Toolbar