关联的原理

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

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

服务器每次接收到用户名和密码的登录请求后返回新的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

弹出如下,

点击 Yes,进行关联扫描

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

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

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

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

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

2  手动关联

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

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

3  一边录制一边关联

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

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

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

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

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

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

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

手动关联举例

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

点击OK后,弹出如下图

填写如下

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

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

注意:每一句“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”函数

改好了代码自动变为如下

web_reg_save_param(”temp”,

“LB=”,

“RB=”,

“Ord=1”,

“Search=Noresource”,

LAST

);

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

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

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

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

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

1.直接在代码上修改

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

点击OK后,如下

运行结果:

如下,定位Web Tours

运行结果:

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

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

输出结果:

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

寻找关联点

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

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

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

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

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

#查找需要关联的值

方法1:通过比较脚本

1.录制并保存脚本.

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

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

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

方法2:回放日志查找

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

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

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

Loadrunder之脚本篇——关联的更多相关文章

  1. Loadrunder脚本篇——关联数组(参数数组)

    导言 前面说过可以用关联取出服务器相关的一些动态变化的信息,前面也提过web_reg_save_param中可以设置ord=all,代表从服务器中取出的是一个数组,它试用的场景是当我访问一个发帖网站, ...

  2. loadrunder之脚本篇——接口传参为本地文件

    导言 前几天需要对公司一个专门很重要的接口进行压测,这个还不是重点,重点是传参为本地的图片!刚刚开始通过web_custom_request()函数来解决,可是脚本并不能通过!后面又百度不到答案,通过 ...

  3. Loadrunder之脚本篇——关联函数对话框详解

    Insert->New Step,打开Add Step对话框 选择函数web_reg_save_param,点击OK,打开关联函数设置窗口 说明: Parameter Name 此处设置存放参数 ...

  4. Loadrunder之脚本篇——检查点

    VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地运行了,并且是运行通过的.而大多数系统出错时是不会返回错误页面 ...

  5. Loadrunder之脚本篇——事务时间简介

    事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容(脚本section).定义事务来衡量服务器的性能,例如,你可以 ...

  6. loadrunder之脚本篇——脚本基础知识和常用操作

    1)编码工具设置 自动补全输入Tools->General Options->Environment->Auto complete word 显示功能语法Tools->Genr ...

  7. loadrunder之脚本篇——定义全局变量

    如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误. 打开Script视图中左侧Action列表中的globals.h文件,可定义 ...

  8. loadrunder之脚本篇——int类型和字符串的相互转换

    字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345");  //将字符串变为整形 lr_output_message(" ...

  9. loadrunder之脚本篇——Run-time Settings之Pacing

      As soon as the previous iteration ends 前一个迭代一结束就尽可能快的开始新一轮的迭代   After the previous iteration ends ...

随机推荐

  1. LeetCode300. Longest Increasing Subsequence

    Description Given an unsorted array of integers, find the length of longest increasing subsequence. ...

  2. Android开发学习秘籍笔记(十九)

    吼.花了2天最后做出了一个类似于蓝牙串口助手功能的小程序,事实上也是实习公司的要求---有一个蓝牙无线扫描枪,要求终端能够通过蓝牙连接到该设备,而且蓝牙无线扫描枪扫描二维码或者条形码的时候能够将二维码 ...

  3. ES6 学习笔记 (1)

    笔记来源:廖雪峰老师的javascript全栈教程 ES6:JavaScript的标准,ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了, ...

  4. 关于搭建HTTPS服务器服务

    关于 HTTPS 的基本原理大家都已经不再陌生,今天和大家说说如何搭建一个支持 HTTPS 的服务端. 服务端的 HTTPS HTTPS 已经几乎成为了当前互联网推荐的通信方式,它能最大化保证信息传输 ...

  5. go开启多进程——拆分多个进程同时处理(分而治之)

    使用了goroutine实现了多线程,使用chan来控制多线程. runtime.GOMAXPROCS(3)来设置最大的原生线程. runtime.Gosched() 显式地让出CPU时间给其他gor ...

  6. Python导入不同文件夹下模块

    import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, pat ...

  7. redis的下载

    网址一:https://github.com/dmajkic/redis/downloads 网址二:http://windows.php.net/downloads/pecl/releases/re ...

  8. Python 对Twitter tweet的元素 (Word, Screen Name, Hash Tag)的频率分析

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-2 @author: guaguastd @name: tw ...

  9. react native的环境搭建中常见问题

    搭建完成android的环境,我们就可以继续我们的react native环境的搭建了. 当然,按照fb的安装流程来完成rn的搭建. http://facebook.github.io/react-n ...

  10. 获取字符串已utf-8表示的字节数

    private static int utf8Length(String string) { /** Returns the number of bytes required to write thi ...