发布新日志

  • LoadRunner常用函数

    2009-01-06 13:36:24

      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页内的动态信息创建参数(使用嵌入边界)
  • 性能瓶颈??

    2008-12-19 14:31:50

    性能瓶颈实际上就是一个软件的性能缺陷

      那我们如何最通俗的理解“性能瓶颈”

      (1)硬件上的性能瓶颈

          主要指的是CPU、RAM方面的问题。

          例如,

          在进行软件需求分析、概要设计时,确定了在数据库服务器上需要6个CPU、12G内存,

          但是在测试时,发现CPU的持续利用率超过95%,

          这时可以认为在硬件上出现了性能瓶颈。

      (2)应用软件上的性能瓶颈

          一般指的是应用服务器、WEB服务器等应用软件,还包括数据库系统。

          例如,

          在WEBLogic平台上配置了JDBC连接池的参数,最大连接数为50,最小连接数为5,增加量为10。

          在测试时发现,当负载增加时,现有的连接数不足,系统会动态生成10个新的连接数,这样导致了交易处理的响应时间大大的增加。

          这时可以认为在应用软件上出现了性能瓶颈。

      (3)应用程序上的性能瓶颈

        一般指的是开发人员新开发出来的应用程序。

        例如,

          用Java或者C开发出来的部署在应用服务器上用于用户交易请求处理的应用程序。

        例如,

          某个开发员开发了一个缴费处理程序,在测试时发现,

          这个缴费处理程序在处理用户发过来的并发缴费请求时,

          只能串行处理,无法并行处理,

          导致缴费交易的处理响应时间非常长,

          这时可以认为在应用程序上出现了性能瓶颈。

      (4)操作系统上的性能瓶颈

          一般指的是Windows、Unix、Linux这些操作系统。

          例如,

            在windows系统中,虚拟内存设置的不合理,

            都指定为C驱提供虚拟内存,

            在测试时发现当出现物理内存不足时,

            虚拟内存的交换效果非常不理想,

            导致交易的响应时间大大增加。

            这时可以认为在操作系统上出现了性能瓶颈。

      (5)网络设备上的性能瓶颈

          一般指的是防火墙、动态负载均衡器、交换机等设备。

          例如,

            在动态负载均衡器上设置了动态分发负载的机制,

            当发现某个应用服务器上的硬件资源已经到达极限时,

            动态负载均衡器将后续的交易请求发送到其它负载较轻的应用服务器上。

            在测试时发现,动态负载均衡机制没有起到相应的作用,

            这时可以认为在网络设备上出现了性能瓶颈。
  • 性能测试结果分析

    2008-12-19 14:25:12

    分析原则:

      具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的
    性能关注点)

      查找瓶颈时按以下顺序,由易到难。

      服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,
    数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)

      注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。

      分段排除法 很有效

      分析的信息来源:

      1)根据场景运行过程中的错误提示信息

      2)根据测试结果收集到的监控
    指标数据

      一.错误提示分析

      分析实例:

      1)Error: Failed to connect to server “payment.baihe.com″: [10060] Connection

      Error: timed out Error: Server “user.baihe.com″ has shut down the connection prematurely

      分析:

      A、应用服务死掉。

      (小用户时:程序上的问题。程序上处理数据库的问题)

      B、应用服务没有死

      (应用服务参数设置问题)

       例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的 AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%

      C、数据库的连接

      (1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))

      2)Error: Page download timeout (120 seconds) has expired

      分析:可能是以下原因造成

      A、应用服务参数设置太大导致服务器的瓶颈

      B、页面中图片太多

      C、在程序处理表的时候检查字段太大多

      二.监控指标数据分析

      1.最大并发用户数:

      应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。

      在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

      如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

      2.业务操作响应时间:

      分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。

      细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?

      如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题

       2-5-10原则:简单说,就是当用户能够在2秒以内得到响应时,会感觉系统的响应很快;当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可 以;当用户在5-10秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;而当用户在超过10秒后仍然无法得到响应时,会感觉系统糟透了,或者 认为系统已经失去响应,而选择离开这个Web站点,或者发起第二次请求

      3.服务器资源监控指标:

      内存:

      1)UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

      2)Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

      内存资源成为系统性能的瓶颈的征兆:

      很高的换页率(high pageout rate);

      进程进入不活动状态;

      交换区所有磁盘的活动次数可高;

      可高的全局系统CPU利用率;

      内存不够出错(out of memory errors)

      处理器:

       1)UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85%

      合理使用的范围在60%至70%。

      2)Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

      CPU资源成为系统性能的瓶颈的征兆:

      很慢的响应时间(slow response time)

      CPU空闲时间为零(zero percent idle CPU)

      过高的用户占用CPU时间(high percent user CPU)

      过高的系统占用CPU时间(high percent system CPU)

      长时间的有很长的运行进程队列(large run queue size sustained over time)

      磁盘I/O:

      1)UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。

      2)Windows资源监控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。

      I/O资源成为系统性能的瓶颈的征兆 :

      过高的磁盘利用率(high disk utilization)

      太长的磁盘等待队列(large disk queue length)

      等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O)

      太高的物理I/O速率:large physical I/O rate(not sufficient in itself)

      过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself))

      太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

      4.数据库服务器:

      SQL Server数据库:

      1)SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。

      2)如果Full Scans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。

      3)Number of Deadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。

      4)Lock Requests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。

      Oracle数据库:

      1)如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。

      2)如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。

      3)如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。

      4)如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。
  • 在LoadRunner中如何选择一个正确的协议来测试

    2008-12-19 14:21:19

    选择那一种协议来测试往往是令初学者困惑的事情,如何选择一个正确的协议来测试,关系到能否得到正确有效的测试结果。这需要测试人员对被测软件的系统架构有一定的了解,实际工作中,可以和开发人员沟通。我在这里就提供一个简单的参考:
    应用类型 建议选用协议
    Web网站(J2EE,.NET) Web(HTTP/HTML)
    FTP服务器 File Transfer Protocol(FTP)
    邮件服务器 Internet Messaging Application Protocal(IMAP)51Testing软件测试网M5I"r.l!{vNM
    Post Office Protocol(POP3)51Testing软件测试网"e)Y0\5Xg it[
    Simple Mail Trans for Protocol(SMTP)
    C/S 客户端以ADO,OLEDB
    4Ra}0hI138635方式连接后台数据库
    MS SQL Server51Testing软件测试网eRV&WLv2S
    Oracle
    "@8oR#y6A0|`138635Sybase51Testing软件测试网WWLDP0O H~
    DB2
    t,v*F:po-E1i138635Informix
    客户端以ODBC方式连接后台数据库 ODBC
    没有后台数据库 Socket
    ERP系统 SAP Peoplesoft
    分布式组件 COM/DCOM51Testing软件测试网5poy+g([%H]2W l
    EJB
    无线应用 WAP
    %T(NV9Fs'^ j FS&r138635PALM
  • LoadRunner选项设置

    2008-12-19 14:17:59

    LoadRunner 中有两个选项的设置是非常重要的:Recording optionsRun-time settings.前者是用来设置录制脚本过程中的一些选项,而后者是用来 设置回放脚本过程中的一些选项。

    1.Recording options

    设置录制脚本过程中的选项,使用方法:选择tools/recording options菜单或者直接点击工具栏上的录制选项按钮(见下图),

    弹出图所示对话框

    下面对一些主要的选项加以介绍。

    1Recording选项。

    n         HTMLbased scrīpt :默认值。说明脚本中采用HTML页面的形式来表示,基于浏览器的应用程序,推荐使用。

    n         URLbased scrīpt :说明脚本中的表示是采用基于URL的方式,不是基于浏览器的应用程序,推荐使用。

    2Browser选项。该选项用来设置默认的浏览器,如图所示

    l         Use default browser:默认选项,使用默认的浏览器。

    l         Manually launch an application:手动加载一个应用程序。

    l         Specify path to application:指定要运行的浏览器的路径。

    3Recording Proxy选项。该选项用来设置上网代理,如图所示:

    l         No proxy:不设置上网代理。

    l         Obtain the proxy settings from the reconding browser :默认选项,“· ”将浏览器里面的代理选项作为默认选项。

    l         Use custom proxy :自己设置上网代理的服务器和端口号。

    4Advanced 选项。设置回放脚本过程中的高级选项,如图所示:

    其中主要选项如下:

    l         Record think-time:默认选项。是否记录思考时间,可以设置思考时间的最大值。

    l         Full trace recording log:是否完全记录录制过程的日志

    l         Add comment to scrīpt for HTTP errors while recording:出现错误时是否自动添加注释。

    2. Run-time settings

    设置录制回放过程中的选项,使用方法:选择主要界面Vuser/Run-time settings 菜单,弹出如图所示的对话框。

      主要选项解释如下:

    (1)       Run logic 选项。该选项用来设置脚本重复执行的次数,如图所示:Number of Iteration 是每一个事务的重复执行次数的设置框。

    (2)       Pacing 选项。该选项用来设置两次重复执行的时间间隔,如图所示:

    l         As soon as the previous iteration ends :在多次重复执行时,一次执行完马上执行下一次。

    l         After the previous iteration ends :在上一次执行完毕后,间隔固定的时间来执行下一次。

    l         At fixed intervals:不管上一次执行是否完成,达到规定的时间后就执行下一次。

    (2)       Think time 选项。该选项用来设置用户操作时的思考时间,如图所示:

    l         Ignore think time :运行脚本的时候忽略思考停顿时间。

    l         Replay think time :设置思考时间的延迟。

    l         As recorded :根据录制时的思考时间来运行。

    l         Multiply recorded think time by :根据录制时的思考时间的整数倍来运行。

    l         Use random percentage of recorded think time :设置一个最大值和最小值,从中选出一个随机值。

    l         Limit think time to :设置 think time 的最大值,如果录制值超过最大值,就以最大值为准。

    4Miscellaneous选项。该选项是一个混合选项,涉及的功能比较杂,如图所示:

    l         Error Handing:设置运行遇到错误时的处理,一般不需要改动。

    l         Multithreading:设置默认进程或线程运行。

    ü         Run Vuser as a process:把每一个虚拟用户当作一个进程。

    ü         Run Vuser as a thread:把每一个虚拟用户当作一个线程,默认值,效率更高。

    l         Automatic transactions:设置事务模式。

    ü         Define each action as a transaction:将一个action看作一个事务。

    ü         Define each step as a transaction:将每一个操作步骤看作一个事务。

    5Network 选项。该选项用来设置网络连接的速度,如图所示:

    l         Use maximum bandwidth:使用网络最大的带宽。

    l         Use bandwidth:选项目前主流的接入方式。

    l         Use custom bandwidth(bps) :自定义带宽。

  • Loadrunner中参数设置详细分析

    2008-12-19 14:11:33

    相信对大家会有用的,这个版本是基于7.8的。

      做负载或者压力测试时,很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数设置问题。本文就Loadrunner中参数的设置进行说明,希望对大家有所帮助。

      在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值。这个过程称为参数化脚本。

      本文主要包括如下内容:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。

      除了GUI,以下的内容适合于各种类型的用户脚本。

      一、关于参数的定义

      在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。函数中参数的值就是在录制过程中输入的实际值。

       例如,你录制了一个Web应用程序的脚本。脚本生成器生成了一个声明,该声明搜索名称为“UNIX”的图书的数据库。当你用多个虚拟用户和迭代回放脚本 时,也许你不想重复使用相同的值“UNIX”。那么,你就可以用参数来取代这个常量。结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个 文件,也可以是内部产生的变量。

      用参数表示用户的脚本有两个优点:

      ① 可以使脚本的长度变短。

      ② 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。

      参数化包含以下两项任务:

      ① 在脚本中用参数取代常量值。

      ② 设置参数的属性以及数据源。

      参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。另外,不是所有的函数都可以参数化的。

      二、参数的创建

      可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。在Web程序的用户脚本中,你可以使用如下过程在基于文本的脚本视图中创建参数。或者,也可以在基于图标的树形视图中创建参数。

      在基于文本的脚本视图中创建一个参数:

      1、 将光标定位在要参数化的字符上,点击右键。打开弹出菜单。

      2、 在弹出菜单中,选择“Replace with a Parameter”。选择或者创建参数的对话框弹出。

      3、 在“Parameter name”中输入参数的名称,或者选择一个在参数列表中已经存在的参数。

      4、 在“Parameter type”下拉列表中选择参数类型。

      5、 点击“OK”,关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“{}”括住。

       注意:在参数化CORBA或者General-Java 用户脚本的时候,必须参数化整个字符串,而不是其中的部分。另外注意:除了Web或者WAP,缺省的参数括号对于任何脚本都是 “{}”。你可以在“General Options”对话框中的“Parameterization”标签(Tools>General Options)中定义参数括号种类。

      6、用同样的参数替换字符的其余情况,选中参数,点击右键,弹出菜单。从弹出的菜单中,选择 “Replace More Occurrences”。搜索和替换对话框弹出。“Find What”中显示了你企图替换的值。“Replace With”中显示了括号中参数的名称。选择适当的检验框来匹配整个字符或者大小写。如果要搜索规则的表达式(.,!,?等等),选中“Regular Expression”检验框,然后点击“Replace”或者“Replace All”。

      注意:小心使用“Replace All”,尤其替换数字字符串的时候。脚本生成器将会替换字符出现的所有情况。

       7、 如果想用以前定义过的参数来替换常量字符串的话,选中该字符串,点击右键,然后选择“Use Existing Parameter”,子菜单“Use Existing Parameters”弹出。从子菜单“Use Existing Parameters”选择参数,或者用“Select from Parameter List”来打开参数列表对话框。

      注意:如果用以前定义过的参数来替换常量字符串的话,那么,使用“Parameter List”非常方便。同时,还可以查看和修改该参数的属性。

      8、 对于已经用参数替换过的地方,如果想取回原来的值,那么,就在参数上点击右键,然后选择“Restore Original value”。

      在Web用户脚本的树形视图中创建参数:

      1、将光标定位在企图参数化的地方,点击右键,从弹出的菜单中选择“Properties”。则相关的属性对话框打开。

      2、点击在要参数化的参量的旁边的“ABC”形状的图标。“Select or Create Parameter”对话框打开。

      3、在“Parameter name”中输入参数的名称,或者从列表中选择一个已经存在的参数。

      4、在“Parameter type”中输入参数的类型。

      5、点击“OK”关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量,并用一个表格形状的图标替换“ABC”形状的图标。

      6、要恢复参数化以前的值,点击图标,然后从弹出的菜单中选择“Undo Parameter”,则以前的值便会重现。

      三、定义参数的属性

       创建参数完成后,就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中,参数使用的数据源。在Web用户脚本中,你既可以在基于文本的脚本视图 中定义参数属性,也可以在基于图标的树形视图中定义参数属性。下面的过程将教你如何在基于本文的脚本视图中定义参数属性。

      在基于文本的脚本视图中定义参数属性步骤:

      1、 在参数上点击右键,有菜单弹出。

      2、 在弹出的菜单中,选择“Parameter Properties”。参数属性对话框打开,显示和当前参数类型相关的属性。

      3、 输入参数的属性值。

      4、 点击“Close”关闭参数属性对话框。

      在Web用户脚本的树形视图中定义参数的属性:

      1、 将关标定位在参数上,然后点击右键,选择“Properties”。属性对话框打开。

      2、 点击要定义属性的参数旁边的表格形状按钮,点击右键,选择“Parameter Properties”。参数属性对话框打开,和参数类型相关的属性显示出来。

      3、 输入参数的属性。

      4、 点击“Close”关闭参数属性对话框。

      使用参数列表:

    使用参数列表可以在任意时刻查看所有的参数,创建新的参数、删除参数,或者修改已经存在参数的属性。 

      1、 点击参数列表按钮或者用“Vuser>Parameter List”。参数列表对话框打开。

      2、 要创建新的参数,点击“New”按钮。新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它重新命名,然后回车。设置参数的类型和属性,点击“OK”,关闭参数列表对话框。

      注意:不要将一个参数命名为“unique”,因为这个名称是用户脚本生成器本身的。用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。

      3、 要删除已有的参数,那么,要先从参数树中选择该参数,点击“Delete”,然后确认你的行为即可。

      4、 要修改已有参数,那么,要先从参数树中选择该参数,然后编辑参数的类型和属性。

      四、理解参数的类型

      在你定义参数属性的时候,要指定参数值的数据源。你可以指定下列数据源类型的任何一种:

      Internal Data―― 虚拟用户内部产生的数据。

      Data Files ――存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。

      User-Defined Functions―― 调用外部DLL函数生成的数据

      Internal Data包括以下几种: 

      1、 Date/Time

      Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,你可以从菜单列表中选择格式,或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。 

      2、 Group Name

      Group Name 用虚拟用户组名称替换参数。在创建scenario的时候,你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None。 

      3、 Load Generator Name

      Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。 

      4. Iteration Number

      Iteration Number用当前的迭代数目替换参数。 

      5、 Random Number

      Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。 

      6、 Unique Number

      Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。 

      7、 Vuser ID

      Vuser ID用分配给虚拟用户的ID替换参数,ID是由Loadrunner的控制器在scenario运行时生成的。如果你从脚本生成器运行脚本的话,虚拟用户的ID总是-1。
  • 加载C:\PROGRA~1\MICROS~2\Office12\GrooveUtil.DLL出错

    2008-12-17 12:03:36

    LR9.0
    IE7.0
    OFFICE2007

    录制时,便弹出加载C:\PROGRA~1\MICROS~2\Office12\GrooveUtil.DLL时出错,内存分配访问无效。
    然后点击确定后,能继续录制,但保存脚本时,LR会遇到问题自动关闭

    解决方法:禁用Groove  GFSBrowser Helper 组件就可以了。
  • 如何在LoadRunner中增加QTP脚本

    2008-12-16 11:37:55


  • LoadRunner分析报表(转)

    2007-10-18 14:04:52

    一、 Web Page Breakdown

     

    DNS 解析时间: 显示使用最近的 DNS 服务器将 DNS 名称解析为 IP 地址所需的时间; DNS 查找度量是指示 DNS 解析问题或 DNS 服务器问题的一个很好的指示器;

    Connect 时间: 显示与包含指定 URL Web 服务器建立初始连接所需的时间; Connect 度量是一个很好的网络问题指示器;它还可表明服务器是否对请求做出响应;

    First buffer 时间: 显示从初始 HTTP 请求到成功收回来自 WEB 服务器的第一次缓冲时为止所经过的时间; First buffer 度量是很好的 Web 服务器延迟和网络滞后指示器;

    SSL Handshaking time 显示建立 SSL 连接所用的时间

    Receive Time 显示从服务器收到最后一个字节并完成下载之前经过的时间;接收度量是很好的网络质量指示器;

    FTP 验证时间: 显示验证客户端所用的时间。

    Client Time 显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的时间。

    Error 时间: 显示从发出 HTTP 请求到返回错误消息这期间所经过的平均时间

     

     

     

     

    二、 关于 TPS Transactions per Second ): 每秒处理事务数

     

     

     

    这个值可以说明系统在特定的负载情况下,每秒可以处理多少个客户端请求,这是一个衡量服务器端性能的重要指标,相信各位在进行性能测试的时候经常会用到这个指标。但是一直以来我都有一个疑问,到底这个值是怎么算出来的。既然是每秒事务数,那算法自然是“事务数 / 时间”。事务数很好理解,执行了多少就是多少,关键是这个时间。是整个场景执行的时间,还是仅仅是在服务器端执行的时间?因为我们知道,这两个时间肯定是有区别的,前者还包括 thinktime 的时间、 pacing 的时间以及在网络上耗费的时间等等。

     

    为了弄明白这个问题,我今天特地查了一下帮助文档,看到上面是这么说的:“每秒事务数图显示在场景或会话步骤运行的每一秒中,每个事务通过、失败以及停止的次数。”如果按照这句话去理解,那么上面那个问题的答案应该是后者,也就是说,在 Transaactions per Second 这张图中, LoadRunner 是针对场景运行过程中的每一个时间点取样一次,显示在这个时间点上每个事务的通过、失败以及停止的个数。

     

    另外,我还在 Analysis 里面找了一下,发现图表的时间显示粒度也是可以设置的。具体方法为:在图表上点击右键 -> 选择“ Set Granularity ”或者直接按 Ctrl+G 。我试着把时间粒度调成以毫秒为单位,结果 LoadRunner 提示当前不支持以毫秒为显示粒度,由此我推断 LoadRunner 对于 Transactions per Second 这张图,最小的取样粒度为 1 秒。

     

     

     

     

    三、 事务响应时间(百分比)图

     

     

     

    这个图显示的是事务响应时间范围的分布情况。在场景的执行中,每个定义的事务可能会不止被处理一次(因为设置了持续时间或者迭代次数), LoadRunner 会为每个事务实例的处理分别记录响应时间。在 Summary Report 中, LoadRunner 会针对每个事务的响应时间数据集合,分别取它的最大值、最小值和平均值,通常我们会关注响应时间的平均值。然而很多时候,单单是平均响应时间可能是不够的,因为一旦最大值和最小值出现较大的偏差,即便平均响应时间处在可以接受的范围内,但并不意味着整个系统的性能就是可以接受的,我们有必要再借助其它的分析报表来进一步分析,此时事务响应时间(百分比)图就派上用场了。

     

    事务响应时间(百分比)给出的是每个事务的响应时间按百分比的分布情况,它告诉我们本次测试有多少个事务的平均响应时间是落在我们可以接受的时间范围之内。如果最大响应时间非常长,但是绝大多数事务(通常情况下以 95% 为参考)的响应时间具有可以接受的响应时间,则我们认为整个系统的性能还是可以接受的。

     

    注意: Analysis 将对每个可用事务百分比的事务响应时间取近似值。因此 Y 轴的值可能并不准确。

     

     

     

    四、 事务响应时间(负载下)图

     

     

     

    这个图显示的是事务响应时间随着场景中虚拟用户的逐渐增长的变化趋势图,该图可以帮助我们查看 Vuser 负载对性能问题的影响。当我们需要了解某个事务的响应时间随着虚拟用户的增加而产生的变化时,可以通过在控制台中设置一个渐变负载的场景的方式来实现。例如每 5 分钟加载 10 个用户等,然后考察得到的这张图表,就能够对此有一个比较好的理解。

  • 图片验证码性能测试解决方案

    2007-10-18 14:00:39

    如何测试图片验证码功能,大家常用的有三种方法: 鄛%鳰?瑏9  
    1.设置一个万能验证码. G?沉N`i饒  
    2.取消验证码功能. 歍?c牸?  
    3.编写个专用插件,动态获取真实的验证码.  敌瘆I哽R  
    E箉睞?萌y  
    1,2两种方法实现比较容易,缺点是不能真实的模拟实际应用环境. j妻?滜? 
    3的方法技术难度较高. ;?Wq~鱺6x  
    欒d?宇ES=  
    其实我们还有第4种即简单又能够真实的模拟实际应用的方法. p#O湕?  
    cZ冬淈F螧  
    以Jsp网站为例,先来看看验证码功能的实现方法.图片验证码由以下几个步骤实现. G a7百7  
    1.生成随机数. Ud?夕  
    2.将随机数存入 Session (会话). ?寕髑<讍? 
    3.将随机数制作成图片. 犳嬦蠫9&啓  
    部分较重要的代码如下. 4=8俓X?  
    <img src="CheckCode.jsp" border="0" alt="验证....... 这个是调用 CheckCode.jsp 文件,生成图片验证码. 几???0頋  
    ?lt;酭嶯L?z  
    CheckCode.jsp文件代码如下 牉P?4c? 
    String sRand=""; .&o|W皴D8? 
    for (int i=0;i<4;i++){ 煾0ぷ??  
        String rand=String.valueOf(random.nextInt(10));   //生成随机数 m幂U赞?lt;z  
        sRand+=rand; 靽??@ˇ? 
         .......... ?s翃xTcO? 
    } hJ檝故嗨獧  
    session.setAttribute("rand",sRand);    将随机数据存入session中. ⒛んU濡觰  
    ??澸ι  
    到这里我们已经知道,只要制作一个jsp页面调出session中的rand 值,就可以得到验证码的正文数据. ?H焜袃?? 
    实现代码如下. C|3繹3=?  
    t.jsp E贐c?驻?  
    <% V?,??  
    out.print(session.getAttribute("rand")); 莕芳?:a摭  
    %> 'T驛F貓V  
    E繮???  
    如果在
    LoadRunner中实现的方法如下: {渡飭`$  
    请求 CheckCode.jsp 生成图片验证码. 訕睷O8锱  
    请求 t.jsp 获取验证码的正文数据. f_爧w?`?8  
    提交 数据. 
  • Loadrunner 参数化测试数据

    2007-10-18 13:44:23

    参数化测试数据

    PS:本人在51testing和sina blog上的文章全部为原创,转载请注明出处!!

    制作参数化数据时,先了解参数化的一些知识:
    1、参数化就是用变量取代固定的输入值,以产生不同的输入值,从而获得不同的输出结果。
       例如:用户的登录测试,我们需要不同的用户名和密码才能模拟很多用户同时登录。因为不断的用一个用户登录,这个用户可能加入了服务器的缓存里,再次登录是从缓存里直接获取信息验证,造成测试效果失真;另外,有的系统也只允许同一个用户只能登录一次;这样的情况下,使用参数化就能搞定了。

     

    2、参数化的做法请参考lr的vgn帮助手册
       建议到论坛里下载lr8.1的vgn中文帮助手册

     

    3、参数值的引用方法
       参数值的引用分2种:一是直接引用,一个是使用lr_eval_string函数引用
       一、直接引用
           引用格式为:{参数名}
           一般在web_url、web_submit_data等函数体里使用,例如:
            lr_save_string("index.asp","url");
            lr_save_string("410","fid");
            lr_save_string("555","cid");
            web_url("{url}", 
               "URL=http://192.168.5.113/bbs/{url}?theurl=http_Colon_//192.168.5.113/bbs/post.asp?fid={fid}_And_cid={cid}", 
               "TargetFrame=", 
               "Resource=0", 
               "RecContentType=text/html", 
               "Referer=", 
               "Snapshot=t1.inf", 
               "Mode=HTML", 
               EXTRARES, 
               "Url=images/gslt.gif", "Referer=http://192.168.5.113/bbs/top.htm", ENDITEM, 
               LAST); 
           通常,使用lr的参数替换功能形成的参数,格式都是这个。

     

        二、lr_eval_string()
           这个引用通常是在赋值和打印等操作中,用来引用形参所对应的实际值。
           例如:lr_save_string("这是实际值!","values");
                 lr_message("实际值是:%s",lr_eval_string("{values}"));

     

    4、参数化策略和示例
       请参考:http://bbs.51testing.com/thread-78454-1-1.html

     

    5、参数化数据最大不能超过32000行
       这个是我有一次参数化大量数据时发现的,因为一旦参数化的数据超过这个数字,LR的vgn就会自动关闭,没有任何提示。
       后来通过实验,才发现32000行是个限制值,目前我也不知道怎么去修改这个值。
       而且,从数据库中查询值的时候,有个限制,这个限制也是不能超过32000!!
      
       另外,我有个猜想,LR从数据库中取值后,应该也是放到dat数据文件里再取值,其实是和直接从txt、dat文件里读一样。

     


    参数化数据的准备方法:
    1、用户名和密码
       用户名和密码是用参数化最多的测试输入,通常需要在DB中生成一定数量的记录,然后copy出来保存在文件里或者直接参数化都可以引用。


      
    2、当前时间和随机数
       当前时间请参考我的blog的文章:http://www.51testing.com/?6343
       随机数请参考ZEE的一篇文章:http://zeeslo.bokee.com/6177214.html

     

    3、通过关联获取
       请参考关联:http://zhidao.baidu.com/question/19338536.html

     

    4、通过相关函数获取
       可使用lr_save_datetime、lr_save_string、lr_param_increment、lr_save_int、lr_save_searched_string、lr_save_var等函数将对应的值保存为参数  
       具体请参考LR的函数手册。

  • 如何在 LoadRunner 脚本中做关联 (Correlation)

    2007-10-18 12:03:04

    当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本。在VuGen的Recording Log中,您可以找到浏览器与服务器之间所有的对话,包含通讯内容、日期、时间、浏览器的请求、服务器的响应内容等等。脚本和Recording Log最大的差别在于,脚本只记录了client端要对server端所说的话,而Recording Log则是完整纪录二者的对话。
      当执行脚本时,您可以把VuGen想象成是一个演员,它伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。
      所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。

    何谓关联(correlation)?
      所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
      举一个常见的例子,刚刚提到有些比较聪明的服务器,这些服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为Session ID。对于每个新的交易,服务器都会产生新的Session ID给浏览器。这也就是为什么执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或是它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。
      下面的图示说明了这样的情形:
      当录制脚本时,浏览器送出网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个ID=123的数据,当浏览器再送出网页B的情求时,这时就要用到ID=123的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。
    在执行脚本时会发生什么状况?浏览器再送出网页B的请求时,用的还是当初录制的ID=123的数据,而不是用服务器新给的ID=456,整个脚本的执行就会失败。
      要对付这种服务器,我们必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代掉脚本中有用到Session ID的部份,这样就可以成功骗过服务器,正确地完成整个交易了。
      哪些错误代表着我应该做关联(correlation)?
    假如脚本需要关联(correlation),在还没做之前是不会执行通过的,也就是说会有错误讯息发生。不过,很不幸地,并没有任何特定的错误讯息是和关联(correlation)有关系的。会出现什么错误讯息,与系统实做的错误处理机制有关。错误讯息有可能会提醒您要重新登入,但是也有可能直接就显示HTTP 404的错误讯息。

      要如何做关联(correlation)?
      关联(correlation)函数
      关联(correlation)会用到下列的函数:
    • web_reg_save_param:这是最新版,也是最常用来做关联(correlation)的函数。
    语法:
    web_reg_save_param ( “Parameter Name” , < list of Attributes >, LAST );
    • web_create_html_param、web_create_html_param_ex:这二个函数主要是保留作为向前兼容的目的的。建议使用 web_reg_save_param 函数。
    详细用法请参考使用手册。在VuGen中点选【Help】>【Function reference】>【Contexts】>【Web and Wireless Vuser Functions】>【Correlation Functions】。

    如何找出要关联(correlation)数据
    简单的说,每一次执行时都会变动的值,就有可能需要做关联(correlation)。
    VuGen提供二种方式帮助您找出需要做关联(correlation)的值:
    1. 自动关联
    2. 手动关联
    自动关联
    VuGen内建自动关联引擎(auto-correlation engine),可以自动找出需要关联的值,并且自动使用关联函数建立关联。
    自动关联提供下列二种机制:
    • Rules Correlation:在录制过程中VuGen会根据订定的规则,实时自动找出要关联的值。规则来源有两种:
    o 内建(Built-in Correlation):
    VuGen已经针对常用的一些应用系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,内建关联规则,这些应用系统可能会有一种以上的关联规则。您可以在【Recording Options】>【Internet Protocol】>【Correlation】中启用关联规则,则当录制这些应用系统的脚本时,VuGen会在脚本中自动建立关联。
    您也可以在【Recording Options】>【Internet Protocol】>【Correlation】检视每个关联规则的定义。
    o 使用者自订(User-defined Rules Correlation):
    除了内建的关联规则之外,使用者也可以自订关联规则。您可以在【Recording Options】>【Internet Protocol】>【Correlation】建立新的关联规则。
    • Correlation Studio:有别于Rules Correlation,Correlation Studio则是在执行脚本后才会建立关联,也就是说当录制完脚本后,脚本至少须被执行过一次,Correlation Studio才会作用。Correlation Studio会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。
    Rule Correlation
    请依照以下步骤使用Rule Correlation:
    1. 启用auto-correlation
    1. 点选VuGen的【Tools】>【Recording Options】,开启【Recording Options】对话窗口,选取【Internet Protocol】>【Correlation】,勾选【Enable correlation during recording】,以启用自动关联。
    2. 假如录制的应用系统属于内建关联规则的系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,请勾选相对应的应用系统。
    3. 或者也可以针对录制的应用系统加入新的关联规则,此即为使用者自订的关联规则。
    4. 设定当VuGen侦测到符合关联规则的数据时,要如何处理:
     【Issue a pop-up message and let me decide online】:跳出一个讯息对话窗口,询问您是否要建立关联。
     【Perform correlation in sceipt】:直接自动建立关联
    2. 录制脚本
    开始录制脚本,在录制过程中,当VuGen侦测到符合关联规则的数据时,会依照设定建立关联,您会在脚本中看到类似以下的脚本,此为BroadVision应用系统建立关联的例子,在脚本批注部分可以看到关联前的数据为何。
    3. 执行脚本验证关联是OK的。
    Correlation Studio
    当录制的应用系统不属于VuGen预设支持的应用系统时,Rule Correlation可能既无法发挥作用,这时可以利用Correlation Studio来做关联。
    Correlation Studio会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。
    使用Correlation Studio的步骤如下:
    1. 录制脚本并执行
    2. 执行完毕后,VuGen会跳出下面的【Scan Action for Correlation】窗口,询问您是否要扫描脚本并建立关联,按下【Yes】按钮。
    3. 扫描完后,可以在脚本下方的【Correlation Results】中看到扫描的结果。
    4. 检查一下扫瞄的结果后,选择要做关联的数据,然后按下【Correlate】按钮,一笔一笔做,或是按下【Correlate All】让VuGen一次就对所有的数据建立关联。
    注意:由于Correlation Studio会找出所有有变动的数据,但是并不是所有的数据都需要做关联,所以不建议您直接用【Correlate All】。
    5. 一般来说,您必须一直重复步骤1~4直到所有需要做关联的数据都找出来为止。因为有时前面的关联还没做好之前,将无法执行到后面需要做关联的部份。
    有可能有些需要做关联的动态数据,连Correlation Studio都无法侦测出来,这时您就需要自行做手动关联了。

    手动关联
    手动关联的执行过程大致如下:
    1. 使用相同的业务流程与数据,录制二份脚本
    2. 使用WinDiff工具协助找出需要关联的数据
    3. 使用web_reg_save_param函数手动建立关联
    4. 将脚本中有用到关联的数据,以参数取代
    接下来将详细的说明如何执行每个步骤
    使用相同的业务流程与数据,录制二份脚本
    1. 先录制一份脚本并存档。
    2. 依照相同的操作步骤与数据录制第二份脚本并存盘。注意,所有的步骤和输入的数据一定都要一样,这样才能找出由服务器端产生的动态数据。
    有时候会遇到真的无法使用相同的输入数据,那您也要记住您使用的输入数据,到时才能判断是您输入的数据,还是变动的数据。
    使用WinDiff工具协助找出需要关联的数据
    1. 在第二份脚本中,点选VuGen的【Tools】>【Compare with Vuser…】,并选择第一份脚本。
    2. 接着WinDiff会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options】>【View】>【Show Inline Differences】)。
    3. 逐一检视二份脚本中差异的部份,每一个差异都可能是需要做关联的地方。选取差异的脚本,然后复制。
    在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。
    注意:请忽略lr_thik_time的差异部份,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间。
    4. 接着要在Recording Log(单一protocol)或是Generation Log(多重protocol)中找这个值。将鼠标光标点到Recording Log的第一行开头,按下Ctrl+F,开启【Find】窗口,贴上刚刚复制的脚本,找出在Recording Log第一次出现的位置。
    结果会有二种:
    o 在Recording Log中找不到要找的数据,这时请先确认您找对了脚本,毕竟现在开启了二个几乎一样的脚本,很容易弄错。
    o 在Recording Log中找到了要找的数据,这时要确认数据是从服务器端传送过来的。首先可以先检查数据的标头,从标头的Receiving response可以知道数据是从服务器端传送到client端的。假如此数据第一次出现是在Sending request中,则表示此数据是由client端产生,不需要做关联,但是有可能需要做参数化(parameterized)。
    您要找的标头格式如下:
    *** [tid=b9 Action1 2] Receiving response from host astra.merc-int.com:80 ( 25/11/2002 12:04:00 )
    5. 现在您已经找到录制二次都不一样,而且是由服务器所产生的动态数据了,而此数据极有可能需要做关联。
    使用web_reg_save_param函数手动建立关联
    在找到是由服务器所产生的动态数据之后,接下来要做的就是找出适当的位置,使用web_reg_save_param函数,将这个动态数据撷取到某个参数中。
    1. 要在哪里使用web_reg_save_param函数?
    在之前的步骤,我们已经在Execution Log找到可能需要关联的动态数据。在Execution Log中选取动态数据前的文字然后复制,我们将会利用这段文字,来帮助我们找出要关联的动态数据。
    不过在这之前我们要先找出使用web_reg_save_param函数的正确位置,所以我们要再重新执行一遍脚本,而且这次会开启所有的Log。
    1. 在VuGen中点选【Vuser】>【Run-Time Settings】。
    2. 点选【General】>【Log】。
    3. 勾选【Enable logging】、【Always sends messages】、【Extended log】,以及【Extended log】下的所有选项。
    4. 按下【OK】就可以执行脚本了。
    执行完脚本之后,在Execution Log中搜寻刚刚复制的字符串。找到字符串后,在字符串前面会有A.tion1.c(7),这个7就是到时候要插入web_reg_save_param函数的位置,也就是要插入到脚本的第7行。
    在脚本的第7行前插入一行空白行,然后输入
    web_reg_save_param(“UserSession”,
    “UserSession” 这个 “UserSession” 就是到时要使用的参数名称,建议给个有意义的名字。
    注意:到这里整个web_reg_save_param函数还没完成。
    2. 找出web_reg_save_param中要用到的边界
    web_reg_save_param函数主要是透过动态数据的前面和后面的固定字符串,来辨识要撷取的动态数据的,所以我们还需要找出动态数据的边界字符串。
    找出左边界字符串
    再回到Execution Log中,选取动态数据前的字符串并且复制它。
    这时会有个问题,到底要选取多少字符串才足以唯一识别要找的动态数据呢?建议是越多越好,但是尽量不要包含到特殊字符。
    在这边我们选取「input type=hidden name=userSession value=」字符串。选好之后,还要再确认一次这段字符串真的是可以唯一识别的,所以我们在Execution Log中透过Ctrl+F的搜寻,找找看这段字符串是否可以找到要找的动态数据。假如找不到,web_reg_save_param函数还有个ORD参数可以使用,ORD参数可以设定出现在第几次的字符串才是要找的字符串。
    将这个边界字符串加到未完成的web_reg_save_param函数中:
    web_reg_save_param(“UserSession”, “LB= input type=hidden name=userSession value=”,
    找出右边界字符串
    接下来要找出动态数据的右边界字符串,这个字符串就比较好找了,从动态数据的最后一个字符开始,通常就是我们要找的右边界字符串了。
    以这个例子来看,就是「>」,所以再把右边界字符串加入,web_reg_save_param函数中,这时web_reg_save_param函数已经快完成了。最后再加上「LAST);」就完成整个web_reg_save_param函数了。
    web_reg_save_param(“UserSession”, “LB= input type=hidden name=userSession value=”, “RB=>”, LAST);
    将脚本中有用到关联的数据,以参数取代
    当使用web_reg_save_param建立参数后,接下来就是用“UserSession”参数去取代脚本中写死的(hard-coded)资料。
    范例:

    “Name=userSession”, “Value=75893.0884568651DQADHfApHDHfcDtccpfAttcf”, ENDITEM,
    换成
    “Name=userSession”, “Value={UserSession}”, ENDITEM,
    到这里您已经完成了一个关联了,接下来就是执行脚本,是否能成功运行,假如还是有问题,就要检查看看是否还需要再做另一个关联。
    关于 web_reg_save_param 函数
    对于关联(correlation)来说,web_reg_save_param是最重要的一个函数,其功能是在下载的网页内容中,透过设定的边界字符串,找出特定的数据并将其储存在一个参数中,以供后续脚本使用。
    接下来将针对web_reg_save_param做比较详细的说明。
    Service and registration type function
    web_reg_save_param是一个Service function。service function主要是用来完成一些特殊的工作的,如关联、设定proxy、提供认证信息等,当其作用时,不会对网页的内容做任何的修改。
    web_reg_save_param同时也是一个registration type function (只要函数名称中包含_reg_的字眼,表示其为registration type function)。registration type function意味着其真正作用的时机是在下一个action function完成时执行的。举例来说,当某个web_url执行时所接收到的网页内容中包含了要做关联的动态数据,则必须将web_reg_save_param放在此web_url之前,则web_reg_save_param会在web_url执行完毕后,也就是网页内容都下载完后,再执行web_reg_save_param找寻要做关联的动态数据并建立参数。
    所以要记住一点,要使用registration type function时,要注意其放置的位置必须在要作用的action function之前。
    语法
    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。属性值不分大小写,例如 Search=all。以下将详细说明每个属性值的意义:
    • Notfound:指定当找不到要找的动态数据时该怎么处置。
    o Notfound=error:当找不到动态数据时,发出一个错误讯息。假如没设定此属性,此为LoadRunner的默认值。
    o Notfound=warning:当找不到动态数据时,不发出错误讯息,只发出警告,脚本也会继续执行下去不会中断。在对角本除错时,可以使用此属性值。
    • LB:动态数据的左边界字符串。此属性质是必须要有的,而且区分大小写。
    • RB:动态数据的右边界字符串。此属性质是必须要有的,而且区分大小写。
    • RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性质可以是All或是数字,而且可有可无。
    • Search:搜寻的范围。可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值)。此属性质可有可无。
    • ORD:指明从第几次出现的左边界开始才是要撷取的数据。此属性质可有可无,默认值是1。假如值为All,则所有找到符合的数据会储存在数组中。
    • SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始储存到参数中。此属性质不可为负数,其默认值为0。
    • Convert:可能的值有二种:
    o HTML_TO_URL: 将HTML-encoded数据转成URL-encoded数据格式
    o HTML_TO_TEXT:将HTML-encoded数据转成纯文字数据格式
    • SaveLen:从offect开始算起,到指定的长度内的字符串,才储存到参数中。此参数可有可无,默认值是-1,表示储存到结尾整个字符串。
    范例
    web_reg_save_param("A", "LB/ic=<a href=", "RB='>", "Ord=All", LAST);nner会搜寻网页中所有以 「<a href=」 开头,且以 「’>」结束,当中包含的字符串,并且储存在「A」参数中。
    Tips and Tricks
    以下提供一些关联的常见问题:
    • 如何打印出参数值?
    lr_output_message这二个函数来做到。例如:
    lr_output_message(“Value Captured = %s”, lr_eval_string(“{ParameterName}”));
    lr_eval_string与lr_output_message函数的使用说明请参考LoadRunner Online Function Reference。
    • 在脚本的data目录下找不到路制时的快照(snapshot)
    造成在脚本的data目录下找不到路制时的快照(snapshot)的可能原因如下:
    o 脚本是由VuGen 6.02或更早的版本所录制的
    o 汇入的Action不会包含快照(snapshot)的档案
    o 脚本是储存在只读的目录下,早成VuGen无法储存执行时撷取的快照(snapshot)
    o 某些步骤并不会产生快照(snapshot),如浏览某个资源
    o 快照(snapshot)功能被取消
    【Tools】>【General options】>【Correlation】tab >【Save correlation information during replay】
    • 开启WinDiff时出现「File no longer available」的错误讯息
    WinDiff这个工具有些限制,无法开启包含空格符的目录或是脚本,所以建议命名时不要使用空格符,并且尽可能将名称取短一点。
    • 录制时突然跳出【Correlation warning】对话窗口
    当你有勾选自动关联的【Issue a popup message and let me decide online】选项,当VuGen发现有可能要做关联的数据时,就会跳出【Correlation warning】的窗口,询问你要做关联(Correlation in scrīpt)还是要忽略(Ignore)。
    另外你也可以勾选【Perform correlation in scrīpt】,让VuGen自动作关联,不会再跳出询问窗口。
    或是勾选【Disable correlation engine】,关闭自动关联的功能。

    • 如何手动启动「Scan action for correlation」的功能
    要手动启动「Scan action for correlation」的功能,请先执行脚本一次后,点选【Vuser】>【Scan Action for Correlation】。

    • 执行完脚本后并未出现【Scan Action for Correlation】窗口
    要启用【Scan Action for Correlation】功能,请点选【Tools】>【General options】>【Correlation】tab,勾选【Show Scan for correlation popup after replay of Vuser】选项。
Open Toolbar