fccjxxw.com
非常超级学习网 学习超级帮手
当前位置:首页 >> >>

LoadRunner资料

使用 LoadRunner 完成测试一般分为四个步骤: 1)Virtual User Generator(VuGen) 创建脚本 创建脚本,选择协议 录制脚本 编辑脚本 检查修改脚本是否有误 2)中央控制器(Controller)来调度虚拟用户 创建 Scenario,选择脚本 设置机器虚拟用户数 设置 Schedule 如果模拟多机测试,设置 Ip Spoofer 3)运行脚本 分析 scenario 4)分析测试结果 安装 LoadRunner 中文版

这月是十月,没什么特别的,只是每年都存在的十月。对我而言唯一不同的是~~是我人生正式开始 奋斗的第一个十月。刚毕业在外面工作什么都不习惯。来到这个陌生的地方,认识者陌生的人,从不 熟悉都熟悉,从熟悉到现在了更熟悉点,感觉挺好的。只是这个十月不好,我很压抑,一些莫名的东 西向我涌卷过来,我不习惯,也不喜欢,可我的面对,说不出来是什么样的感觉,是痛苦,有。面对 人生第一份工作的失利,怎么能高兴的起来,压抑,无奈,痛苦,所有悲伤的词语都在我的脑海中闪 现,不知道怎么是好,迷茫。是高兴,又怎么能不高兴呢,自己看到了自己的无知,自己的可怜。

LR 结果分析 结果分析—TPS 和吞吐率
http://www.sina.com.cn 2009 年 09 月 09 日 10:35 IT168.com

文本 Tag: 测试工具 LoadRunner 技术文档】 【IT168 技术文档】针对吞吐率和 TPS 的关系,这个在结果分析中如何使用,就个人经验和朋友 讨论后,提出如下建议指导,欢迎同僚指正。

TPS:transaction per second 服务器每秒处理的事务数。 吞吐率:测试过程中每秒从服务器返回的字节数。 从定义上来看,如果 TPS 很小,但是吞吐率比较大,说明服务器的返回的页面文件(字节数)是比 较大的,此时根据页面细分图,如果存在页面问题,考虑页面压缩。 还应根据 A1---A3,N1---N3 实际考虑。 如果 A1 或者 A3 比较大,说明 webserver 处理可能存在问题,如果 A2 比较大,则说明 DBserver 处理存在问题,建议 sql 优化。 当增大系统的压力(或增加并发用户数)时,吞吐率和 TPS 的变化曲线呈大体一致,则系统基本稳 定。 若压力增大时, 吞吐率的曲线增加到一定程度后出现变化缓慢, 甚至平坦, 同时 TPS 也趋于平坦, 查看系统资源使用,如果资源使用率比较低,说明服务器硬件资源不存在问题,查看网络流量,估计 网络带宽存在问题。 同理若点击率/TPS 曲线出现变化缓慢或者平坦, 点击率(用户每秒发出的请求数)如果在压力增 加时, 趋于平坦,很可能是服务器响应时间增加, 观察服务器资源使用情况, 确定是否是服务器问题。 TPS 是 TransactionsPerSecond 的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一 个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计 时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估 计得分。客户机使用加权协函数平均方法来计算客户机的得分,测试软件就是利用客户机的这些信息 使用加权协函数平均方法来计算服务器端的整体 TPS 得分。 一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。 系统整体处理能力取决于处 理能力最低模块的 TPS 值。依据经验,应用系统的处理能力一般要求在 10-100 左右。不同应用系统 的 TPS 有着十分大的差别,一般需要通过性能测试进行准确估算。

1. 判断应用程序的问题 如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下 文切换(context switches/sec 显示的上下文切换次数太高)那么就会占用大量的系统资源, 如果系统的吞吐量降低并且 CPU 的使用率很高,并且此现象发生时切换水平在 15000 以 上,那么意味着上下文切换次数过高. 从图的整体看.context switches/sec 变化不大,throughout 曲线的斜率较高,并且此时的 context switches/sec 已经超过了 15000.程序还是需要进一步优化. 2. 判断 CPU 瓶颈 如果 processor queue length 显示的队列长度保持不变(>=2)个并且处理器的利用 率%Processor time 超过 90%,那么很可能存在处理器瓶颈.如果发现 processor queue length 显示的队列长度超过 2,而处理器的利用率却一直很低,或许更应该去解决处理器阻塞问 题,这里处理器一般不是瓶颈.%processor time 平均值大于 95,processor queue length 大于 2.可以确定 CPU 瓶颈.此时的 CPU 已经不能满足程序需要.急需扩展. 3. 判断内存泄露问题 内存问题主要检查应用程序是否存在内存泄漏,如果发生了内存泄漏,process\private bytes 计数器和 process\working set 计数器的值往往会升高,同时 avaiable bytes 的值会降 低.内存泄漏应该通过一个长时间的,用来研究分析所有内存都耗尽时,应用程序反应情况 的测试来检验. 图中可以看到该程序并不存在内存泄露的问题.内存泄露问题经常出现在服务长时 间运转的时候,由于部分程序对内存没有释放,而将内存慢慢耗尽.也是提醒大家对系统稳 定性测试的关注. 4.磁盘问题 包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操 作速率很低,同时 % Disk Time 和 Avg.Disk Queue Length 的值很高,则可能有磁盘瓶 径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。

Physical Disk\ Disk Reads/sec and Disk Writes/sec Physical Disk\ Current Disk Queue Length Physical Disk\ % Disk Time LogicalDisk\ % Free Space

测试磁盘性能时,将性能数据记录到另一个磁盘或计算机,以便这些数据不会干
扰您正在测试的磁盘。 可能需要观察的附加计数器包括 Physical Disk\ Avg.Disk sec/Transfer、Avg.Disk Bytes/Transfer,和 Disk Bytes/sec。 Avg.Disk sec/Transfer 计数器反映磁盘完成请求所用的时间。较高的值表明磁盘控 制器由于失败而不断重试该磁盘。 这些故障会增加平均磁盘传送时间。 对于大多数磁盘, 较高的磁盘平均传送时间是大于 0.3 秒。 也可以查看 Avg.Disk Bytes/Transfer 的值。值大于 20 KB 表示该磁盘驱动器通常 运行良好;如果应用程序正在访问磁盘,则会产生较低的值。例如,随机访问磁盘的应 用程序会增加平均 Disk sec/Transfer 时间,因为随机传送需要增加搜索时间。

Disk Bytes/sec 提供磁盘系统的吞吐率。 决定工作负载的平衡 要平衡网络服务器上的负载,需要了解服务器磁盘驱动器的繁忙程度。使用 Physical Disk\ % Disk Time 计数器,该计数器显示驱动器活动时间的百分比。如果 % Disk Time 较高(超过 90%),请检查 Physical Disk\ Current Disk Queue Length 计数 器以查看正在等待磁盘访问的系统请求数量。等待 I/O 请求的数量应当保持在不大于 组成物理磁盘的主轴数的 1.5 到 2 倍。 尽管廉价磁盘冗余阵列 (RAID) 设备通常有多个主轴,大多数磁盘有一个主轴。硬 件 RAID 设备在“系统监视器”中显示为一个物理磁盘;通过软件创建的 RAID 设备显 示为多个驱动器(实例)。可以监视每个物理驱动器(而不是 RAID)的 Physical Disk

计数器,也可以使用 _Total 实例来监视所有计算机驱动器的数据。 使用 Current Disk Queue Length 和 % Disk Time 计数器来检测磁盘子系统的瓶 颈。如果 Current Disk Queue Length 和 % Disk Time 的值始终较高,可以考虑升级磁 盘驱动器或将某些文件移动到其他磁盘或服务器。 请观察 Processor\ Interrupts/sec 计数器的值, 该计数器测量来自输入/输出 (I/O) 设 备的服务请求的速度。如果此计数器的值明显增加,而系统活动没有相应增加,则表明 存在硬件问题。

LR-关联设置 关联设置
LoadRunner 2010-07-15 20:38:21 阅读 22 评论 0 字号:大中小 订阅

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

3.3.1 关联的意义 所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成撷取自服务器所送的、动态的、每次都不 一样的数据。 一般情况下,比较聪明的服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下 来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器,一般称这个辨识码为 Session ID。对于每个新的请 求,服务器都会产生新的 Session ID 给浏览器。这也就是执行脚本会失败的原因,因为 VuGen 还是用旧的 Session ID 向服务器要数据,服务器发现这个 Session ID 是失效的或者它根本不认识这个 Session ID,当然就不会传送正确的网 页数据给 VuGen 了。 下面的例子说明了这样的情形: 当录制脚本时,浏览器发出对网页 A 的请求,服务器将网页 A 的内容传送给浏览器,并且夹带了一个 ID=123 的 数据,当浏览器再发出对网页 B 的请求时,这时就要用到 ID=456 的数据,服务器才会认为这是合法的请求,并且把网 页 B 的内容送回给浏览器。

在执行脚本时会发生什么状况呢?浏览器再发出对网页 B 的请求时,用的还是当初录制的 ID=123 的数据,而不 是用服务器新给的 ID=456,因此整个脚本的执行就会失败。 要对付这种服务器,必须想办法找出这个 Session ID 到底是什么、位于何处,然后把它撷取下来,放到某个参数 中,并且取代脚本中有用到 Session ID 的部分,这样就可以成功骗过服务器,正确地完成整个交易了。 1.什么地方需要关联 凡是脚本每次执行时都必须获得唯一标识的地方都需要关联。假如脚本需要关联,如果不做关联是不会执行通过 的,也就是说会有错误消息发生。不过很遗憾,并没有任何特定的错误消息是和关联有关系的。会出现什么错误消息, 与系统实际的错误处理机制有关。错误消息有可能会提醒用户要重新登录,但是也有可能直接就显示 HTTP 404 的错误 消息。 2.如何做关联 关联会用到下列的函数: ? ? ? web_reg_save_param; web_create_html_param; web_create_html_param_ex;

其中,web_reg_save_param 的语法为: web_reg_save_param ( "Parameter Name" , < list of Attributes >, LAST ); web_create_html_param 和 web_create_html_param_ex 这两个函数主要是保留以兼容以前旧版本。建议使用 web_reg_save_param 函数。 那么,如何找出要关联数据呢?简单地说,每一次执行时都会变动的值,就有可能需要做关联。VuGen 提供两种 方式帮助用户找出需要做关联的值:自动关联和手动关联。

3.3.2 自动关联方法 VuGen 内建自动关联引擎(Auto-correlation Engine) ,提供 Rules Correlation 和 Correlation Studio 两种机制, 可以自动找出需要关联的值,并且自动使用关联函数建立关联。 1.“Rules Correlation”:在录制过程中 VuGen 会根据使用者事先制订的规则,实时自动找出要关联的值。规则 的来源有内建(Built-in Correlation)和使用者自定(User-defined Rules Correlation)关联规则两种。 ? 内建 (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”检视每 个关联规则的定义。 ? 除了内建的关联规则之外,使用者也可以自定关联规则。可以在“Recording Options”>“Internet Protocol”>“Correlation”建立新的关联规则。 请依照以下步骤使用“Rule Correlation”:

单击 VuGen 的“Tools”>“Recording Options”,开启“Recording Options”对话窗口,选取“Internet Protocol”>“Correlation”,勾选“Enable correlation during recording”,以启用自动关联。 假如录制的应用系统属于内建关联规则的系统,如 AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、 NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner 等,请勾选相对应的应用系统。或者也可针对录制的应用 系统加入新的关联规则,此即为使用者自定的关联规则。 自动关联时 VuGen 会侦测到符合关联规则的数据,以下为处理方式: 首先会跳出一个“Correlation warning”消息对话窗口,选择“Issue a pop-up message and let me decide online”: 询问用户是否要建立关联,每遇到一次询问一次,以了解每个关联数据的内容和位置。如果每次询问很麻烦,可以选择 “Perform correlation in script”(直接自动建立关联)。 2.“Correlation Studio”:有别于“Rules Correlation”,“Correlation Studio”是在执行脚本后才会建立关联,也就是 说当录制完脚本后,脚本至少须被执行过一次时“Correlation Studio”才会起作用。“Correlation Studio”会尝试找出录制时 与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。 当录制的应用系统不属于 VuGen 预设支持的应用系统时,“Rule Correlation”可能无法发挥作用,这时可以利用 “Correlation Studio”来进行关联。 使用“Correlation Studio”的步骤如下: (1)录制脚本并执行。 (2)执行完毕后,VuGen 会跳出“Scan Action for Correlation”窗口,询问用户是否要扫描脚本并建立关联,单 击“Yes”按钮,扫描脚本。 (3)扫描完后,可以在脚本下方的“Correlation Results”中看到扫描的结果。 (4)检查一下扫描的结果,选择要做关联的数据,然后单击“Correlate”按钮,逐次关联,或是单击“Correlate All” 让 VuGen 一次就对所有的数据建立关联。

由于 Correlation Studio 会找出所有有变动的数据,但是并不是所有的数据都需要做关联,所以 不建议用户直接用“Correlate All”。 重复步骤(1)~(4),直到所有需要做关联的数据都找出来为止。

有时关联的地方有多处,前面的关联如果没有执行通过,执行将停止验证脚本的正确性,后面需 要做关联的部分无法被扫描出来。

3.3.3 手动关联方法 在对脚本进行关联的时候,有的脚本利用上面介绍的方法自动关联就可以了,但是也有可能某些需要做关联的动 态数据,连“Correlation Studio”都无法侦测出来,这时就需要进行手动关联。 虽然手动关联比自动关联方法麻烦一些,操作复杂,对于没有代码编程经验的测试初学者来说,甚至有时连需要 关联的位置都无法找到,但是经过多次实践后,会发现很多关联的方法与技巧。毕竟手动关联出来的脚本拥有更大的灵 活性,可以随意改动来满足用户不同的需求。 手动关联的执行过程大致如下: ? 使用相同的业务流程与数据,录制两份脚本。

? ?

使用 WinDiff 工具协助找出需要关联的数据。 使用 web_reg_save_param 函数手动建立关联。

?

将脚本中有用到关联的数据,以参数取代。 具体的执行过程如下:

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 单一协议) ( 或是 Generation Log 多重协议) ( 中找这个值 将鼠标光标放到 Recording 。 Log 的第一行开头,按下“Ctrl+F”组合键,开启“Find”窗口,贴上刚刚复制的脚本,找出其在 Recording Log 第一次出现 的位置。 如果在 Recording Log 中找不到要找的数据,这时请先确认是否找对了脚本,毕竟现在开启了两个几乎一样的脚 本,很容易弄错。 如果在 Recording Log 中找到了要找的数据,这时要确认数据是否为从服务器端传送过来的。首先可以检查数据 的标头,从标头的 Receiving response 可以知道数据是否是从服务器端传送到客户端的。假如此数据第一次出现是在 Sending request 中,则表示此数据是由客户端产生,不需要做关联,但是有可能需要做参数化(Parameterized)。 现在已经找到录制两次不一致而且是由服务器所产生的动态数据,此数据极有可能需要做关联。 3.使用 web_reg_save_param 函数手动建立关联。 在找到由服务器所产生的动态数据之后,接下来要做的就是找出适当的位置,使用 web_reg_save_param 函数, 将这个动态数据撷取到某个参数中。 (1)web_reg_save_param 函数 对于关联来说,web_reg_save_param 是最重要的一个函数,其功能是在下载的网页内容中,通过设定的边界字 符串,找出特定的数据并将其存储在一个参数中,以供后续脚本使用。 web_reg_save_param 是一个服务端函数 (Service function ,主要用来完成一些特殊的工作 ,如关联 设定 proxy、 、 提供认证信息等),当其作用时,不会对网页的内容做任何的修改。

web_reg_save_param 同时也是一个注册类型的函数(Registration Type Function,只要函数名称中包含_reg_ 的字眼,表示其为注册类型的函数)。注册类型的函数意味着其真正作用的时机是在下一个动作函数(Action Function) 完成时。举例来说,当某个 web_url 执行时所接收到的网页内容中包含了要做关联的动态数据,则必须将 web_reg_save_param 放在此 web_url 之前,web_reg_save_param 会在 web_url 执行完毕后,也就是网页内容都下载 完后,再执行 web_reg_save_param,寻找要做关联的动态数据并建立参数。 要记住一点,当使用注册类型的函数时,要注意其放置的位置必须在要作用的动作函数之前。 (2)web_reg_save_param 的语法 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”。下面将详细说明每个属性值的意义。 ? Notfound:指定当找不到要找的动态数据时该怎么处理。 当指定 Notfound=error 时,表示着找不到动态数据时,就发出一个错误消息。此为该属性的默认值。

当指定 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:转换数据格式。当指定该属性值为 HTML_TO_URL 时,意味着将 HTML-encoded 数据转成 URL-encoded 数据格式。如果是 HTML_TO_TEXT,表示将 HTML-encoded 数据转成纯文字数据格式。 ? SaveLen:当找到匹配项后,偏移量之后的几个字元存储到参数中。此参数可有可无,默认值是-1,表示一直 到结尾的整个字符串都存入参数中。 (3)确定使用 web_reg_save_param 函数的位置 之前的步骤已经在 Execution Log 中找到可能需要关联的动态数据。在 Execution Log 中选取动态数据前的文字, 然后复制,利用这段文字,找出要关联的动态数据。不过在这之前,需要先找出使用 web_reg_save_param 函数的正确 位置,所以要再重新执行一遍脚本,而且这次会开启所有的 Log。 在 VuGen 中单击“Vuser”>“Run-Time Settings”。单击“General”>“Log”,勾选“Enable logging”、“Always sends messages”、“Extended log”以及“Extended log”下的所有选项。然后,单击“OK”按钮就可以执行脚本了。

执行完脚本之后,在 Execution Log 中搜寻刚刚复制的字符串。找到字符串后,在字符串前面会有 A.tion1.c(7), 这个 7 就是到时候要插入 web_reg_save_param 函数的位置,也就是说要插入到脚本的第 7 行。 在脚本的第 7 行前插入一行空白行,然后输入: web_reg_save_param("UserSession", 这个“UserSession”就是到时要使用的参数名称,建议取一个有意义的名字。

到目前为止,整个 web_reg_save_param 函数还没完成。 (4)确定 web_reg_save_param 中的边界。 web_reg_save_param 函数主要是通过动态数据前后的固定字符串,来辨识要撷取的动态数据的,所以还需要找 出动态数据的边界字符串。 1)确定左边界字符串 再回到 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=", 2)确定右边界字符串 接下来要找出动态数据的右边界字符串,这个字符串就比较好找了,从动态数据的最后一个字符开始,通常就是 要找的右边界字符串。 以这个例子来看,就是“>”,所以再把右边界字符串加入 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, 至此,已经完成了一个关联了,接下来就是执行脚本,验证其是否能成功运行。假如还是有问题,就要检查看看 是否还需要再做另一个关联。 4.将脚本中有用到关联的数据,以参数取代。 利用前面所介绍的方法找到需要关联的地方,把需要变更的常量用参数进行取代,具体参数化步骤参看第 3 章 3.2.1 节的内容,在此不再赘述。

参数化的过程执行如下操作: (1)用参数替换脚本中的常量。 (2)为参数设置属性和数据源。 参数化的过程要注意以下事项: (1)在参数化的过程中,只有函数中的参数能被参数化,而且也不是所有函数中的参数都能参数化。例如, Lrd_stmt 只能参数化 mpcText。 (2)参数化 CORBA 或 General_java Vsuer 这两个地方保证完整性,必须参数化整个字符串。 (3)参数的格式要与所录制的脚本相一致,否则脚本可能不能正常运行。

3.3.4 关联中的常见问题 设置语句关联时,如果经验不足,经常会出现一些问题。本节将提供一些关联过程中常见的问题的解决方法,其 他出现的问题需要在实际应用中具体分析和处理。 1.在脚本的 data 目录下找不到录制时的快照(snapshot)。 问题可能的原因如下: (1)脚本是由 VuGen 6.02 或更早的版本所录制的; (2)汇入的 Action 不会包含快照(snapshot)的档案; (3)脚本存储在只读的目录下,造成 VuGen 无法存储执行时撷取的快照; (4)某些步骤并不会产生快照,如浏览某个资源; (5)快照功能被取消。 解决办法:选择“Tools”>“General options”>“Correlation”>“Save correlation information during replay”,开启快照 (snapshot)功能。 2.开启 WinDiff 时出现“File no longer available”的错误信息。 问题的原因如下:WinDiff 工具有限制,对于包含空格符的目录或是脚本无法开启。 解决办法:为目录或脚本命名时不要使用空格符,并且尽可能将名称取短一点。 3.录制时突然跳出“Correlation warning”对话窗口。 问题的原因如下: 如果勾选自动关联的“Issue a popup message and let me decide online”选项,当 VuGen 发现有可能要做关联的 数据时,就会跳出“Correlation warning”的窗口,询问要做“关联”(Correlation in script)还是要“忽略”(Ignore),如图 3-26 所示。

图 3-26 关联警告 解决方法 可以勾选“Perform correlation in script” 让 VuGen 自动作关联 不会再跳出询问窗口 或者勾选“Disable : , , ; correlation engine”,关闭自动关联的功能。 4.如何打印出参数值 解决方法:利用 lr_eval_string 与 lr_output_message 这两个函数来打印出参数值。 例子: lr_output_message("Value Captured=%s",lr_eval_string("{ParameterName}")); 5.如何手动启动“Scan action for correlation”的功能 解决方法:要启用“Scan Action for Correlation”功能,请单击“Tools”>“General options”>“Correlation tab”,勾选 “Show Scan for correlation popup after replay of Vuser”选项。

[转贴 LR 关于检查点错误的处理 自己看 转贴] 关于检查点错误的处理(自己看 转贴 的)
检查检查
LR 中检查点有两种:图片和文字。这两种检查点可用以下三个函数实现:web_find()、web_reg_find() 和 web_image_check()

下面分别介绍三种函数的用法

1.web_find()函数 函数作用:在页面中查找相应的内容

参数举例:web_find("web_find","RighOf=a","LeftOf=b","What=name",LAST);

参数解释:"web_find"定义该查找函数的名称;“LeftOf”和“RighOf=”用来定义查找字符的左右边界; “What=”定义查找内容。

例如上述参数举例中的意思就是在页面中查找左边界为 b,右边界为 a,内容为 name 的信息

函数用法:该函数是在查找页面中的内容,所以要放在要查找的内容的后面。

注意事项:使用该函数时,要在 Vuser->Run-Tme Settings 中勾选 Enable Image and text check

系统默认是不勾选该选项的。

关于该函数的其他说明:该函数只能在基于 HTML 模式录制的脚本中进行查找。

1.web_reg_find()函数 函数作用:在缓存中查找相应的内容

参数举例:web_reg_find("Search=Body","SaveCount=ddd","Test=aaa",LAST);

参数解释:Search 用来定义查找范围,SaveCount 定义查找计数变量名称,该参数可以记录在缓存中 查找内容出现的次数,可以使用该值,来判断要查找的内容是否被找到

例如上述参数举例中的意思就是 Body 中查找内容为 aaa 的信息,并将出现次数记录在变量 ddd 中。

函数用法:该函数是在缓存中查找相应的内容,所以要放在查找内容之前。

注:在录制过程中添加的检查点,用到的函数是 web_reg_find(),且参数只有“Text=”

2.web_image_check()函数 函数作用:在页面中查找一个具体的图片。

参数说明:web_image_check("web_image_check","Alt=","Src=",LAST);;

参数解释:“Alt”和“Src”的值直接取该图片在网页源代码中相应参数的值。

函数用法:该函数是在缓存中查找相应的内容,所以要放在查找内容之前。

注意事项:使用该函数时,要在 Vuser->Run-Tme Settings 中勾选 Enable Image and text check,具体操 作请看 web_find()中的注意事项。

经过测试,该函数用到查找内容前面或后面,都不影响查找结果。

举例说明(脚本)

该脚本记录的是登陆系统后退出的操作, 在脚本中用到 atoi()函数和 lr_eval_string(”{SaveCount 定义的 变量}”)两个函数结合使用,判断查找内容出现的次数是否大于 0, 若大于 0, 则输入登录成功的信息。

vuser_init()

{

web_url("xjcost",

"URL=http://gczj-server8:9205/xjcost/",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t1.inf",

"Mode=HTML",

EXTRARES,

"Url=jsp/images/index/index.swf", ENDITEM,

"Url=jsp/images/index/xxfb2.gif", ENDITEM,

"Url=jsp/images/index/ywpt2.gif", ENDITEM,

LAST);

web_url("userAction.struts",

"URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t2.inf",

"Mode=HTML",

LAST);

return 0;

}

Action()

{

lr_start_transaction("Log_on");

lr_rendezvous("Log_on");

web_add_cookie("userAccount=admin; DOMAIN=gczj-server8");

web_reg_find("Text=欢迎您",

"SaveCount=欢迎您_Count",

LAST);

web_image_check("web_image_check",

"Src=/xjcost/jsp/images/index1/edit_01.gif",

LAST);

web_submit_data("userLogin.struts",

"Action=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin",

"Method=POST",

"RecContentType=text/html",

"Referer=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin",

"Snapshot=t3.inf",

"Mode=HTML",

ITEMDATA,

"Name=userAccount", "Value=admin", ENDITEM,

"Name=pwd", "Value=1111", ENDITEM,

EXTRARES,

"Url=jsp/images/index1/edit_01a.gif", "Referer=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin", ENDITEM,

LAST);

web_find("web_find",

"What=欢迎您",

LAST);

lr_end_transaction("Log_on",LR_AUTO);

//检查是否登录成功

//如果“欢迎您”这个字符出现次数大于 0,输出“Log on successfully!”

if(atoi(lr_eval_string("{欢迎您_Count}"))>0)

lr_output_message("Log on successfully!");

else

lr_error_message("Log on failed!");

return 0;

return 0;

}

//atoi()函数的作用是将一个 ASCII 字符串转换为整型

//lr_eval_string()函数作用是取得参数值,将字符串变量中的参数值替换为当前的参数值并将这个字符 串返回

vuser_end()

{

lr_think_time(4);

web_url("userAction.struts_2",

"URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t4.inf",

"Mode=HTML",

LAST);

return 0;

}

Global.h:

#ifndef _GLOBALS_H

#define _GLOBALS_H

//--------------------------------------------------------------------

// Include Files

#include "lrun.h"

#include "web_api.h"

#include "lrw_custom_body.h"

//--------------------------------------------------------------------

// Global Variables

#endif // _GLOBALS_H

Replay Log 常见信息说明

1.

web_find()和 web_image_check()函数的日志信息

(这两个日志信息是上一样的,只是输出的函数名和参数不同)

1)

信息 1

Action.c(22): Verification checks not enabled. web_image_check is skipped. See the 'Run-time settings/Preferences/Checks' [MsgId: MMSG-27197]

Action.c(22): web_image_check was successful

[MsgId: MMSG-26392]

出现该信息,说明没有勾选 Enable Image and text check

2)

信息 2 "web_image_check" succeeded (1 occurrence(s) found. Alt="",

Action.c(22):

Src="/xjcost/jsp/images/index1/edit_01.gif")

[MsgId: MMSG-27192]

Action.c(22): web_image_check was successful

[MsgId: MMSG-26392]

出现该信息,说明检查点设置成功,且已经查找到信息

3)

信息 3

Action.c(22):

Error

-27191:

"web_image_check"

failed

(0

occurrence(s)

found.

Alt="",

Src="/xjcost/jsp/images/index1/edit_1.gif")

[MsgId: MERR-27191]

Action.c(22): web_image_check highest severity level was "ERROR"

[MsgId: MMSG-26391]

出现该信息,说明要查找的内容没有找到。这时依次尝试以下操作:

1)检查参数的信息是否写错;

2)如果是 web_find(),检查函数的位置是否在要查找内容的后面;

3)如果是 web_image_check(),查看该图片的源代码,看其是否是这个页面上的图片,很可能是图片 选择错误,即所选图片不属于该页面。

2. web_reg_find()函数的日志信息 1)信息 1 Action.c(15): Registering web_reg_find was successful [MsgId: MMSG-26390]

出现该信息,说明内容已查找到

2)信息 2 Action.c(27): Error -26366: "Text=ABC" not found for web_reg_find [MsgId: MERR-26366]

Action.c(27): web_submit_data("userLogin.struts") highest severity level was "ERROR", 18364 body bytes, 918 header bytes, 13 chunking overhead bytes [MsgId: MMSG-26387]

该信息在 replay log 页面是红色显示的,说明没有找到内容,出现此情况尝试以下两个操作:

1)参数的信息是否正确;

2)查看该函数是否在查找内容的前面

有时会报如下两个错误 (1)“Failed to create list of projects on current Quality Center server.” (2)“Failed to Get Domain List.” 原由:这个错误可能是由于老版本的 QTP、WinRunner、或者 LoadRunner 不能很 好的支持新版本的 QC 所造成的。 解决方法: 1、进入 QC 的管理员页面,以管理员帐户登录 2、选择站点配置(Site Configuration )Tab 页 3、将 BACKWARD_SUPPORT_ALL_DOMAINS_PROJECTS 一项的值设置为“Y”(如果 没有该项,则自己手动创建添加)

这篇文章是转自我在 csdn 的 blog。

最近有很多朋友在软件测试的 QQ 群中问我关联如何做,我就在这里简单的说一下.

?盅;'醌?

loadrunner 中关联可以分为自动关联与手动关联,关联函数为 web_reg_save_param:

?譡 T 砿?

1.自动关联,在 tools-recording options 的 correlation 中,选中 enable correlation during recording 的复选框, 在下面 list 中选择你需要自动关联的协议。这样在录制脚本时,在可关联处会弹出一个 dialog 进行选择是否对该处进 行关联,这样,在你脚本录制好之后,关联已经自动生成了,十分方便。 另一种自动关联的方法是,你在 tools-recording options 的 correlation 中,不选中 enable correlation during r ecording 的复选框的情况下进行自动关联,你可以先录制一个脚本,然后选择 vuser-scan action for correlation 或者 直接 ctrl+f8 来运行一下脚本,这样也能自动找到不同的地方而进行自动关联,此时你只需要钩选你需要关联的地方后 点击关联即可。
?lt;?3>團 V

2.手工关联,需要录制 2 个相同业务流程的虚拟用户脚本,然后通过 tools-compare with vusers 来打开 wdiff.exe 对 2 个脚本进行比较,找到需要关联的部分,然后指定左右边界,然后将脚本中原来的值替换成参数即可.


更多相关文章:

非常超级学习网 fccjxxw.com

copyright ©right 2010-2021。
非常超级学习网内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图