关联的原理

关联也属于一钟特殊的参数化。一般参数化的参数来源于一个文件、一个定义的table、通过sql写的一个结果集等,但关联所获得的参数是服务器响应请求所返回的一个符合条件的、动态的值。

例子:常见系统中的登陆功能,在登陆后服务器会返回SessionID,登陆后的操作都需要提交该SessionID确认身份。使用VuGen录制脚本时,Vugen将会记录服务器返回的SessionID,并且原封不动地在下一个请求中发送给服务器。

Loadrunder之脚本篇——关联-LMLPHP

服务器每次接收到用户名和密码的登录请求后返回新的SessionID,但是回放脚本时,仍然发送旧的SessionID给服务器,最终因新的SessionID和旧的SessionID不一致,导致脚本回放失败。

也就是说,录制的脚本中的SessionID是固定不变的,而服务器返回的SessionID是根据登录请求动态变化的。由此产生了问题。为了确保脚本回放的成功,我们需要获得服务器每次返回的动态SessionID,再将这个动态参数发回给服务器。而关联则可以做到这点。关联通过web_reg_save_param()函数来实现,这个函数可以帮助我们完成对服务器返回的保存操作。

注意:

关联函数是一个注册型函数,需要告诉VuGen下一个请求返回是需要被处理的。所以该函数必须要写在请求前,如下,否则就会提示无法获得关联结果的错误。这时绝大多数使用关联的新手最容易犯错的错误。

Action()

{

//在请求前添加关联函数

web_url(“localhost:8081”,”URL=http://localhost:8081/”,LAST);

return 0;

}

关联的方式

关联就是对服务器的返回做处理的过程,而关联方式有3种:

自动关联

手动关联

一边录制一边关联

2  自动关联

VuGen提供的自动关联处理策略,它的原理是对同一脚本运行和录制时的所有服务器返回进行比较,来自动查找变化的部分,并且提示是否生成关联。

注意:使用自动关联前必须先运行一次脚本。

点击Vuser->Scan Script for Correlations

Loadrunder之脚本篇——关联-LMLPHP

弹出如下,

Loadrunder之脚本篇——关联-LMLPHP

点击 Yes,进行关联扫描

Loadrunder之脚本篇——关联-LMLPHP

如上图,如果有可关联的对象则会显示在上图的关联结果中

如有数据的情况下,单击Correlate按钮后,则生成一个关联,关联的前后内容和所属Action也被列出来。自动关联结束。脚本中会自动添加关联函数web_reg_save_param_*函数并将被关联的内容保存到一个叫参数中去

回放脚本,如果还有其他关联引起的错误,重复上述操作。

自动关联是通过录制和回放时的服务器返回值比较确定需要关联的内容,然后再帮助生成对应的关联函数,常用在非标准的动态数据处理中。如sessionid,在大多数情况下,脚本无法正常回放都可以通过自动扫描的方法来生成关联,解决动态数据的问题。

但是自动关联有很强的局限性,无法实现特殊的动态数据捕获,例如帖子的id,作者名等,这个时候就需要手动关联来解决它了。

2  手动关联

通过web_reg_save_param()将想要的字符串保存到一个参数中。从而捕获从服务器返回的标题或正文的文本内容,也可以用来捕获服务器返回的超链接。

通常情况下,关联的对象一般都是选择链接地址而不是链接名,这样可确保在以后的使用中比较简单

3  一边录制一边关联

打开录制选项(Tools->Correlation选项),录制选项时建议大家在初期都将Enable选项去掉。禁止这个功能的使用。

Loadrunder之脚本篇——关联-LMLPHP

这里Vugen提供了一些常见应用需要做的关联规则,这些规则有效解决了录制脚本后回放失败的问题,但是同时也带来弊端。例如:如果需要录制的项目使用了和规则十分相似的数据返回格式,而开发又在其中写了一些自定义的不规范内容,就会导致VuGen错误关联数据,使本来能够回放成功的脚本由于添加了错误的自动关联而无法正常回放。

如何设置一个自定义的新规则

单击New Application按钮,新建一个应用

点击刚建的应用,单击New Rule新建一个规则

填写规则的左边界,右边界等

新建一个脚本,重新录制,系统会自动按照规则生成关联函数。

手动关联举例

Loadrunder之脚本篇——关联-LMLPHP

将鼠标移动到添加关联的函数中的指定位置,然后选择Insert->New Step选项(或右键也可以),在系统弹出Add Step窗口中查找关联函数,如下图

Loadrunder之脚本篇——关联-LMLPHP

点击OK后,弹出如下图

Loadrunder之脚本篇——关联-LMLPHP

填写如下

Loadrunder之脚本篇——关联-LMLPHP

点击确定后,在脚本中光标所在的地方添加如下web_reg_save_param函数

Loadrunder之脚本篇——关联-LMLPHP

关联函数的作用,通过一种规则将服务器的返回保存到一个参数中,所以为了看到参数的内容,应打开参数取值的日志选项

Loadrunder之脚本篇——关联-LMLPHP

注意:每一句“Notify:Saving Parameter temp=”后面都是被关联到的服务器返回,我们会发现返回不止一条。具体分析会发现,被关联到的内容有以下几种:

1.HTML

2.CSS

3.JavaScript

4.JPEG、PNG、GIF

也就是说,通过这个函数获得了服务器所有的返回内容。

对于图片和CSS等内容其实一般都不是我们关心的,系统的动态数据需要关联的服务器返回信息一般都保存在HTML正文中。所以接着修改一下关联函数,将Search In选项从ALL修改为Noresource,也就是只要关联HTML、XML等资源而不关联附属的信息。

修改Search In选项为Noresource

切换到Tree模式下,双击“Reg Save Param”函数

Loadrunder之脚本篇——关联-LMLPHP

改好了代码自动变为如下

web_reg_save_param(”temp”,

“LB=”,

“RB=”,

“Ord=1”,

“Search=Noresource”,

LAST

);

可以看到被关联内容只有一个了,而且就是服务器返回的HTTP包中的正文内容,和通过VuGen看到的服务器返回内容完全相同,这个返回是保存在一个叫temp的参数中。

Loadrunder之脚本篇——关联-LMLPHP

整个HTTP请求分为两段,一段是开头数据包,叫做header,另外一段是HTML页面,叫做body。在“Search”选项中可以修改为Header或者body来更加精确地划分关联范围。

通常,我们还是使用Noresource来处理关联范围,因为这样可以得到最常用的返回内容。得到了服务器返回的内容,接着就可以做任何想做的事情,如获得页面中的任意一个对象。

关联函数提供了一个叫做左边界、右边界的策略,只需要填写这个规则,它会在整个被关联范围内查找符合该规则的内容。

Loadrunder之脚本篇——关联-LMLPHP

如上,修改关联函数。修改关联函数方法:

1.直接在代码上修改

2.切换到Tree模式下,双击关联函数,在Lef Boundary/Right Boundary中输入条件,修改关联函数。

Loadrunder之脚本篇——关联-LMLPHP

点击OK后,如下

Loadrunder之脚本篇——关联-LMLPHP

运行结果:

Loadrunder之脚本篇——关联-LMLPHP

如下,定位Web Tours

Loadrunder之脚本篇——关联-LMLPHP

运行结果:

Loadrunder之脚本篇——关联-LMLPHP

注意:输出结果前后有空格

解决方法,在左边界和右边界都添加空格

Loadrunder之脚本篇——关联-LMLPHP

Loadrunder之脚本篇——关联-LMLPHP

输出结果:

Loadrunder之脚本篇——关联-LMLPHP

注意:关联函数的结果需要请求结束后才能获得,所以提取关联结果参数的值必须在请求后,而关联函数必须在请求前。

寻找关联点

由于我们在访问请求前设置规则,服务器返回的动态内容都会被关联函数捕获并且保存到参数中,这样实现了对动态数据的捕获,通过后期处理过程,即可完成对动态对象的操作。

以下字符串最可能需要关联

* 登录字符串.一个带有动态数据的登录字符串,比如session ID或一个时间戳timestamp.

* Date/Time Stamp.任何使用了日期或时间戳time stamp,或者其他用户凭证的字符串

* Common Prefix. 带有特征字符串的前缀,如SessionID或CustomerID,。

#查找需要关联的值

方法1:通过比较脚本

1.录制并保存脚本.

2.创建另一个脚本并录制关键操作,保存脚本。

3.选择Tools > Compare with Script来比较脚本

4.脚本中的不同点被高亮。重新审视不同点来判断哪些需要关联。

Loadrunder之脚本篇——关联-LMLPHP

方法2:回放日志查找

a 扫描脚本视图中的脚本,查找可能需要管理的字符串,如哈希字符串,随机字符串,会话id等。

b 在脚本生成日志中,查找字符串(服务器返回的字符串)第一次出现的时间。

c 扩展回放日志中查找同样的字符串。检查同一个边界上,服务器返回是否包含不同字符串。如果是则需要关联。

05-25 15:59