大话人生

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  299 随笔 :: 0 文章 :: 73 评论 :: 0 Trackbacks
今天我将解释 LoadRunner 中关联的概念及其使用方法。我认为关联是 LoadRunner 中一个非常关键的概念。对于任何测试工程师而言,如果他想成为 LoadRunner 专家或是宗师,那他必须非常了解何谓关联。

 实战举例: 我为某个网络服务器录制了一段 LoadRunner 脚本。脚本中包含两个特殊的域:时标(timestamp)和校验和(checksum):

在LoadRunner 脚本中使用关联(图一)

点击查看大图

        每当一个客户端网络浏览器连接到服务器,服务器就会获得一个当时的时标,再计算出校验和返回至客户端。这两个域是用来确认一次即时的会话。换句话说,一组时标 + 校验和就是会话 ID。以下就是这种交互的图解:

在LoadRunner 脚本中使用关联(图二)

点击查看大图

        问题在哪里呢?让我们再回放一次录制的脚本。 当执行已录制的脚本时,出现了问题。网络服务器用当前时间检验客户端发来的时标。如果客户端的日期是过期的或错误的,服务器就会返回一个错误的信息:参数“校验和”未找到或显示为无效值。 此次交互的图解:

在LoadRunner 脚本中使用关联(图三)

点击查看大图

     客户端不能再次使用旧的(即硬编码)的值作为时标和校验和。而必须使用新的日期。所以,LR 脚本应该运行服务器返回的动态数据,而非硬代码。使用关联就能做到这一点:

在LoadRunner 脚本中使用关联(图四)

点击查看大图

    关联的定义:关联就是捕获服务器发送给客户端的动态值。 实现关联的方法:

1、自动

2、手动

自动关联会在后文中讲到。但是至今为止,我敢说自动关联并不是最好的解决方法。因为有些时候自动关联会失效,或者错误关联。 一个真正 LoadRunner 工程师会选择使用手动关联。所以说这是“必备”的学问!好吧,让我们来开始探究手动关联。 手动关联的使用法则如下: 找到一个需要捕获的动态值。

1) 找到服务器包含该动态值的响应。

2) 捕获动态值。使用特定参数取代该动态值。

3) 将脚本中所有出现的动态值都替换为参数。

4) 检查变化。

录制脚本

获得时标 & 校验和

时标 = TSnew,校验和 = CSnew

网络 服务器

开始新一轮会话:TSnew & CSnew

OK 会话开始

客户端

解析服务器端响应,并捕获 TSnew & CSnew

现在,我要开始就每一步进行解释:

1) 找到一个需要捕获的动态值

     我建议先录制并保存两段相同的虚拟脚本。再打开主菜单项中的“Tools / Compare with Scripts...”,用 WDiff 比较这两段录制的脚本:

在LoadRunner 脚本中使用关联(图五)

点击查看大图

    黄色标出的地方即不同处。意味着每次脚本运行至该处,代码(参数值)就会发生变化。所以,多数情况下,这些值是需要关联的。

        提示:有时通过比较可能找不到动态值。那您需要再次确认是否已录制了该段脚本:

       "Name=SessionID", "Value=A38E9002A41", ENDITEM, "Name=CurrentMonthID", "Value=4", ENDITEM,

       显而易见,那个会话 ID 应该被关联。那 CurrentMonthID 呢?第二次录制的脚本也包含“Value=4”。也有可能您的脚本在四月份是工作正常的(4th month 即四月),而到 5月1日开始就会报错!所以亲爱的读者们要特别小心! 提示:通篇察看您录制的脚本源码。时标、检验和、会话 ID 以及那些不同的 ID 都可能需要被关联。 提示:仔细检查回放(执行)日志,错误可能就在里面。往往脚本错误最普遍的原因就是缺少关联。

      提示:在可用的运行视图(菜单“Tools / General Options../ Display”)中执行脚本。当出现错误(“Page not found”,“Session timeout”等)就是在暗示可能存在关联。

     提示:在可用的运行视图(菜单“Tools / General Options../ Display”)中执行脚本。当出现错误(“Page not found”,“Session timeout”等)就是在暗示可能存在关联。

2) 找到服务器包含该动态值的响应

   在执行脚本前,请设置扩展日志为可用(“Vuser / Run-Time Settings...”):

在LoadRunner 脚本中使用关联(图六)

点击查看大图

  然后执行脚本。

   打开回放(执行)日志并找到服务器的响应(包含时标、检验和的动态值):

在LoadRunner 脚本中使用关联(图七)

点击查看大图

  好!我们已经找到服务器发送动态值的地方了。而且我们也找到了返回该值的步骤——第 13 行 Action.c (13)。双击该行,连同时标以及检验和的值,打开第 13 行代码:

    web_submit_data("generateChecksum.jsp",

  "Action=http://eprumossd0010:8400/RMS/jsp/generateChecksum.jsp",

  "Method=POST", "RecContentType=text/html",

    这就表示服务器响应页面,generateChecksum.jsp 内包含应被关联的动态值。

3) 捕获动态值

  我将演示两种方法来捕获动态值:

    A. 从树视图中自动捕获

    B. 从脚本视图中手动捕获

这两种方法很相似,也使用相同的函数 — web_reg_save_param。 开始:

    A.从树视图中自动捕获

打开树视图(菜单“View / Tree view”):

在LoadRunner 脚本中使用关联(图八)

点击查看大图

然后:

? 点击“View recording snapshot only”按钮 (2);

? 从树视图中选择 generateChecksum.jsp 页面 (3);

? 选择“Body”查看服务器响应的整体内容 (4);

? 从中您将看到已录制的时标以及检验和的值 (5)。

现在让我们选择第一个动态值(检验和),右击并选择“Create parameter”,以创建参数:

在LoadRunner 脚本中使用关联(图九)

点击查看大图

 您可以开始为动态值创建参数。 如果您需要替换所有脚本中出现的动态值,请按“Yes”按钮。如果不要替换所有的,请按“No”按钮。 提示:我不建议替换所有的动态值,因为很有可能导致错误。相反,通过“Search and Replace”对话框逐个替换的效果更好。 OK,我按了“No”按钮。

返回脚本视图(“View / Script View”)查看变化。可以发现generateChecksum.jsp 页面前会出现新行:

    //[WCSPARAM WCSParam_Text1 40 715E19300D670ED77773BBF066DAAAE2866484B8] Parameter {WCSParam_Text1} created by Correlation Studio web_reg_save_param("WCSParam_Text1", "LB=window.parent.setChecksum(\"", "RB=\"", "Ord=1", "RelFrameId=1", "Search=Body", "IgnoreRedirections=Yes", LAST);

 web_reg_save_param 函数将从下一个服务器响应中查找并储存一个字符串。换句话说,它会捕获一个动态值。 在这个例子里,web_reg_save_param 函数将会把捕获的值保存在参数 WCSParam_Text1 中,并会发现左边界(window.parent.setChecksum(")和右边界(")。从左右边界之内找到的字符串将保存到参数 WCSParam_Text1 中。Ord 属性注明了被捕获值的顺序位置。本例中(Ord=1),即我们捕获的值处于左边界和左边第一个值之间。 容易想到的是,“Search=Body”意思是在服务器响应的实体内搜索。我建议通过 Help 进一步学习 web_reg_save_param 函数。 注意:捕获时标参数的方法是类似的。其生成的代码如下:

    // [WCSPARAM WCSParam_Text2 13 1192177661211] Parameter {WCSParam_Text2} created by Correlation Studio web_reg_save_param("WCSParam_Text2", "LB=, ", "RB=)", "Ord=1", "RelFrameId=1", "Search=Body", "IgnoreRedirections=Yes", LAST);

    ? 从脚本视图中手动捕获。

    事实上,这个方法与手动编辑 web_reg_save_param 函数相结合。它要求对这个函数及其参数非常熟悉。web_reg_save_param 函数有许多属性,在此我不再重复说明,请大家参考 Help。 提示:我建议重命名默认参数(WCSParam_Text1, 2, 3, etc),方便记忆。例如在此例中,我喜欢将参数 prmCheckSum 和 prmTimeStamp 重命名为 WCSParam_Text1 和 WCSParam_Text2。

4) 将脚本中所有出现的动态值都替换为参数

    将脚本中所有出现的动态值都替换为参数。 打开“Search and Replace”对话框(“Edit/Replace...”),并逐个将硬编码替换为参数。 其重要性何在?

    试想,您有以下源码:

    web_submit_data("somepage", ...

    "Name=OrderNumber", "Value=125", ENDITEM,

    "Name=UserID", "Value=125",

     如果您为 UserID 创建参数,并替换其所有的值(“125”),那么其就会生成代码:

    web_submit_data("somepage", ...

    "Name=OrderNumber", "Value={WCSParam_Text1}", ENDITEM,

    "Name=UserID", "Value={WCSParam_Text1}",

    就会产生这样的错误:当 UserID 变化,OrderNumber 可能就会变为固定值 125。 现在我能确保您已经成功替换所有需要替换的硬编码。让我们开始执行最后一步:

    5) 检查变化

    经过以上操作,我们的代码将变为:  

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->web_submit_data("rms.jsp", "Action=http://eprumossd0010:8400/RMS/jsp/rms.jsp", "Method=POST", "RecContentType=text/html", "Referer=http://eprumossd0010:8400/RMS/html/testFramework.html", "Snapshot=t4.inf", "Mode=HTML", ITEMDATA, "Name=TIMESTAMP", "Value={WCSParam_Text2}", ENDITEM, "Name=CHECKSUM", "Value={WCSParam_Text1}", ENDITEM, // others parameters ... LAST);

“{WCSParam_Text1}”表示“获取 WCSParam_Text1 参数的值”。

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->web_submit_data("rms.jsp", "Action=http://eprumossd0010:8400/RMS/jsp/rms.jsp", "Method=POST", "RecContentType=text/html", "Referer=http://eprumossd0010:8400/RMS/html/testFramework.html", "Snapshot=t4.inf", "Mode=HTML", ITEMDATA, "Name=TIMESTAMP", "Value={WCSParam_Text2}", ENDITEM, "Name=CHECKSUM", "Value={WCSParam_Text1}", ENDITEM, // others parameters ... LAST);

web_submit_data("somepage", ... "Name=OrderNumber", "Value=125", ENDITEM, "Name=UserID", "Value=125",

web_submit_data("somepage", ... "Name=OrderNumber", "Value={WCSParam_Text1}", ENDITEM, "Name=UserID", "Value={WCSParam_Text1}",

    所以,现在的规则是:

? 当服务器返回不同的检验和、时标值时

? web_submit_data 会捕获并将其置于变量 WCSParam_Text1 和 WCSParam_Text2 中

? 然后,我们使用 {WCSParam_Text1} 和 {WCSParam_Text2} 获得变量的当前值,并将其用到脚本中去。

运行修改后的脚本,并观察捕获的服务器响应的结果:

   图10

您可以看到动态值被保存至变量。很好!我们刚完成了脚本关联!

提示:使用以下语句获得并调试变量捕获的值:

  lr_output_message("Value of WCSParam_Text1:%s", lr_eval_string("{WCSParam_Text1}"));

   lr_output_message("Value of WCSParam_Text2:%s", lr_eval_string("{WCSParam_Text2}"));

再次执行,结果是:

在LoadRunner 脚本中使用关联(图十)

点击查看大图

 结束语: 我以尽可能简单易懂的语言解释了 LoadRunner 中的关联功能。亲爱的读者,非常欢迎您也能分享自己的意见和想法。 参考文献:

? Using parameters in Loadrunner VuGen script

? LoadRunner Correlation - How to capture an array of dynamic data with web_reg_save_param function

? What are LoadRunner parameter and parameterization?

? Boundaries for web_reg_save_param LoadRunner function

? How to perform basic operations on LoadRunner parameters?

posted on 2009-03-02 11:01 大话人生 阅读(910) 评论(0)  编辑 收藏 引用 所属分类: 性能测试
只有注册用户登录后才能发表评论。