打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
3.2 录制用户行为 - AJava
 
核心提示:3.2 录制用户行为 录制脚本是模拟用户行为的第一步,通过录制用户行为产生的协议从而生成Vuser Script。当我们对函数比较熟悉的时候,可以抛弃录制的过程,而采用手工编写。在大多数情况下,我们会在录制生成的脚本上根据实际需求进一步进行修改,这样效率更

3.2  录制用户行为

录制脚本是模拟用户行为的第一步,通过录制用户行为产生的协议从而生成Vuser Script。当我们对函数比较熟悉的时候,可以抛弃录制的过程,而采用手工编写。在大多数情况下,我们会在录制生成的脚本上根据实际需求进一步进行修改,这样效率更高。

3.2.1  录制流程

录制用户行为转化为脚本一般是按照以下步骤进行的,如图3.6所示。

在开始菜单中找到LoadRunner程序项并打开Application,找到Virtual User Generator,选择文件菜单下的“新建”功能,创建脚本。

3.2.2  协议选择

在前面我们知道性能测试是基于协议的,所以首先要选择匹配的协议,如果协议错误将会导致无法录制用户行为,选择过多会导致录制内容的冗余,而选择不足又会导致漏录的情况发生。新建脚本首先需要选择协议类型,在VuGen中分为单协议和多协议两种情况。

图3.6  VuGen录制流程

单协议(New Single Protocol Script)

在单协议情况下,所要录制的对象只使用唯一的协议,如图3.7所示。

图3.7  单协议选择界面

通过Category可以对协议进行分类,方便查找。

多协议(New Multiple Protocol Script)

在需要录制的对象使用多于一种协议的情况下,应该选择多协议,并且将这些协议都进行添加,否则会因为漏选协议而无法正常回放脚本,如图3.8所示。

图3.8  多协议选择界面

确定系统使用协议最简单的方法就是询问开发人员,特别是C/S架构使用的协议可能比较特殊,甚至有可能是自行开发的协议包规范。另外一种方法就是通过网络扫描工具拦截数据包,确定协议类型。

由于绝大多数性能测试都是基于B/S架构下的HTTP协议,所以后面的章节主要针对HTTP,在高级脚本开发中会涉及部分非HTTP协议的脚本开发内容。

3.2.3  录制选项

在选择合适的协议后准备开始录制,而选择不同的协议后弹出的录制窗口和录制选项也不尽相同。

这里选择Web(HTTP/HTML)协议(模拟浏览器和Web服务器之间的协议交互),如图3.9所示。

弹出Start Recording窗口,如果没有弹出可以使用Vuser菜单下的Start Recording或Ctrl+R组合键启动录制过程,如图3.10所示。

  

图3.9  选择Web协议            图3.10  Start Recording窗口(Internet应用)

Applications Type

首先需要设置的是Application type,VuGen中提供了Internet Applications和Win32 Applications两种应用的录制选项。

Internet Applications:指需要录制的对象是一个网络应用(基于浏览器)。

Program to record:指需要录制的程序名,VuGen默认支持的Web客户端是IE,也建议不要使用任何第三方的浏览器来录制,避免出现不兼容。从Load Runner 9.1版本开始已经能够很好地兼容IE 7.0(最新版本9.5仍然没有提供对IE 8.0的支持)。

URL Address:录制开始所需要访问的URL地址,也就是第一个请求所需要访问的   页面。

Working directory:用来指定代码的工作目录。

Win32 Applications是用来支持Win32的标准客户端,如果客户端是自行开发的,请使用该选项,如图3.11所示。

Program to record:需要录制的应用程序,我们可以通过后面的

 按钮将访问的应用程序添加进来。

Program arguments:指程序参数,在某些应用程序后需要添加一些参数才能运行,这里提供的是填写参数的位置。

图3.11  Start Recording窗口(Win32应用)

Record into Action:录制的内容会被存放在Action中,Action是VuGen提供的一种类似于函数的脚本块,通过将不同的操作存放在不同的Action中实现代码的高内聚低耦合。

这里可以单击New按钮来新建Action。

VuGen默认提供了以下3个Action:

Ÿ Vuser_init

Ÿ Action

Ÿ Vuser_end

这里可以先简单介绍一下这 3个Action有什么不同,在LoadRunner中用户的初始化操作应该存放在Vuser_init中,用户的结束操作存放在Vuser_end中,因为这两个Action在后面的Run Logic默认设置中是处在脚本最先运行和最后运行的位置,并且在负载时Vuser_init和Vuser_end只会在开始和结束时被运行一次。而 Action用来存放用户的操作,可以当做普通的函数在负载时会被反复运行。

Record the application startup:单击OK按钮后VuGen会启动我们需要录制的应用,这个选项是指一旦启动了应用后就将开始录制应用收发的协议数据。

为了确保录制出来的脚本简洁有效,在开始录制前需要对录制选项进行一定的设置。

录制选项

在不同的协议下录制选项各不相同,这里介绍基于Web(HTTP/HTML)协议录制选项的设置,如图3.12所示。

图3.12  HTML协议录制选项

General

Ÿ Script:基于Web(HTTP/HTML)协议的Vuser脚本是使用C语言作为标准的。在不同的协议下,所使用的语言也不相同。在Script选项中提供了一些对于脚本的基本设置。

例如这里可以通过Maximum number of lines in action file设置每个Action中的最大代码行数。

Ÿ Protocols:协议列表,在这里会列出录制前选中的所有协议,通过修改协议前的选项来决定使用什么协议来录制脚本,在多协议的时候可以通过这个功能切换录制所使用的协议或补录某些协议的内容,如图3.13所示。

Ÿ Recording:录制选项用于设置Web(HTTP/HTML)使用什么样的录制方式来获得脚本,这里提供了两大类的录制方式,如图3.14所示。

Ÿ HTML-based Script:这种方式录制出来的脚本是基于HTML的,以HTML操作为录制级别,非HTML操作不进行录制。由于现在使用的B/S架构网站都是基于 HTML,也就是说访问的页面都是从一个HTML跳转到另外一个HTML,那么录制的时候只需要得到针对HTML的请求即可。

       

图3.13  协议激活列表                        图3.14  录制级别选项

下面打开HTML Advanced…高级选项,弹出如图3.15所示的对话框。

图3.15  HTML-based script高级设置

Script type提供了基于HTML方式下的两种不同的脚本类型。

1.高级选项下的Script type脚本类型选项

Ø  A script describing user actions

基于解释用户行为的脚本,后面提示使用类似web_link、web_submit_form等的函数,这种脚本录制出来有些类似于QTP,具体描述了用户进行了什么操作。

现在我们使用这种方式录制一个脚本(打开Web Tours网站,然后单击sign up now),录制完成后可以得到以下脚本:

                       web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");

                       web_url("WebTours",

                       "URL=http://127.0.0.1:1080/WebTours/",

                       "Resource=0",

                       "RecContentType=text/html",

                       "Referer=",

                       "Snapshot=t1.inf",

                       "Mode=HTML",

                       LAST);

                       web_link("sign up now",

                       "Text=sign up now",

                       "Snapshot=t2.inf",

                       LAST);

下面我们简单分析一下这个脚本的组成。

web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");

这个函数是由LoadRunner提供的,根据函数的名称也可以大概猜到其功能,函数web_add_cookie()主要负责为Vuser脚本添加一个cookie信息。

web_url("WebTours",

                           "URL=http://127.0.0.1:1080/WebTours/",

                           "Resource=0",

                           "RecContentType=text/html",

                           "Referer=",

                           "Snapshot=t1.inf",

                           "Mode=HTML",

                           LAST);

这个函数的内容很多,不过从URL=http://127.0.0.1:1080/WebTours/可以看出实现访问网站首页是通过这个函数实现的,也就是说在地址栏里输入地址后按回车键的操作其实就是进行了这个函数的模拟请求。

web_link("sign up now",

                           "Text=sign up now",

                           "Snapshot=t2.inf",

                           LAST);

web_link是使用A script describing user actions选项才可以得到的,这个函数就是单击sign up now连接的操作,在这个函数中说明了需要单击的链接名。

补充:web_link()函数详解

web_link()函数用来模拟用户单击一个超链接的操作。VuGen会记录访问页面后服务器返回的内容中有多少个超链接。当使用web_link()函数时,只要写出正确的链接名,VuGen会自动查找并访问页面中该链接名所指向的URL地址。

web_link()函数的基本语法如下所示:

web_link(“在测试结果中显示的名称”,“TEXT=需要单击的超链接名”,LAST);

Ÿ 在测试结果中显示的名称

也被称作步骤名,在测试结果中显示的名称是指在脚本运行完成后,打开Test Result,在link函数后的名称(此处为sign up now),如图3.16所示。

这是通过web_link(“sign up now”,….)来实现的,我们能够在测试结果中方便、快速地定位。

Ÿ 需要单击的超链接名

单击的链接是通过Text=来说明的,等号后的内容就是需要单击的链接。这里需要注意,如果Text后的链接名不存在,那么就会得到以下错误:

Action.c(17): Error -27995: Requested link ("Text=signupnow") not found     [MsgId: MERR-27995]

Action.c(17): web_link("sign up now") highest severity level was "ERROR", 0 body bytes, 0 header bytes                             [MsgId: MMSG-26388]

该错误信息提示单击的signupnow这个链接不存在,整个web_link函数是错误的。

“Snapshot=t2.inf”用来说明该操作后的内容会被抓图保存到文件t2.inf中。最后的LAST表明这个函数的结束。

例如:想要该脚本去点击WebTours首页上的administration链接,我们只需要将web_link函数修改为:

web_link("click administration",

                           "Text=administration",

                           LAST);

回放脚本看看是否正确通过,并进入管理页面。

思考:

如果一个页面中有多个同名的链接,使用web_link()该如何处理?

Ord这个关键字可以帮助你,在VuGen中很多函数都使用这个参数来判断对象的次序。

例如要单击页面上的第二个链接,那么可以这样写:

web_link("click link",

                   "Text=link",

                   Ord=2,

                   LAST);

在这里需要注意,同名链接的先后顺序是根据HTML代码的解释顺序(从左往右,从上往下)来确定的。

使用HTML-base script下的A script describing user actions好处是脚本简洁,基于用户操作进行模拟,浅显易懂,并且自身就包含了对象检查过程,无须校验。其缺点是当页面中存在多个同名链接时难以区分。所以我们建议使用下面一种脚本模式:A script containing  explicit URLs only (e.g. web_url, web_submit_data)。

小练习:

尝试使用该录制方式录制MsPetshop购物网站首页单击一个链接的脚本。

录制后在脚本中可以看到如下的内容:

web_link("BIRDS","Text=Birds",LAST);

这是单击BIRDS链接所带来的结果,在前面说过Text=后的内容是所单链接的正文,那么为什么明明界面上该链接名显示的是“BIRDS”,但这样写脚本回放会提示“无法找到这个链接”,而写成“Birds”就可以成功呢?

如果仔细查看一下MsPetshop网站的源代码,就会发现这个链接确实是Birds,但为什么看到的是BIRDS呢?检查一下该网站的CSS文件就会明白了。

VuGen脚本都是针对HTML源代码操作的,到底web_link如何识别单击对象的呢?或者这类脚本中的“对象识别”是如何做到的?在录制后的脚本中切换到Tree模式,如图3.17所示。

这里可以看到在录制后的内容中有几个标签,除了web_url()请求发送后的页面返回截图,还有两个标签,一个是Client Request,另一个是Server Response,在这两个标签中的内容就是VuGen录制的客户端发给服务器端的HTTP请求格式和服务器返回的HTTP请求内容。选择Server Response标签,可以看到返回内容的格式分解,如图3.18所示。

           

图3.17  Tree模式下的Page View           图3.18  Tree模式下的Server Response

在这里可以看到Form的说明和Links的内容,而web_link()和web_submit_data()能够识别对象的基础就是这里的服务器返回内容分解,也就是说能够单击的链接一定在这个Links内。这就是VuGen的对象识别技术和对象库。

Ø  A script containing explicit URLs only

该选项确定基于URL请求的脚本录制类型。与基于用户行为模拟的不同之处在于,这种录制方式不考虑任何用户操作,只考虑客户端发送的请求,注重系统实际上做了什么。

将脚本类型切换为这种形式,然后录制和前面在Web Tours上点击链接操作相同的例子,停止后会得到以下脚本。

                       web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");

                       web_url("WebTours",

                       "URL=http://127.0.0.1:1080/WebTours/",

                       "TargetFrame=",

                       "Resource=0",

                       "RecContentType=text/html",

                       "Referer=",

                       "Snapshot=t1.inf",

                       "Mode=HTML",

                       LAST);

                       web_url("sign up now",       "URL=http://127.0.0.1:1080/WebTours/login.pl?username=&password=&getInfo=true",

                       "TargetFrame=body",

                       "Resource=0",

                       "RecContentType=text/html",

                       "Referer=http://127.0.0.1:1080/WebTours/home.html",

                       "Snapshot=t2.inf",

                       "Mode=HTML",

                       LAST);

看看有什么不同的地方,web_link()函数被web_url()替代了,前面提过web_url()函数的作用是实现地址请求的过程。

补充:web_url()函数详解

web_url()函数可以模拟用户请求,它也是在脚本中最常使用的函数之一。

web_url()函数的基本语法如下所示:

web_url(“在测试结果中显示的名称”,“URL=需要访问的超链地址”,LAST);

和web_link不同的地方在于这里只需要在URL=后填写需要访问的地址即可,和在IE地址栏中输入的内容相同,使用web_url的好处是没有任何请求的前后依赖关系,只负责发送一个标准的Get HTTP请求。

如果需要访问51Testing论坛,可以直接这样写:

web_url("51testing","URL=http://bbs.51testing.com",LAST);

除了以上这些元素,在录制出来的web_link或者web_url函数中经常还能看到如下所示的大量内容:

EXTRARES

"Url=../bite.jpg", "Referer=http://192.168.0.200", ENDITEM,

"Url=../title.gif", "Referer= http://192.168.0.200", ENDITEM,

……

这一段内容说明在载入这个页面时还有其他图片或者附属资源需要下载。

web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的GET方法,如果需要提交表单,实现HTTP请求中的POST方法,那么需要使用web_submit_form()或web_submit_data()函数。

补充:web_submit_form()函数详解

该函数会自动检测在当前页面上是否存在form,然后将后面的ITEMDATA数据进行传送。例如录制在Web Tours网站上登录操作,可以得到以下代码:

                       web_submit_form("login.pl",

                       "Snapshot=t3.inf",

                       ITEMDATA,

                       "Name=username", "Value=admin", ENDITEM,

                       "Name=password", "Value=123456", ENDITEM,

                       "Name=login.x", "Value=0", ENDITEM,

                       "Name=login.y", "Value=0", ENDITEM,

                       LAST);

隐藏的表单数据系统会自行发送。

补充:web_submit_data()函数详解

和web_submit_form()函数不同,web_submit_data()函数无须前面的页面支持,直接发送给对应页面相关数据即可。录制Web Tours网站登录,代码会变为:

                       web_submit_data("login.pl",

                       "Action=http://127.0.0.1:1080/WebTours/login.pl",

                       "Method=POST",

                       "TargetFrame=body",

                       "RecContentType=text/html",

                       "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",

                       "Snapshot=t5.inf",

                       "Mode=HTML",

                       ITEMDATA,

                       "Name=userSession", "Value=100084.208748481fVtiAiVptiHfDAiiiptiiQcf", ENDITEM,

                       "Name=username", "Value=admin", ENDITEM,

                       "Name=password", "Value=123456", ENDITEM,

                       "Name=JSFormSubmit", "Value=off", ENDITEM,

                       "Name=login.x", "Value=0", ENDITEM,

                       "Name=login.y", "Value=0", ENDITEM,

                       LAST);

其中Action说明提交表单的处理页面,Method表明提交数据的方式。

当使用web_submit_data()函数时,隐藏表单的数据也会被记录下来作为ITEMDATA数据提交给服务器。

这里介绍了在HTTP页面中最常用的4个页面函数 web_link()、web_url()、web_submit_form()、web_submit_data(),通过这些函数可以实现大多数页面访问的请求和数据提交的过程。除了这4个函数,还有一个函数可能会经常看到:web_custom_request()。当请求比较特别时,VuGen无法简单使用以上4个函数进行表述,那么录制后便会出现web_custom_request()函数,这个函数的作用是自定义HTTP请求规则。该函数更适合在使用自定义的HTTP请求规则中处理二进制内容。具体格式请参考帮助文档。

2.高级选项下的Non HTML-generated elements(e.g. JavaScript,VBScript,ActiveX, Applets)选项这个选项是对非标准的HTML元素的处理方式,VuGen有以下3种处理方式:

Ÿ Record within the current script step

对于JavaScript等内容直接作为web_url下的附属信息记录。

Ÿ Record in separate steps and use concurrent groups

对于相关的内容新建一个web_url来处理。

Ÿ Do not record

不录制额外的内容。

在默认情况下选择直接录制在web_url下,如果某些内容录制会导致脚本回放错误,那么可以不录制该内容。

URL-BASE Script:是基于URL请求的脚本录制方式,会录制得到所有的HTTP请求。选择该选项会录制所有的HTTP请求,导致脚本包含大量的 web_url()函数,参考前面HttpWatch获得的HTTP交互过程,VuGen只是将所有的请求抓取出来,并且对每个请求均生成一个 web_url()函数来进行模拟。

思考:

什么时候应该用HTML-BASE Script?什么时候应选择URL-BASE Script?

一般来说如果是标准使用IE访问的B/S架构,应该使用HTML-BASE下的A script containing explicit URLs only方式来录制脚本,这种脚本基于URL请求完成,不会带有任何前后依赖的内容。而如果是一个非IE标准的C/S架构,建议使用URL-BASE Script来录制脚本,这样可以确保不会遗漏任何HTTP请求。

例如:如果使用HTTP进行数据传送,而数据内容是存放在.dat文件中的,那么使用HTML-BASE Script就无法录制到对该.dat文件的操作,而使用URL-BASE Script就可以录制出来。

Network

Port Mapping提供了对于端口映射的处理规则,在默认情况下不需要进行任何设置,VuGen会自动根据协议确定端口名,对该端口进行监控和录制,但是如果使用了非标准的端口进行数据传输偶尔会出现VuGen能发现数据包的收发操作,但是无法正确录制出脚本的情况,这时就需要使用Port Mapping来指挥VuGen识别端口名和协议类型。

下面我们来录制一个电子邮件收发的脚本,选择协议为SMTP+POP3,如图3.19所示。

图3.19  在多协议情况下添加POP3和SMTP两个协议

我们使用MDaemon搭建了一个本地电子邮件服务器,使用邮件的客户端为Becky!。在选择应用窗口中填写Becky!客户端的信息,如图3.20所示。

单击OK按钮开始录制,可以看到在客户端收发电子邮件的时候,Recording中的events一直在变化,如图3.21所示。

      

图3.20  选择Win32应用添加录制对象为B2.exe           图3.21  Rocording Bar

这说明VuGen可以识别到该协议并且将协议交互截取下来,但是打开脚本,就可能会出现脚本完全没有内容的情况,那么这个时候需要手动帮助VuGen来进行识别协议内容的工作。

打开录制选项,找到Port Mapping,如图3.22所示。

图3.22  Port Mapping主界面

这里需要为POP3和SMTP添加一个端口规则,让VuGen强制去录制这个端口的协议内容(搞错了的话会出导致无录制内容)。单击New Entry按钮添加两个端口,设置POP3使用110端口,SMTP使用25端口,如图3.23所示。

这里的Target Server(目标服务器)可以进行明确设置,也可以默认设置为(Any Server)即任意服务器,但是端口必须要写明,并且该端口对应的Service ID协议类型也必须选择正确,录制方式(Record Type)选择Direct即可。

同理再添加一个SMTP的协议端口,检查一下端口规则是否正确,如图3.24所示。

设置完成后,现在再来录制一下协议,即可录制出来了(VuGen的版本越高出现录制错误的概率越低,在9.1版本后很少出现这种有Events但是没有脚本的情况)。

Http Properties

Advanced:这里可以设置在录制HTTP过程中的一些高级选项,如图3.25所示。

图3.23  新建Port Mapping规则

图3.24  新建Port Mapping下的SMTP和POP3规则后

图3.25  录制选项下的高级设置

Reset context for each action:录制中每个action之间是否需要重置context。context中存放请求发送返回后的数据信息,比如服务器返回的html、 cookie、session等。选择了这个选项,Action之间会清空相关内容,那么基于行为模拟的函数web_link()会由于没有前文而无法运行,系统自动录制成为基于数据请求的函数web_url()。

Save snapshot resources locally:在本地保存资源截图。

Generate web_reg_find functions for page titles:是否需要为每一个页面自动生成web_reg_find检查点函数(检查点函数参考第3.8节)来检查标题的变更。选中该选项后,会自动生成对标题的检查规则,回放脚本时会验证每个标题是否和录制时相同。其中Generate web_reg_find fuctions for sub-frames为子框架生成检查点函数。由于大多数情况页面的标题都是动态的,检查标题是否不变没有太大的意义,所以这个选项一般不做选择。

Add comment to script for HTTP errors while recording:录制过程中如果出错则添加相关的注释内容。

Support charset:很多时候我们访问的网站都是中文的,使用VuGen录制时经常会遇到中文变成乱码的事情,这是由于中文网站一般都是使用UTF-8的编码方式来显示中文的,这时就需要让VuGen也支持该编码格式。打开这个选项,确保UTF-8可用,再录制一下脚本,中文乱码的问题就会解决了。如果网站使用的是非UTF-8的编码规则,那么就不要选择该选项,否则也会导致乱码。可以通过使用HttpWatch扫描网站来确认页面是否采用了UTF-8的编码方式。

Recording Engine:这是一个兼容性的选项,可以使用以前的录制引擎来录制脚本,注意选择该选项后需要重新启动VuGen,新建脚本才能切换到老的引擎上。

Recording schemes:这里可以对录制的内容进行过滤。

Headers:可以录制服务器返回HTTP请求包中的数据包头,如图3.26所示。

在默认情况下是不录制HTTP Header的,如果有些数据存放在Header中,那么在这里就可以设置需要录制那些内容,如图3.27所示。

        

图3.26  设置是否录制HTTP headers           图3.27  设置录制的HTTP headers种类

比如这里需要录制服务器返回的Encoding编码信息,选中Accept-Encoding并单击OK按钮确认(HTTP header的含义参考前面的HTTP分析)即可。录制的结果可以发现脚本中附加了web_add_header()函数。

Content Types:对于录制的正文内容进行过滤,如图3.28所示。

图3.28  设置是否录制HTTP content

在默认情况下所有的正文内容都会被录制下来,如果不需要录制图片等内容,可以在下面的规则中过滤掉多余的内容,如图3.29所示。

Non-Resources:设置需要录制的请求格式,如图3.30所示。

         

图3.29  设置录制的HTTP content类别     图3.30  设置那些文件格式作为Non-Resurce处理

这里需要分析一下VuGen根据什么原理录制出来 web_url()这种请求,其实它是根据HTTP请求中的返回格式来确定的。在默认情况下,VuGen认为text/html这种返回格式的内容是非资源的正文,需要录制出来,如果你希望将其他格式的请求也单独作为web_url()来进行录制,那么在这里应添加对应的Content Type。例如添加image/gif,那么再次录制脚本时就会发现,所有的gif图片请求都被作为一个单独的web_url()函数进行处理。各种 HTTP请求的文件类型可以先通过HttpWatch进行扫描确定,如图3.31所示。

Correlation:是否打开脚本录制时的自动关联选项,如图3.32所示。

   

图3.31  通过HttpWatch获得HTTP返回请求的文件类型  图3.32  边录制边进行关联设置

如果不是很清楚这个功能请先取消选择,否则可能会导致在录制过程中VuGen错误自动关联,导致脚本回放直接失败。我们将会在后面介绍关联时再来研究它。

3.2.4  开始录制

当设置好录制选项后,单击OK按钮启动录制。

首先看到的是Recording Bar,如图3.33所示。稍后会看到IE或者指定的应用程序启动,当进行操作时Events也会随之变化,说明VuGen录制得到了一些协议交互的内容。

图3.33  Recording Bar

在录制前需要根据需求确定需要录制的用户行为,而录制后需要通过后面的设置来将脚本设置为完全模拟用户行为的Vuser Script。

3.2.5  插入命令

在录制的过程中可以通过Recording Bar添加一些命令。例如可以切分脚本,将录制的内容存放在不同的脚本块中,也可以添加事务的开始点和结束点,还可以添加集合点和注释。

3.2.6  结束录制

当录制结束后,单击Stop按钮,或者使用Ctrl+F5组合键停止录制,所有客户端和服务器交互协议会被放在Generation Log内,VuGen随后会对协议交互进行分析,最终生成脚本。

录制完成后,可以在Recording Log中查看相关录制信息,如图3.34所示。而录制中的events条数就是Recording Log中的信息行数。

图3.34  Recording Log录制日志内容

VuGen能支持多种协议,其关键就在于日志中的开头。

[Network Analyzer (25bc:2bb0)] -------------------------------------------

[Network Analyzer (25bc:2bb0)] Load Network Traffic Analyzers:

[Network Analyzer (25bc:2bb0)]     Analyzer Module: WPLUS (value=)

[Network Analyzer (25bc:2bb0)]     Analyzer Module: WebBase (value=GetHttp ProtocolAnalyzer:api_http_filter.dll)

[Network Analyzer (25bc:2bb0)]     + Network Analyzer: api_http_filter.dll @ GetHttpProtocolAnalyzer Loaded!

[Network Analyzer (25bc:2bb0)]     + Interception Auditors: WinInetWplus InterceptionAudit:api_http_filter.dll

[Network Analyzer (25bc:2bb0)]     Analyzer Module: QTWeb (value=)

[Network Analyzer (25bc:2bb0)]     Analyzer Module: local_server (value=)

[Network Analyzer (25bc:2bb0)] ----------------------------------------

在这段日志中可以看到,对HTTP的解析是通过api_http_filter.dll库文件实现的。VuGen通过类似于插件的形式来完成对多种协议的支持,只要有这类的dll文件,就可以完成对该类协议的录制。

另一方面录制得到的所有客户端请求和服务器返回信息将会保存在Generation Log中,如图3.35所示。

录制得到的VuGen脚本就是通过Generation Log生成的。如果录制结束时出错或者错误修改后,想回到最初的状态,那么可以使用Tools菜单下的Regenerator Script功能来重新生成脚本。

图3.35  Generation Log请求日志内容

3.2.7  回放验证

脚本生成后可以单击菜单栏上的Run按钮也可直接按F5键回放脚本,如图3.36所示。

运行前也可以通过Shift+F5组合键检查脚本的语法规则,对脚本进行编译。

回放中可以在Replay Log日志栏中看到脚本执行的日志信息,当脚本回放完成后,如何验证回放结果呢?

这里可以打开View菜单下的Test Results,如图3.37所示。

   

图3.36  工具条上的执行按钮                图3.37  Test Results测试结果报告

在这个测试结果报告中,可以得到整个脚本回放的记录,还有相关截图,Passed状态说明脚本运行正常,得到了服务器的反馈。

Passed并不能说明脚本完成了相关操作,只能说明服务器端正确接收到了客户端的请求并且返回了相应的数据,但是并不代表操作在逻辑上是正确的。

3.2.8  录制回放常见问题

录制错误

1.录制本机WebTours或录制本地网站无法打开

当使用Vista或者Windows 2008操作系统时,会出现该问题。这是由于在本地Windows\System32\drivers\etc\host文件中多了下面这行内容:

::1             localhost

将其删除后即可恢复正常。

2.录制网页时,浏览器刚打开就自动关闭,或者浏览器无响应

这是由于在IE中打开了第三方插件支持导致的,一般安装了QTP会出现这个问题。只需要打开IE的属性菜单,找到高级选项,将其中的第三方插件支持关闭即可。

3.开始录制时浏览器出现错误

这个问题一般是由于系统安装的问题或IE版本不兼容导致的。VuGen 9.1最高兼容IE 7.0。

4.录制网页操作后没有任何脚本

VuGen录制只支持IE,对于第三方的浏览器不能很好地兼容。

5.录制本机页面可以打开但是没有录制到任何Events

在录制时请求的地址为127.0.0.1或Localhost时,偶尔会出现该问题,换成系统真实IP地址即可。

6.录制的时候总是提示无法访问服务器

可以考虑检查一下IE的代理服务器设置。在Load Runner 8.x中经常会出现VuGen中的代理设置自动覆盖IE 7.0的现象。

回放错误

在某些情况下,回放脚本会遇到失败的情况,一般导致脚本回放失败的原因无非以下几种:

1.脚本中的数据存在动态部分

例如脚本是访问一个图片,但是再次回放的时候该图片已经在服务器上被删除了,那么脚本回放时自然就会出现错误,提示该对象无法找到。解决方法是修改代码,删除无用的对象,或者通过关联处理动态数据。

2.脚本没有录制到所有的协议请求

当系统使用多种协议时,如果我们选择的录制协议没有全部包含,就会出现漏录请求的情况,而在回放时由于缺乏部分请求的模拟,就会导致后续的请求内容被服务器拒绝,自然就会出现回放失败的情况。解决方法是通过分析确认系统协议,确保所有请求被录制。

3.系统存在问题

从某些角度来说,VuGen是一种基于协议的木马,可能会被部分杀毒软件或防火墙干扰和影响,导致无法正常访问服务器。解决方法是在录制时关闭不必要的防火墙和杀毒软件。

4.脚本中添加了不合适的关联或检查点函数

在录制选项中打开了自动录制关联规则后,录制出来的脚本会自动添加符合规则的关联函数,而如果在回放时关联函数无法捕获到符合规则的目标则会提示错误。解决方法建议在深入了解关联后再启用该功能。对于检查点函数,关闭Fail功能即可。

5.服务器连接错误

服务器无法连接,导致脚本回放失败。

一般来说回放错误可以通过日志或者Test Results中的截图定位,当有一定的代码调试能力后,就能够轻松解决。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
action
web
LoadRunner中HTML模式与URL模式的区别
用LR做性能测试后的一点总结(1) - [LoadRunner] - 51Testing软件测试论坛 软件测试 | 软件缺陷跟踪 | 软件配置工具 | 测试用例设计 | Web测试 | 自动化测试工具
LoadRunner教程:构建Vuser脚本
LR之关联
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服