发布新日志

  • Key

    2009-09-03 11:13:54

    global 100user
    AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    10000 web clients
    AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

    500 VU的LoadRunner 8.0 Global licence
    licence:
    BGAUGLIX-AJGI-AEIEKEKJJKEAFJP-BDFHW
    Valid until 31. 十月 2003
  • QC+SQL2005设置

    2009-04-28 19:14:47

    1.外围服务

    启动远程


    2.外围应用启动:

    即席远程查询
    数据库邮件
    OLE自动化
    SQL Mail
    xp_cmdshell


    3.登录方式

    SQL验证


    4.服务

    全改为本地

  • Loadrunner登录脚本认证失败的原因分析和解决方法

    2009-04-02 13:36:08

    测试对象:某Web即时通讯系统(以下称WebIM)

    开发语言:XML

    数据通讯协议:  Web(HTTP/HTML)协议、Windows Sockets协议

    底层数据库:Mysql

    服务器操作系统:Redhad 4

    脚本实现功能:登入系统后,再退出系统。

    问题1:录制开发的脚本可以成功回放,但是数据库的logout表里却查不到“登出”的用户?

    分析:录制的时候只选用了单协议:Web(HTTP/HTML)协议,而WebIM的实现不只用到了Web(HTTP/HTML)协议,也用到了Windows Sockets协议。在定位了问题的"原因"之后,笔者尝试录制多协议的脚本,结果回放失败。回放失败是因为Webim在登录的过程中有个加密验证的过程。脚本回放时提交了上一次的经过Sha1加密后的密文,而此时服务器端的Sha1密文已经发生了改变。从而导致了失败。

    解决方法:a、使用双协议录制脚本

                  b、开发Sha1算法的DLL文件并在脚本中调用。

    问题2:录制的脚本中并没有捕获到服务器返回的Session ID?

    分析和方案:Webim的开发用到了XML和Windows Sockets协议,因此按照正常的思路,Loadrunner在录制脚本时,也应该采用XML和Windows Sockets协议,但实际情况是这样的,录制的脚本中并没有捕获到服务器返回的Session ID。既然公司内网的Jabberd服务器有专门的测试客户端,笔者决定通过这个客户端录制脚本,由于这个客户端和服务器的通信协议是Windows Sockets,因此录制协议也采用了这个最底层的协议。这一次,录制的脚本中捕获到了服务器返回的Session ID。为了保证脚本回放时能够动态的获取到这个Session ID,需要做“关联”操作,笔者使用了lrs_save_searched_string()函数,对脚本做了处理。

    问题3:如何调用Dll来对服务器返回的序列和Password加密,以产生Sha1的密文?

    分析和方案:脚本中加载了Dll库文件后,在调用库文件中的加密函数对Session ID+Password字符序列加密时,必须采用如下格式endes(a,b),其中的a代表源序列,b代表密文。经过这样的步骤处理后,调试脚本,就可以看到密文了。

     

    问题4:Buf中参数化密文后,脚本还是不能编译通过,存在语法错误?

    分析和方案:发现Loadrunner参数化,是按照它内置的机制执行的,符合这个机制,编译就能通过。后来在Gen中的Tools—>general option中找到了可以更改这个机制的地方,修改完了之后,脚本再次编译,这次OK了。

    问题5:错误提示:没有足够的虚拟用户分配给这个NewPara?

    分析和方案:loadrunner中在对用户名和密码或其他数据参数化了以后,不要将参数删除后,重新参数化,否则就会出现上述问题。笔者决定重新录制脚本,重新参数化,重新修改脚本。事实证明这样做是正确的,编译运行后,5个虚拟用户的脚本正确无误的通过。

  • 修改 File 参数 100 为 1000【图例】

    2009-01-06 10:16:51

     

    如图

     

     

  • LR 进程机制

    2008-12-25 18:19:17

     

    今天测试了下 LR 的进程机制

    记录下

     

    一个进程:21M
    一个进程:50用户
    一个进程:54个线程

     

    ^_^

  • 牛人做的软件

    2008-12-25 11:31:26

     

    牛人做的软件

    不服都不行

    一定要记录下

    长这么大就没见过四位数线程的软件

    雷死俺耶

    彻底倾倒

    如图:

  • 修改换行符错误小技巧

    2008-12-08 17:54:23

    有时当你改了 N 次参数内容后
    还是提示换行符错误
    你可以在错误提示窗口里找到没有提示错误的脚本
    然后将正确的覆盖有错误提示的脚本里
    两字:“好使”
     
    错误提示:-13874 Error: missing newline in d:\test\a.dat
  • 错误为:27796 的解决方法

    2008-12-08 15:22:34

    负载机注册表
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里有如下两个键值:
    TcpTimedWaitDelay
    MaxUserPort
     
    1,这里的TcpTimedWaitDelay默认值应该中是30s,所以这里,把这个值调小为5s(按需要调整)。
    2,也可以把MaxUserPort调大(如果这个值不是最大值的话)。
     
     
     
    【Zee 原创】
  • [论坛] 如何发送 Byte 数组

    2008-12-08 15:17:36

    请教大侠们

    现在遇到一个难道

    如何通过 Sokets 发送 data.ws 里的 buf 发送数组数据

    数组内容:
               byte  bytes[5];
                bytes[0] = 0;
                bytes[1] = 0;
                bytes[2] = 0;
                bytes[3] = 170;
                bytes[4] = 0;

    本人已快发疯
    知道的仁兄告知下
    感激不尽
  • 脚本编写(3)

    2008-06-25 15:55:03

    Web用户Action

        在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的:

        * web_url是浏览器地址栏的URL.

        * web_link是点击在<a href= ...>和<a>之间的文本超链接。

        * web_image是点击HTML的<img href= link.

        * web_submit_form 是在前面操作的上下文中的GET或PUT表单上点“提交”--可能前面的操作被VuGen在基于HTML模式下录制下来了。

        * web_submit_data 是在GET或PUT表单上点“提交”,而没有带前面操作的上下文--可能是在基于URL模式下录制,或者是基于HTML模式,并且选择了“A scrīpt containing explicit URLs only”选项。

         不用HTML产生的资源是.gif和.jpg图片。资源属性的列表只能当对这些资源的路直选项设置成“Record within the current scrīpt step”时被插入。这也是默认的设置。

          如果你在“Tools > Internet Procotol > Recording”中选择“a scrīpt containing explicit URLs only”,这将会产生URL-based的脚本录制,只使用web_url和web_submit_data函数,将不会使用 web_link 和 web_image函数,或包含在 applets, XML, ActiveX或javascrīpt中的非HTML元素。

    Idea在进行下一页录制之前(如点击链接或者图标),暂停录制,把该页屏幕的标题拷贝下来粘贴到注释中。录制完成之后,这将会在后面的给事务命名上用到。

    Idea在每一个页面显示之后,暂停录制,把决定是否是期望页的文本拷贝下来,粘贴到注释中。录制完成之后,这将会用到文本验证检查点的脚本编写中。

         录制中产生的各种信息都保存在RecordingLog.txt文件中,删除它不会对脚本的回放产生影响。

    额外录制的Action脚本

        录制脚本的时候,当浏览器没有安装SSL根证书的时候,会捕获的下面这些代码行。这个信息意思是“这个证书不能被信任证书验证”。

       web_url("authrootseq.txt",

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt",
      "Resource=1",
      "RecContentType=text/plain",
      "Referer=",
      LAST);

    web_url("authrootstl.cab",

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab",
      "Resource=1",
      "RecContentType=application/octet-stream",
      "Referer=",
      LAST);
       录制脚本的时候,但浏览器遇到Macromedia flash组件的时候,会产生下面的代码行:
      web_url("version_en_win_ax.xml",
        "URL=http://fpdownload.macromedia.com/pub/flashplayer/update/current/xml/version_en_win_ax.xml",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=",
        "Snapshot=t8.inf",
        "Mode=HTML",
        LAST);
              如果你安装有Google Toolbar,即使你没有访问Google,也会录制上发到Google的请求。
        脚本语言规则:
         在LoadRunner中,大小写是敏感的,甚至在被检验的值中。所以上面的脚本会因为大写字母的原因,不会识别“Welcome”的。所以Steve Cheney 建议使用“ic”忽略大小写的文字标志:
         web_reg_find("Text/ic=Welcome",LAST);
         括号里的参数包含了LAST 是为了指定最后的一个参数。这样做是很方便的,因为上面的例子漏掉了一个指定期望是“found”还是“notfound”的属性。默认是“found”,所有我经常忽略它。
          另一个文本标志是“/BIN”用来指定是二进制的字符集。例如,查找“Adams”:
        web_reg_find("Text/BIN=\\x00A\\x00d\\x00a\\x00m\\x00s",LAST);
        注意两个反斜杠,一个是转义字符,代表是使用了一个符号。如果错误的只使用一个反斜杠,LR会认为它是一个空的终止。
              下面的例子脚本是在UTF8服务器上支持获得newquoteuid为UTF-16编码。因为LoadRunner中,UTF16编码的“Red”用ASCII是 R\x00e\x00d\x00 这样的,所以需要把它保存到buffer中。
        lr_eval_string_ext("{newquoteuid_temp}",
        strlen("{newquoteuid_temp}") + 2,
        &Buf, &BufLen, 0, 0, -1);
         对字符数组变量NewBuf使用lr_save_var函数来去掉额外的填充(x00):
        for (i=0; i if (Buf[i]!=0) NewBuf[NewBufLen++]=Buf[i];
        lr_save_var(NewBuf, NewBufLen-1, 0, "newquoteuid");
         注:lr_save_var 需要四个参数(不需要使用LAST)
         1.param_value 参数值
         2 value_len 参数的长度。
         3 options 参数的选项,一般为0
         4。param_name 参数名称
         LoadRunner 7.8不支持正则表达式,但是有他自己的通配符:
         为了使任何[0-9] 的数字在指定的数字位置,使用/DIG做标志:
         web_reg_save_param("pSer","LB/DIG=Serial XXX-###-ZZZZ","RB=\r\n", LAST );
         有三种使用^做通配符的方法:
         * 忽略大小写,并且允许在指定的字符位置使用任意字符:
           web_reg_find("Text/ALNUMIC=^ercury", LAST);
         * 允许任何小写字符[a-z] 在指定位置:
           web_reg_find("Text/ALNUMLC=^ercury", LAST);
         * 允许任何大写字符[A-Z]在指定的字符位置:
           web_reg_find("Text/ALNUMUC=^ercury", LAST);
         把一个字符串变成大写:strupr()
        错误信息:
         请添加一些其他的错误信息来帮助其他人:

        Could not resolve address of host ... [MsgId: MERR-27798]

        如果网络不能用或者域没有注册的话,显示一个404的DNS错误

        Contents unexpectedly not in cache. [MsgId: MERR-26549]

        当一个文件为空时会显示该错误。在空文件中添加空格来满足LoadRunner的错误检查。BTW,因为当创建的iframe没有文件时,IE会产生一个错误,这样就指定了一个空文件。

        事务时间脚本编写:

        Idea我更喜欢给一个action命名事务,而不是一个结果页面。

          lr_start_transaction("00.1 Invoke URL");
          ...
          lr_end_transaction("00.1 Invoke URL",LR_AUTO);
          ...
          lr_start_transaction("01.2 Top menu");
          ...
          lr_end_transaction("01.2 Top menu",LR_AUTO);

          lr_start_transaction("02.0 Updating");

            lr_start_sub_transaction("02.1 Update menu","02.0 Updating");
            web_url( ...
            lr_end_sub_transaction("02.1 Update menu",LR_AUTO);
            lr_start_sub_transaction("02.2 Update submit","02.0 Updating");
            web_submit_form( ...
            lr_end_sub_transaction("02.2 Update submit",LR_AUTO);
            lr_start_sub_transaction("02.3 Update OK","02.0 Updating");
            web_url( ...
            lr_end_sub_transaction("02.3 Update OK",LR_AUTO);


          lr_end_transaction("02.0 Updating",LR_AUTO);

        Idea我喜欢在一个层次结构中使用0填充的事务名称,这样来确保控制器能够正确的给事务排序。

        Idea我对不同类型的action上的事务名称上加不同的关键字
      • Contact Link = Click "Contact" link on Menu
      • Contact Icon = Click "Contact" Icon
      • Regis. Sub = Page Submit
      • OK = Pop-up dismiss with OK

          事务名可以是变量,但是它只能被VuGen作为字符串来编译,不能在控制器的接口中显示。无论如何,他们会显示在分析结果文件中。

           对于web脚本,LR自动创建和决定事务的的持续时间,但是C语言脚本可以使用这些函数:

           使用lr_start_transaction_instance函数来显式获得指定事务实例的句柄,事务名称在函数lr_user_data_point_instance或lr_user_data_point_instance_ex中使用。

            使用 lr_start_sub_transaction在一个事务中来操作思考时间和消耗的时间.

       

       

      转自〖zibeike

    • 脚本编写(2)

      2008-06-25 15:47:45

      VUser_Init部分

      这里是Vuser_init部分的一些例子:

      操作系统的User ID

      下面显示了使用advapi32.dll的GetUserNameA函数获得的操作系统的用户ID

      	char	sUserID[1024]; // Maximum possible UserID length.
      	long	lUserIDSize = sizeof(sUserID)-1;
      	int 	rc;
      
      	rc=lr_load_dll("advapi32.dll");
      	if( rc != 0 ){
      		lr_error_message("lr_load_dll of advapi32.dll failed. Aborted for rc=%d",rc);
      		lr_abort(); 
      	}else{
      		GetUserNameA(sUserID, &lUserIDSize);
      		lr_message("UserID='%s'", sUserID);
      	}
      所有的变量声明需要一块放到最上方。在vuser_init 部分创建的本地C变量(如 int或char)对其他部分的脚本是不可见的。所以使用lr_save_string函数来创建对所有脚本可用的全局参数。例子:
         
      char *itoa ( int value, char *str, int radix ); 
      vuser_init(){ 
      	int x = 10;
      	char buffer[10]; 
      	lr_save_string( itoa( x, buffer, 10) , "pX" ); 
      	lr_message ( "int x = %s", lr_eval_string("{pX}" )); 
      return 0;
      } 
       
       
      运行时设置的附加属性(Additional Attribute)
        8.0版本引进了一个非常有价值的特性:在运行时设置中指定属性,这个属性可以对不同的虚拟用户组设置不同的值。
       
       下面的代码是从运行时设置的附加属性中读取名为“usertype”的参数。然后使用参数值来对应的设置全局的"thinktime1"变量。
         
      int thinktime1=0;
      vuser_init()
      {
        LPCSTR strUsertype; // Define *str.
        strUsertype = lr_get_attrib_string("usertype");
        if (strUsertype==NULL){
          lr_output_message("### Run-time Settings Additional Attribute usertype not specified. Cannot continue.");
          lr_abort();
        }else{
          lr_message("### Run-time Settings Additional Attribute usertype=\"%s\"", strUsertype );
          if( strcmp( strUsertype,"advanced") == 0 ){ thinktime1=2; }
          else
          if( strcmp( strUsertype,"intermediate") == 0 ){ thinktime1=4; }
          else
          if( strcmp( strUsertype,"basic") == 0 ){ thinktime1=8; }
          else{
            lr_error_message("### ERROR: Value not recognized. Aborting run." );
            lr_abort();
          }
          }
          return 0;
        }
         
        Time Structure Fix(不知道怎么翻译,呵呵,“时间结构的解决“?)
        根据知识库34195的文章,默认当前时间戳的毫秒部分不被更新,除非ftime使用的时间结构被重新定义:
        typedef long time_t; 
        struct _timeb { 
           time_t time; 
           unsigned short millitm;
           short timezone; 
           short dstflag; 
        }; 
        struct _timeb t; 
        _tzset(); \\ 使用ftime设置变量 
        _ftime( &t ); 
        lr_message( "Plus milliseconds: %u", t.millitm ); 
        
        控制信息的显示:
        在运行时,当脚本的事务失败后继续,你怎么知道哪个用户失败了?
         Idea在每个失败的事务之后,发出一个能够唯一确定该用户的信息。
        Loadrunner提供了一些函数来在运行时显示信息:
           
      • // 往输出日志上发送消息,这个消息前边会带有action 的名称和行数
        lr_output_message("an output message");

        例子:

        • Actions.c (4): an output message

      • // 往输出日志和虚拟用户日志上发消息:
      • lr_message("*** a message"
          +"\r"+"A new line."
            );
      • Idea把");"放到另一行,这样可以容易的在命令上添加或者删除代码项。

        UNIX/Linux机器上,使用 "\n"来添加一个换行。

        Windows 机器上,使用"\r"来添加一个换行。

        // 往输出日志上发送不带action名称和行数的信息
        lr_log_message("number\t"+ numvar +"\t");

         

        // 只给控制器上的虚拟用户状态区域发送信息(当在VuGen中运行时,只是简单的显示):
        lr_vuser_status_message("a vuser status message");

         

        // 给LoadRunner控制器或者Tuning模块的控制台输出窗口显示一个红色高亮度显示的-17999 信息。
        lr_error_message("an error message");

         

        Idea 使用lr_error_message将会使日志信息堆栈在每个新的action开始时被自动清空。如果选择了"当错误发生时才发送消息", 这些信息仍然被创建在"日志信息堆栈"里, 但是被压缩了(没有显示),直到监测到一个错误

      • 脚本编写

        2008-06-25 15:47:03

        VuGen脚本文件的开发过程

        1。定义测试项目的目标,环境,脚本,测试数据,硬件等。脚本应该符合编码规范或编码习惯。

        2。创建一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获的.png/.gif图形文件,录制过程保存的html文件,录制中的所有html源文件和VuGen的录制日志

        3。列出(在表里)每一个手动操作业务过程需要的实际步骤

        1)截取每一个屏幕图像(screen image )。

        2)为每一个屏幕(screen)分配一个唯一的事务名称。

        3)为处理的每一个步骤使用的技术组件(URL或者方法和函数)做注释。

        4。创建一个版本文件夹。

        注:我不喜欢使用默认位置,我喜欢把所有脚本相关的文件放到一个相同的文件夹中。不幸的是,这意味着如果我在不同的测试间互相交换录制,那我每次都得记住修改默认的设置。

        注:当录制一个新的脚本时,我喜欢选择多协议而不是单个协议。。。

        5。根据你的业务处理列表上指定的用户使用步骤和screen的顺序来使用VuGen录制程序,产生一系列脚本代码。在“开始录制”对话框中

          * 使用COM/DCOM 协议时,选择“Win32应用程序“

          * 使用Web(HTTP/HTML)时,选择“Internet Application“

        6。根据改进脚本方法和脚本语言规则来修改脚本。

           改进脚本的方法:

           1)为每一个GUI的screen添加事务语句来获得事务时间。

           2)添加显示数据来帮助调试。

           3)添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。

           4)通过插入新参数和动态获得整个文件的方式对硬编码的URL,用户id,用户密码和其他的变量数据进行参数化。这样脚本中的参数就可以被动态的替换,以此来模拟运行时不同数据的使用。

           5)添加重试逻辑(retry logic)来处理不可见的错误。

           6)添加随机函数发生器变化脚本来模拟真实的负载。

           7)添加if/else逻辑来检查结果,或者来进行合适的操作,或者来在合适的时候退出脚本。

           8)在一个screen中添加语句来捕获需要在其他命令中使用的数据。当使用Microsoft .NET的web form技术的时候,需要避免习惯性的“脚本超时“错误。

           9)添加语句来调用外部库函数,以便保存和检索在内存Virtual Table Server中的数据。

           10)处理XML.

           11)添加语句来模仿客户端的Javascrīpt问题。

           12)添加语句来管理超时。

           13)从事务计时器中计算和减去无效的时间。

           14)输出日志。

           15)添加集合点。

           16)添加时间(Timing)。

        脚本语言规则:

            把cookie代码标注出来(因为脚本运行的时候他们被再次执行)。

        7。通过在VuGen中运行来调试和调整脚本(单个用户),同时运行时设置的日志能够显示如下信息:

            辨别和解决脚本编辑错误。

            决定timing.

            设置初始运行设置的场景。

        8。在控制器中使用full test Runtime Settings来运行脚本。

        脚本录制和产生:

        建立一个新脚本的第一步是选择一个单协议或多协议。

            * 一些协议可能在多协议模式下不能用。 

            * 只有在多协议的GUI下你才能重新排列action

         在使用Java协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误:

           Error: Failed to find javac.exe Java Compiler in Path and JDK installation folder   in registry. [MsgId: MERR-22981]
           Error: Failed to get JRE version. Check that your PATH environment variable contains \bin directory. [MsgId: MERR-22986]

        当选择Java协议的时候:

           * 只有选择了“RMI Java”才能录制。

           * 如果选择“Java user”,“开始录制”图标或菜单是灰色的。

        当你打开一个新的脚本时,默认的脚本名称为“noname1”。下一个新的脚本名称为“noname2”,以此类推。

        注:有顺序的录制多个动作(而不是录制一个动作,然后停止开始另一个动作)。这样能使你识别出在你脚本中需要关联的序列码(在例如PeopleSoft的程序中)。

        注:每次修改脚本后,脚本都需要重新编译。

        Java:略

        脚本文件的调用:

            VuGen是默认在你双击.usr后缀文件的时候被调用。

             在这个文件里,Javascrīpt被指定为“Type=General-Js”。

        为了避免重新编译,我使用命令行的变量和值得组合这样的批处理文件来调用控制器。例如:

          

          REM LoadRun from LoadRunner 8.0 default installation location:
          SET LR80=C:\Program Files\Mercury Interactive\Mercury LoadRunner\bin
          cd %LR80%
          wlrun.exe -TestRun c:\Temp\Scenario1.lrs
          -port 8080

        脚本文件Action

          主机上的代理发送的到服务器的请求是由虚拟用户生成器创建的(VuGen.exe)action的回放实现的。

          Loadrunner创建的脚本有三部分:

          * vuser_init 来初始化 Vuser。执行在这部分的虚拟用户的状态是"Init"

          * Action 用来重复多次迭代  执行到这部分的虚拟用户的状态是"Running"

          * vuser_end 推出虚拟用户。 执行到这部分的虚拟用户的状态是"Exiting"

        如果你的脚本只需要执行一次,你仍然需要把这些脚本写到Action部分,因为在其他部分(vuser_init 和vuser_end)有些命令是不合法的或者会忽略掉。

        VuGen允许脚本包含多个action。所以我为每一个screen创建一个新的action。

        注:如果你想使用不同的用户登陆,就不要把登陆操作放到vuser_init中,而是放到action部分。

        VuGen根据选择脚本选择协议的不同来添加不用的引用到“.h”头文件。

        C的.h头文件

        对于Web(HTTP/HTML)协议,

        创建globals.h,包含内容:

          

        #ifndef _GLOBALS_H
        #define _GLOBALS_H
        
        //--------------------------
        // Include Files
        #include "lrun.h"
        #include "web_api.h"
        #include "lrw_custom_body.h"
        	// recorded for web_custom_request functions.
        //--------------------------
        // Global Variables
        
        #endif // _GLOBALS_H
        

        对于COM/DCOM协议:略

        C脚本语言的格式:

        LoadRunner使用的没有进行微软扩展的ANSI C语法任意最小的action代码块如下:

        #include as_web.h // from LoadRunner's include folder.
        Action1()
        {
        	/* comment block 
        	*/
        
        	// comment line
        
        return 0;
        }
        

        C脚本编译/类库

        当VuGen编译脚本时,产生一个"pre_cci.ci"文件,这个文件包含了所有action的代码和包含文件。这就是为什么会有语法错误“not writing pre_cci.ci”的原因。

        控制器编译这些.ci文件为机器目标码。

        VuGen在每一个脚本文件中自动创建一个lib文件夹,这个文件夹中包含了combined_lib.c文件。该文件包含了所有引用文件。

          #include "lrun.h"   来定义 UNIX或者Windows的函数。
          #include "globals.h"  LoadRunner'的模版文件夹的其中一个。

          #include "vuser_init.c"
          #include "Action.c"
          #include "vuser_end.c"

         警告:当你使用类库中的函数却没有正确包含该类库的时候,你会收到一条错误信息:

          Error -- Unresolved symbol

        C类库

          LoadRunner 使用 A website external to this site 1994 GNU C Pre-Processor options 和 A website external to this site 1995 LCC-win32 Retargetable C Compiler/Linker from the Free Software Foundation via Chris Fraser of AT&T and Dave Hanson of Princeton.

         附加的函数定义在zip file ANSI C library中。

        外部的没有返回整型数的C函数需要在脚本的开头进行显式声明。例如,string函数中的 string tokenizer:

        extern char* strtok(char *token, const char *delimiter);

        Java语法:略

           OK,先到这里,休息一下,下期接着翻译LR脚本相关知识.

      • Key

        2008-06-25 15:39:06

         

        golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI

        500VU: BGAUGLIX-AJGI-AEIEKEKJJKEAFJP-BDFHW

        web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

         

      • 关联函数web_reg_save_param的设置

        2008-06-25 14:45:54

         

         

        问题提出:如何对关联的数据进行字符串操作。下面使用了LoadRunner自带的订票例子为例,进行了这方面的试验。假设我要关联的数据是由几个字符串组成的。如何使这些字符串组成一个参数,供我后面的函数使用?

         

        解决方法: 使用多个关联函数,对关联参数进行字符串操作,最后把生成的字符串保存成一个参数,供下面调用该参数的函数使用。

         

        脚本如下:

        Action()

        {

            int number1,number2;

                char session11[1000];

                char string[1000];

                int length;

                char *stringtemp;

                //char session22[20];

                web_reg_save_param("session1","LB=name=userSession value=","RB=.","Ord=ALL",LAST);

                web_reg_save_param("session2","LB=.","RB=<table border=0><tr><td>&nbsp;</td>","Ord=ALL",LAST);

               

         

                web_url("WebTours",

                       "URL=http://127.0.0.1:6080/WebTours/",

                       "Resource=0",

                       "RecContentType=text/html",

                       "Referer=",

                       "Snapshot=t1.inf",

                       "Mode=HTML",

                       LAST);

         

                strcpy(string,"");

                strcpy(string,lr_eval_string("{session1_1}"));

         

                //strcpy(session1,"");

         

                sprintf(session11,"{session2_1}");

                strcat(string,".");

                length= strlen(lr_eval_string(session11));

                length=length-2;

         

                number1=atoi(lr_eval_string("{session1_count}"));

                number2=atoi(lr_eval_string("{session2_count}"));

         

                lr_output_message("%d,%d",number1,number2);

         

                //lr_output_message("%d",length);

                 stringtemp=lr_eval_string(session11);

                strncat(string,stringtemp,length);

                //srcat(string,session11);

         

                lr_save_string(lr_eval_string(string),"session");

         

                lr_output_message("%s",lr_eval_string("{session1_1}"));

                lr_output_message("%s",lr_eval_string("{session2_1}"));

               

                web_submit_data("login.pl",

                       "Action=http://127.0.0.1:6080/WebTours/login.pl",

                       "Method=POST",

                       "RecContentType=text/html",                   "Referer=http://127.0.0.1:6080/WebTours/nav.pl?in=home",

                       "Snapshot=t2.inf",

                       "Mode=HTML",

                       ITEMDATA,

                       "Name=userSession", "Value={session}", ENDITEM,

                       "Name=username", "Value=jojo", ENDITEM,

                       "Name=password", "Value=bean", ENDITEM,

                       "Name=JSFormSubmit", "Value=on", ENDITEM,

                       "Name=login.x", "Value=50", ENDITEM,

                       "Name=login.y", "Value=10", ENDITEM,

                       LAST);

                lr_output_message("%s",lr_eval_string("{session}"));

         

                return 0;

        }

         有两个关联的参数,session1session2,最后生成session,被web_submit_data函数调用。蓝色部分是需要特别注意的地方。

        脚本编写调试过程中遇到的问题和解释:

        1.  web_reg_save_param()中如果没有指定Ord=ALL的话,默认是取的第一个符合左右边界的值,这样我们使用关联的参数时可以直接使用变量名,如session1

        2.  web_reg_save_param()中如果指定Ord=ALL的话,会生成一个数组,这样想取某个参数的话,需要使用的参数名需要加_和数组中的位置,如例子中取第一个session1_1,如果这时候仍然用session1,是取不到参数的值的.

        3.  顺序问题:对关联参数相关的操作,需要放到包含该关联数据的请求函数之后,如上紫色部分代码用到关联的参数的语句,都需要放到web_url()之后,否则也不会取到关联的数据

        4.注意lr_eval_string()函数和lr_save_string()函数的用法..

         

         

        〖转自:zibeike〗

      • 博客

        2008-06-25 14:43:22

        【性能】


        http://www.myloadtest.com/

        1。LOADRUNNER 架构

        2。Loadrunner的脚本

        3。性能监视器

        4。性能调优等

         

         


        http://www.blogjava.net/xingcyx/archive/2006/12/28/90498.aspx

         

        http://dev2dev.bea.com/pub/a/2005/09/performance_testing.html

         

        【功能】

         

         

         

        【管理】

      Open Toolbar