性能测试LR小结之参数关联(LoadRunner11.0)

关联对于LR是经常需要用到的,本章使用简单登录来介绍关联功能。

1.       Q:何为关联?

所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成撷取自服务器所送的、动态的、每次都不一样的数据。通俗讲就是变量替换,把每次访问页面中的一些动态参数,使用固定的变量进行替换。如:最常见的sessionid,不同用户访问系统会产生不同的sessionid,

2.      
Q:为什么要关联?

如在一个登录脚本中用户登录每次都会生成一个sessionid。而该sessionid再下一次脚本回放时,就不能使用了,导致脚本执行失败。这时候我们就需要关联,通过关联把该sessionid在脚本中也设置成动态,保证脚本能够正确运行。

3.      
Q:如何关联?

下面内容将详细介绍如何进行关联,自动关联部分只做简单介绍,不用实例讲解,因为实际工作中LR自带关联,远没有手动关联好用。

3.1.    自动关联

LR自带一些关联规则,可以在录制脚本的时候启用这些关联规则, VuGen内建自动关联引擎(Auto-correlation Engine),提供Rules 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.2.    手动关联

虽然手动关联比自动关联方法麻烦一些,操作复杂,对于没有代码编程经验的测试初学者来说,甚至有时连需要关联的位置都无法找到,但是经过多次实践后,会发现很多关联的方法与技巧。毕竟手动关联出来的脚本拥有更大的灵活性,可以随意改动来满足用户不同的需求。

手动关联其实只需以下三步即可:

Ø  找出需要关联的数据。

Ø  使用web_reg_save_param函数手动建立关联。

Ø  将脚本中有用到关联的数据,以参数取代。

1.     
 

2.     
 

3.     
 

3.1.     
 

3.2.     
 

3.2.1.      如何找出关联数据

笨拙的办法就是录制两次脚本,然后使用在第二份脚本中,单击VuGen的“Tools”>“Compare with Vuser…”,并选择第一份脚本。接着WinDiff会开启,同时显示两份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字(假如没看到红色字体,请单击 “Options”>“View”>“Show Inline Differences”)。

逐一检视两份脚本中差异的部分,每一处差异都可能是需要做关联的地方。选取差异的脚本,然后复制。在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。

如果在Recording
Log中找不到要找的数据,这时请先确认是否找对了脚本,毕竟现在开启了两个几乎一样的脚本,很容易弄错。

如果在Recording
Log中找到了要找的数据,这时要确认数据是否为从服务器端传送过来的。首先可以检查数据的标头,从标头的Receiving response可以知道数据是否是从服务器端传送到客户端的。假如此数据第一次出现是在Sending request中,则表示此数据是由客户端产生,不需要做关联,但是有可能需要做参数化(Parameterized)。

注意:

请忽略lr_thik_time的差异部分,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间的。

在实际测试工作中很少用这种办法,如果对系统业务足够的熟悉,完全凭自己经验,对脚本内容中的动态参数进行查找,且可以选择性查找,进行关联。

3.2.2.      使用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函数的位置

开启所有的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行。

例:以下为登录脚本内容:

  1. web_submit_data("login.pl",
  2. "Action=http://127.0.0.1:1080/WebTours/login.pl",
  3. "Method=POST",
  4. "RecContentType=text/html",
  5. "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
  6. "Snapshot=t9.inf",
  7. "Mode=HTTP",
  8. ITEMDATA,
  9. "Name=userSession", "Value= A939058C4F0948A3035A87F0A094EE0A ", ENDITEM,
  10. "Name=username", "Value=tsbc520", ENDITEM,
  11. "Name=password", "Value=123456", ENDITEM,
  12. "Name=JSFormSubmit", "Value=off", ENDITEM,
  13. "Name=login.x", "Value=0", ENDITEM,
  14. "Name=login.y", "Value=0", ENDITEM,
  15. LAST);

根据经验从上面脚本中可以看出,userSession,username,password 三个参数是变量。而userSession是服务器自动生成的,因此需要我们对userSession进行关联。

定义关联变量:

  1. web_reg_save_param("ts_Session",
  2. "LB=userSession value=",
  3. "RB=>",
  4. "Ord=1",
  5. "Search=Body",
  6. LAST);

将关联函数插入到web_submit_data函数上方的web_url(访问页面的链接的)前面的。

3.2.3.      将脚本中有用到关联的数据,以参数取代

最后将登录函数中userSession变量进行关联替换。如:

  1. web_submit_data("login.pl",
  2. "Action=http://127.0.0.1:1080/WebTours/login.pl",
  3. "Method=POST",
  4. "RecContentType=text/html",
  5. "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
  6. "Snapshot=t9.inf",
  7. "Mode=HTTP",
  8. ITEMDATA,
  9. "Name=userSession", "Value= {ts_Session} ", ENDITEM,
  10. "Name=username", "Value=tsbc520", ENDITEM,
  11. "Name=password", "Value=123456", ENDITEM,
  12. "Name=JSFormSubmit", "Value=off", ENDITEM,
  13. "Name=login.x", "Value=0", ENDITEM,
  14. "Name=login.y", "Value=0", ENDITEM,
  15. LAST);

将参数的替换为:{ts_Session} 这样每次运行脚本,即使更换不同的用户进行登录,userSession也会动态生成。

可以使用输出函数将生成的动态值打印出来进行确认。

lr_log_message("userSession is: %s",lr_eval_string("{ts_Session} "));

结果会在Replay Log 中显示。

至此,简单的参数关联就结束了,在实际使用中会有更多的需要我们进行关联的地方,问题面前不要吓到,一个一个分析一个一个解决,积累经验小白最终会变成老鸟。

上面内容Web_reg_save_param 函数位置问题,没有讲的很详细,个人感觉这里,大家在使用过程中可以去尝试,但必须放在web_submit_data的上面。

LoadRunner使用之变量关联的更多相关文章

  1. 转:如何在 LoadRunner 脚本中做关联 (Correlation)

    如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...

  2. LoadRunner 技巧之 自动关联

    LoadRunner 技巧之 自动关联 这一节讲loadunner 关联的问题,其实这个东西理解起来简单,但说起来比较麻烦. 关联的原理:                               ...

  3. LoadRunner中多值关联的3种处理方式

    需求:通过关联取得的ParamName参数可能存在多个值,需要对每个ParamName参数值进行处理 脚本:可通过3种不同的实现方式,将每个参数值作为HTTP请求内容发出  web_reg_save_ ...

  4. loadrunner ---<三>循环输出关联数组

    web_reg_save_param,将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里.在本例中,假设关联值返回三条记录,则LR分别将值保存到sor_1,sor_2,so ...

  5. loadrunner怎样进行手动关联

    转自:http://novasblog.blog.163.com/blog/static/43713514200901341934981/ 手动关联的主要步骤为:        第一步:录制测试脚本, ...

  6. LoadRunner 参数和变量的区别(未完)

    挺久没来更新了,坚持是件不容易的事呢,之后坚持每天总结下前一天的学习点 在LR中,参数是一种更高级的变量,他们能起到同样的效果,但同时也有几点不同 1. 定义方法不同 (这个还没看懂) 2. 调用语法 ...

  7. LoadRunner使用之变量参数化

    LR性能测试之参数化设置 Q:何为参数化? LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如 ...

  8. loadrunner怎么将变量保存到参数中

    用这个lr_save_string 函数 char *b = "很简单";lr_save_string(b,"b"); lr_output_message(&q ...

  9. Loadrunner的Socket脚本关联小技巧

    Socket脚本关联小技巧 我们在socket脚本调试的时候经常会遇到很多问题,比如:socket包中繁杂的二进制编码,socket数据如何进行截取,如何对socket数据包进行参数化等等,以下几点内 ...

随机推荐

  1. WOW: 宏

    1.常用的宏命令 1.1常用的宏命令 1.释放技能命令 /cast 释放一个或多个技能,可以加入一些条件判断,是最常用的命令 /castsequence 依次释放释放数个技能,同样可以加入一些条件判断 ...

  2. paper 8:支持向量机系列五:Numerical Optimization —— 简要介绍求解求解 SVM 的数值优化算法。

    作为支持向量机系列的基本篇的最后一篇文章,我在这里打算简单地介绍一下用于优化 dual 问题的 Sequential Minimal Optimization (SMO) 方法.确确实实只是简单介绍一 ...

  3. oracle的会话(session)

    会话(session)是oracle服务器对数据库连接用户记录的一种手段. oracle提供了v_$session的视图存储当前数据库的会话,查询时用v_$session 或v$session sql ...

  4. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. linux的vim按了ctrl+s之后假死的解决办法

    习惯了很多软件的保存的快捷键,经常在vim中按下ctrl+s,然后就发现vim不响应了,之间一直采用kill的方式解决,近来搜了一下,是这样子的: 这时的vim并没有死掉,只是vim不再向终端输出东西 ...

  6. 4项技巧使你不再为PHP中文编码苦恼

    PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码,中国的 GB2312-80,日本的 JI ...

  7. small details

    1.操作数据时,一般能入库就入库,或者用xml文件,用文件操作比较复杂

  8. SQLServer查询速度慢的原因

    查询速度慢的原因很多,常见如下几种:  1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应.  3.没有创建计算列导致查询不优化.  4.内存 ...

  9. Oracle体系结构总览(整理)

    先让我们来看一张图  这张就是Oracle 9i的架构全图.看上去,很繁杂.是的,是这样的.现在让我们来梳理一下:一.数据库.表空间.数据文件1.数据库数据库是数据集合.Oracle是一种数据库管理系 ...

  10. 161108、Java IO流读写文件的几个注意点

    平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? ...