关于LR中的EXTRARES

LoadRunner脚本之EXTRARES参数

EXTRARES:分隔符,表示标记下一个属性是资源属性的列表(list of resource attributes)。

【EXTRARES后的资源是由script、active、java applet、flash、CSS产生的请求产生的】
and 下面来看看,在EXTRARES后面的资源属性是否可以注释掉...!Let's get the copy and learning started!
在坛子里看到有人在讨论Web请求中的EXTRARES后面的东西能不能不要,我看到一些人理所当然地认为可有可无,为什么呢?谁它的名字叫EXTRARES呢,事实上,性能测试是一门很严谨的技术,不可大意,在没有100%把握之前我们不应该下定论。 关于这一点,结论是EXTRARES部分不能删,删除了LR就不会去下载相关资源了,也就意味着一个请求的Response会变小,毫无疑问,响应时间就会变得快一些,吞吐量变得少一些,数据变得非常的不真实。 那么我是如何来设计这个实验模型得出这样的结论的呢?我们就以访问某个web页面来做这个实验,怎么做呢? 1) 录制访问本论坛首页的GET请求(web_url函数生成),代码如下:
web_url("bbs.51testing.com", 
"URL=http://bbs.51testing.com/", //51论坛摘抄
"TargetFrame=", 
"Resource=0", 
"RecContentType=text/html", 
"Referer=", 
"Snapshot=t2.inf", 
"Mode=HTML", 
EXTRARES, 
"Url=/images/default/menu_bg.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/frame_on.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/arrow_down.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/portalbox_bg.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/menu_itemline.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/forumlink.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/online.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/arrow_right.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/header_bg.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/default/cat_bg.gif", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=http://zs1.cnzz.com/stat.htm?id=1743488&r=&lg=zh-cn&ntime=0.35238800 1269021786&repeatip=6&rtime=1&cnzz_eid=80487640-1268962788-&showp=1280x800&st=357&sin=&res=0", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/cn.swf", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/fenl.swf", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/zazhi.swf", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
"Url=/images/zhuanti.swf", "Referer=http://bbs.51testing.com/default.php", ENDITEM, 
LAST); 2) 在此函数后使用web_get_int_property函数来取得响应的大小:
lr_output_message("%d", web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE)); 3) 运行,得到结果为:1451146 (居然有1.4M,这论坛首页也太大了)
4) 将EXTRARES后面的属性全拿掉(注释即可),再次运行,得到结果为:700095 (700K不到,差不多节省了一半的大小) 现在结论基本有了:不能删,那么为了再严谨一点,再并发10个用户运行一次看看其响应时间和吞吐量是否一致 5) 不备注EXTRARES,打开Controller并发10个用户运行1次,得出:
总吞吐量:14511462总请求数:430响应时间:54秒 6) 备注掉EXTRARES,打开Controller并发10个用户运行1次,得出:
总吞吐量:7,000,941总请求数:280响应时间:26秒 从总吞吐量,我们很容易看出这不能少,从总请求数,我们也看出来,刚好少150个请求,为什么是150呢,因为我们10个并发用户做一次,每一个Extrares后面跟了15个资源文件,10次当然是150个GET请求少掉咯。当然,这响应时间的差别也是同样的,非常夸张,令人吃惊。 大家也可以自己去做这样的实验来验证这个结论,东西不能乱删,包括默认录制出来的一些Cookie信息,也不能随便删除,除非你知道它们都在干嘛,你为什么需要/不需要它们。
这次项目测试关注的是login事务,即想要测试出客户端发出登录请求到服务器,服务器端再反馈回来给客户端的时间。所以,不用关注到登录到系统后,整个页面的加载情况,可以适当的注释掉不相干的脚本。
网友观点:
A:能不能删除,关键得看你做这个测试的目的是什么,如果是看整个页面的响应时间,那肯定是不能删除的...(跟我差不多的思想)
B:回楼上的,即使不对这个页面进行相关指标的测试,哪怕这个页面只是一个附加的页面,比如只是为了用来模拟真实用户场景,或者只是对页面里的某一部分内容进行一下关联,但是有与没有是会对吞吐量和请求数造成影响的,吞吐量则会间接地对响应时间造成影响哦(比如带宽不足的时候),另外从严谨性的角度来考虑,请求数多了,当然会对服务器造成多一些的压力,那么从这方面谈影响那就多了去了。(考虑得真TM严谨)
很多人对Web请求中的EXTRARES后面的东西能不能不要表示不确定,关于这一点,结论是EXTRARES部分不能删,删除了软件测试工具LoadRunner就不会去下载相关资源了,
也就意味着一个请求的Response会变小,毫无疑问,响应时间就会变得快一些,吞吐量变得少一些,数据变得非常的不真实。
那么我是如何来设计这个实验模型得出这样的结论的呢?我们就以访问http://bbs.XXXX.com这个页面来做这个实验,怎么做呢? 录制访问本论坛首页的GET请求(web_url函数生成),代码如下: 
web_url("bbs.XXXX.com", 
"URL=http://bbs.XXXX.com/", 
"TargetFrame=", "Resource=0", 
"RecContentType=text/html", 
"Referer=", "Snapshot=t2.inf", "Mode=HTML",  
EXTRARES, 
"Url=/images/default/menu_bg.gif", 
"Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/default/frame_on.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM,
"Url=/images/default/arrow_down.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, "Url=/images/default/portalbox_bg.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM,
"Url=/images/default/menu_itemline.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/default/forumlink.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/default/online.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/default/arrow_right.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/default/header_bg.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM,
"Url=/images/default/cat_bg.gif", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=http://zs1.cnzz.com/stat.htm?id=1743488&r=&lg=zh-cn&ntime=0.35238800%201269021786&repeatip=6&rtime=1&cnzz_eid=80487640-1268962788-&showp=1280x800&st=357&sin=&res=0", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/cn.swf", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, "Url=/images/fenl.swf", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, 
"Url=/images/zazhi.swf", "Referer=http://bbs.XXXX.com/default.php", ENDITEM, "Url=/images/zhuanti.swf", "Referer=http://bbs.XXXX.com/default.php", ENDITEM,   
LAST); 在此函数后使用web_get_int_property函数来取得响应的大小: lr_output_message("%d", web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE)); 运行,得到结果为:1451146 (居然有1.4M,这论坛首页也太大了) 将EXTRARES后面的属性全拿掉(备注即可),再次运行,得到结果为:700095 (700K不到,差不多节省了一半的大小)现在结论基本有了:不能删,那么为了再严谨一点,再并发10个用户运行一次看看其响应时间和吞吐量是否一致. 不备注EXTRARES,打开Controller并发10个用户运行1次,得出:总吞吐量:14511462  总请求数:430   响应时间:54秒 备注掉EXTRARES,打开Controller并发10个用户运行1次,得出: 总吞吐量:7,000,941  总请求数:280   响应时间:26秒 
从总吞吐量,我们很容易看出这不能少,从总请求数,我们也看出来,刚好少150个请求,为什么是150呢,因为我们10个并发用户做一次,每一个Extrares后面跟了15个资源文件,10次当然是150个GET请求少掉咯。
当然,这响应时间的差别也是同样的,非常夸张,令人吃惊。 
大家也可以自己去做这样的实验来验证这个结论,东西不能乱删,包括默认录制出来的一些Cookie信息,也不能随便删除,除非你知道它们都在干嘛,你为什么需要/不需要它们。

http://www.51testing.com/html/29/n-1276429-5.html

Loadrunner常用函数详解(一)

web_url

语法:
Int Web_url(const
char *name, const char * url, , [EXTRARES,,LAST)

返回值
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
Name:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

url:页面url地址。

List
of Attributes

EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

List
of Resource Attributes

LAST:属性列表结束的标记符。

说明
Web_url根据函数中的URL属性加载对应的URL,不需要上下文。

只有VuGen处于URL-based或者HTML-based(此时A
script containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。

可以使用web_url
模拟从FTP服务器上下载文件。web_url
函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。

在录制选项中,Toos—Recording
Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the
current script step”时,List of Resource
Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。

所有的Web
Vusers ,HTTP模式下的WAP Vusers或者回放模式下的Wireless Session
Protocol(WSP),都支持web_url函数。

web_image
语法:
Int web_image (const
char *StepName, , [EXTRARES, ,] LAST );

返回值
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
StepName:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

List
of
Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALT、Frame、TargetFrame、Ordinal则是有的话会被录制到。

1、ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。

2、SRC:描述图象的元素,可以是图象的文件名.
如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。

3、Frame:录制操作时所在的Frame的名称。

4、TargetFrame:见List
of Attributes的同名参数。

5、Ordinal:参见Web_link的同名参数。

List
of Attributes(客户端映射的图片):

1、AreaAlt:鼠标单击区域的ALT属性。

2、AreaOrdinal:鼠标单击区域的顺序号。

3、MapName:图象的映射名。

List
of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。

1、Xcoord:点击图象时的X坐标。

2、Ycoord:点击图象时的Y坐标。

EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

List
of Resource Attributes:参见List of Resource Attributes一节。

LAST:属性列表结束的标记符。

说明
web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。

在Toos—Recording
Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。

web_image支持客户端(client-side)和服务器端server-side的图片映射。

在录制选项中,Toos—Recording
Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the
current script step”时,List of Resource
Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。

web_image支持Web虚拟用户,不支持WAP虚拟用户。

例子
下面的例子模拟用户单击Home图标以回到主页(黑体部分):

web_url("my_home",
"URL=http://my_home/", LAST);

web_link("Employees",
"Text=Employees", LAST);

web_image("Home.gif",
"SRC=../gifs/Buttons/Home.gif", LAST);

web_link("Library",
"Text=Library", LAST);

web_image("Home.gif",
"SRC=../../gifs/buttons/Home.gif", LAST);

下面的例子模拟用户在客户端映射的图片上单击:

web_image("dpt_house.gif",

"Src=../gifs/dpt_house.gif",

"MapName=dpt_house",

"AreaOrdinal=4",

LAST);

下面的例子模拟用户在服务端映射的图片上单击:

web_image("The
Web Developer's Virtual Library",

"Alt=The Web Developer's Virtual Library",

"Ordinal=1",

"XCoord=91",

"YCoord=17",

LAST);

下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif、/gifs/dpt_house.gif、gifs/dpt_house.gif、/dpt_house.gif等都会匹配到。

web_image("dpt_house.gif",
"Src/sfx=dpt_house.gif", LAST);

web_link
语法:
Int web_link (const
char *StepName, , [EXTRARES, ,] LAST );

返回值
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
StepName:VuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

List
of Attributes:支持下列的属性:

1.Text:超链接中的文字,必须精确匹配。

2.Frame:录制操作时所在的Frame的名称。

3.TargetFrame、ResourceByteLimit:见List of Attributes一节。

4.Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:“SRC=abc.gif”,“Ordinal=3”标记的是SRC的值是“abc.gif”的第3张图片。

EXTRARES:表明下面的参数将会是list
of resource attributes了。

LAST:结尾标示符。

说明
模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。

web_link
仅仅在基于HTML的录制方式中才会被VuGen捕捉到。

非HTML生成的资源的例子有.gif
和.jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording
--HTML-based script-- Record within the current script
step选项被选中时,它们才会被插入到代码中。

可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。

此函数值支持Web虚拟用户,不支持WAP虚拟用户。

web_submmit_form
语法:
Int web_submit_form
(const char *StepName, , , ITEMDATA, , [ EXTRARES, ,] LAST );

返回值
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
StepName:Form的名字。VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

List
of Attributes:支持以下属性:

1.Action:Form中的ACTION属性,指定了完成Form中的操作用到的URL。也可以使用“Action/sfx”
表示使用此后缀的所有Action。

2.Frame:录制操作时所在的Frame的名称。

3.TargetFrame、ResourceByteLimit:见List of Attributes的同名参数。

4.Ordinal:参见Web_link的同名参数。

VuGen通过记录数据域唯一的标识每个Form。如果这样不足以识别Form,VuGen会记录Action
属性。如果还不足以识别,则会记录Ordinal 属性,这种情况下不会记录Action属性。

List
of Hidden Fields:补充属性(Serves)。通过此属性可以使用一串隐含域来标识Form。使用下面的格式:

STARTHIDDENS,

"name=n1",
"value=v1", ENDITEM,

"name=n2",
"value=v2", ENDITEM,

ENDHIDDENS,

List
of Data Fields

Data项用来标识form。Form是通过属性和数据来共同识别的。

使用下面的格式来表示数据域列表

"name=n1",
"value=v1", ENDITEM,

"name=n2",
"value=v2", ENDITEM,

ITEMDATA:Form中数据和属性的分隔符。

EXTRARES:一个分隔符,标记下一个参数是资源属性的列表了。

List
of Resource Attributes:参见List of Resource Attributes一节。

LAST:属性列表结束的标记符。

说明
web_submit_form
函数用来提交表单。此函数可能必须在前一个操作的上下文中执行。在Toos—Recording
Option,只有录制级别设为基于HMTL的录制方式,web_image才会被录制到。

在录制选项中,Toos—Recording
Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the
current script step”时,List of Resource
Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

通常情况下,如果录制了web_submit_form
函数,VuGen会把“name”和“value”一起录制到ITEMDATA属性中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把
“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。

例如:可以把
"Name=grpType", "Value=radRoundtrip", ENDITEM

改为:"Name=grpType",
EncryptedValue=409e41ebf102f3036b0549c799be3609", ENDITEM

如果你完整的安装了LoadRunner,那么打开开始菜单--Mercury
LoadRunner—Tools--Password
Encoder,这个小工具是用来加密字符串的。把需要加密的值粘贴到Password一栏,再点Generate按钮。加密后的字符串会出现在 Encoded
string框中。接着点Copy按钮,然后把它粘贴到脚本中,覆盖原来显示的“Value”。

加密的另一种方法时使用lr_decrypt函数。方法:选择整个字符串,例如“Value=radRoundtrip”(注意不要选择引号),右击鼠标,选择Encrypt
string选现,脚本会变为:

"Name=grpType",
lr_decrypt("40d176c46f3cf2f5fbfaa806bd1bcee65f0371858163"), ENDITEM,

web_submit_form支持Web虚拟用户,不支持WAP虚拟用户。

例子:
下面的例子中,web_submit_form
函数的名字是“employee.exe”。此函数提交了一个请求,此请求包含雇员信息John
Green。此函数没有使用属性(Attributes)是因为通过数据项已经能唯一的标识这个Form了。

web_submit_form("employee.exe",

ITEMDATA,

"name=persons", "value=John Green - John", ENDITEM,

"name=go_page", "value=Go to Page", ENDITEM,

LAST);

web_submmit_data
语法:
Int web_submit_data (
const char *StepName, , ITEMDATA, , [ EXTRARES, ,] LAST );

返回值
返回LR_PASS(0)代表成功,LR_FAIL(1)代表失败。

参数:
StepName:步骤名称,VuGen中树形视图显示的名称。

List
of Attributes:支持以下属性:

1.Action:Form中的ACTION属性,指定了完成Form中的操作用到的URL。

2.Method:表单提交方法:POST或GET(默认是POST)。

3.EncType:编码方式。

4.EncodeAtSign:是否使用ASCII值对符号“@”编码。Yes或者 No。

5.TargetFrame:包含当前链接或资源的Frame。参见List of Attributes的同名参数。

6.Referer、Mode:参见List of Attributes的同名参数。

ITEMDATA:数据域和属性的分隔符。

List
of Data:

数据域列表定义了表单提交的内容。由于此请求是上下文无关的,因此数据域包含了所有的隐含域。使用Form的编码规则组织数据域。

数据域列表可以使用下面任意一种格式:

"name=n1", "value=v1", ENDITEM,

"name=n2",
"EncryptedValue=qwerty", ENDITEM,

EXTRARES:分隔符,标记下一个参数将是资源属性的列表。

List
of Resource Attributes:参见List of Resource Attributes。

LAST:结束标记符。

说明
web_submit_data函数处理无状态或者上下文无关的表单提交。它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的。发送这些请求时不需要表单上下文。

当VuGen设为基于URL的录制模式,或者基于HTML的录制方式但是Recording
Options—HTML Advanced 下的A script containing explicit URLs only
选项被选中时,web_submmit_data函数才会录制到。

不论你采用URL查询的方式(GET),还是采用请求体发送(POST)的方式,此函数都指示出Form中的数据是如何发送到服务器的。

如果VuGen处于HTTP录制模式下,此时记录Web进程时,会产生此函数。在提交Form时,如果无法生成web_submit_form函数,VuGen也会生成web_submit_data函数。

在录制选项中,Toos—Recording
Option下—Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源。只有选择了“Record within the
current script step”时,List of Resource
Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

EncType属性给出一个内容类型,指定其做为“Content-Type”请求头的值。它指示了根据参数生成HTTP请求时使用的编码类型(不是URL-encoding就是multi-part)可以是下面的格式:

1.“EncType=application/x-www-form-urlencoded”

2.“EncType=multipart/form-data” (任何的“; boundary=”都会被默认忽略掉)

3.“EncType=” (空串,表明没有产生内容类型(“Content-Type”)请求头)

任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当省略了
“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有
web_add_[auto_]header函数,且“Method=POST”,“application/x-www-form-
urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。

ContentType:文件类型标识符,如果“EncType”是“multipart/form-data”用来上传文件时,需要用到
“ContentType”。当在ITEMDATA中的Data子句中指定了“File=Yes”,且文件也在此子句中,ContentType才适用,此时它会作为同一个子句的值来传递。

正常情况下,“Content-Type”根据所上传文件的扩展名自动生成。例如:

-----------------------------7d025e2b16b064e\r\n
Content-Disposition: form-data; name="uploaded_file";
filename="D:\\temp\\a.txt"\r\n Content-Type: text/plain\r\n \r\n

无论如何,对于非浏览器的程序来说是特殊的,根据文件类型生成的“ContentType”不一定是正确的。这时,通过手工指定来覆盖默认的“ContentType”。如果指定了空值,那么“Content-Type”头将不包含在文件中。

如果没有显示的指定“ContentType”的值,当上传的文件为空时,不管文件扩展名是什么,都默认使用“application/x-unknown-content-type”做为”ContentType”的值。

VuGen不会检查指定的ContentType是否有效。

通常情况下,如果录制了web_submit_data
函数,VuGen会把“name”和“value”一起录制到ITEMDATA一节中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把
“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。请参考web_submit_form中相关的内容。

所有的Web虚拟用户,运行在HTTP模式下的WAP用户,运行在WSP回放模式下的WAP用户都可以使用本函数。

例子
下面的例子中,web_submit_data函数使用POST方法提交了一个表单。

web_submit_data("default.aspx",

"Action=http://lazarus/flightnet/default.aspx",

"Method=POST",

"TargetFrame=",

"RecContentType=text/html",

"Referer=http://lazarus/flightnet/",

"Snapshot=t7.inf",

"Mode=HTML",

ITEMDATA,

"Name=grpType", "Value=radRoundtrip", ENDITEM,

"Name=lstDepartingCity", "Value=DEN", ENDITEM,

"Name=lstDestinationCity", "Value=LAX", ENDITEM,

"Name=txtDepartureDate", "Value=8/19/2003", ENDITEM,

"Name=txtReturnDate", "Value=8/19/2003", ENDITEM,

"Name=txtQuantity", "Value=1", ENDITEM,

"Name=radClass", "Value=1", ENDITEM,

"Name=radSeat", "Value=1", ENDITEM,

"Name=btnAvailableFlights", "Value=Next >", ENDITEM,

LAST);

下面的例子,
web_submit_data函数使用POST方法提交了2个文件。

web_submit_data("Attachments",

"Action=http://barton.cottage@.Devonshire.uk/Attachments?YY=45434",

"Method=POST",

"EncType=multipart/form-data",

"TargetFrame=",

"RecContentType=text/html",

"Referer=http:///barton.cottage@.Devonshire.uk/Compose?YY=20435",

"Snapshot=t5.inf",

"Mode=HTML",

ITEMDATA, "Name=userFile0",

"Value=E:\\sense_sensibility\\Elinor.txt",

"File=yes",

"ContentType=text/html", // 覆盖了文本文件默认的“text/plain” 值。

ENDITEM,

"Name=userFile1",

"Value=E:\\sense_sensibility\\Marianne.jpg",

"File=yes",

ENDITEM,

LAST);

Loadrunner常用函数详解(二)

web_custom_request

语法:
Int
web_custom_request (const char *RequestName, ,

[EXTRARES, ,] LAST );

返回值
返回LR_PASS(0)代表成功,LR_FAIL(1)代表失败。

参数:
RequestName:步骤的名称,VuGen中树形视图中显示的名称。

List
of Attribute:支持的属性有以下几种:

1.URL:页面地址。

2.Method :页面的提交方式,POST或GET。

3.TargetFrame:包含当前链接或资源的frame的名称。参见List of Attributes的同名参数。

4.EncType:编码类型。

5.RecContentType:响应头的内容类型。参见List of Attributes的同名参数。

6.Referer:参见List of Attributes的同名参数。

7.Body:请求体。参见List of Attributes的同名参数。

8.RAW BODY:参见List of Attributes的同名参数。

9.BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw
Body属性包括BodyBinary,BodyUnicode, RAW_BODY_START或Binary=1。

10.Resource、ResourceByteLimit、Snapshot、Mode:参见List of Attributes的同名参数。

11.ExtraResBaseDir:参见List of Attributes的同名参数。

12.UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。

例如:头信息“User-Agent:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”识别的是Window
NT下的IE浏览器6.0。其他的User-Agent的值用来描述其他的浏览器,或者非浏览器程序。通常,一个应用程序中所有的请求都使用相同的用户代理,录制者作为一个运行时参数来指定(Run-Time
Setting—Browser Emulation—User
Agent)。不管怎么说,即使是在一个简单的浏览器进程中,仍有可能会用到直接与服务器交互的非浏览器组件(例如ActiveX控件),通常他们有着不同于浏览器的用户代理属性。指定“UserAgent”表示这是一个非浏览器的请求。指定的字符串被HTTP头“User-Agent:”
使用,在某些情况下,它同时会影响回放脚本时的行为。例如,不使用浏览器缓存,假设指定的URL属于资源等等。

LoadRunner本身不检查指定的字符串与浏览器本身的值是否相同。

13.Binary:“Binary=1”表示页面请求体中的每一个以\\x##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。

如果“Binary=0”(默认值),所有的字符序列只是按照字面的值传递。

需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替\\x20)。如果需要零字节,那么只能使用\\x00且设置
“Binary=1”,\x00在逻辑上会被截断。

14.ContentEncoding

指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:”
HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。

EXTRARES:表明下面的参数将会是List
Of Resource Attributes了。

LAST
:结尾的标示符。

说明
允许使用任何方法和请求体创建自定义的HTTP请求。默认情况下,当VuGen无法使用其他函数解释用户请求时,会生成此函数。

使用Add对话框(在脚本环境下,右击鼠标,会出现快捷菜单),可以手工插入此函数。要指定特殊的HTTP头信息,需要增加web_add_header或者web_add_auto_header函数。

RecContentType:参见List
of Attributes的同名参数。

EncType:编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如
“text/html”。Web_custom_request函数不处理未编码的请求体。请求体参数将会使用已经指定的编码方式。因此,如果指定了不匹配HTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。

任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了
“EncType=” (空值)时,不会产生“Content-Type”
请求头。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有
web_add_[auto_]header函数,且“Method=POST”,且“Method=POST”,“application/x-
www-form-urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。

仅仅当Recording
Options--Recording --HTML-based script-- Record within the current script
step选项被选中时,List of Resource Attributes才会被插入到代码中。

所有的Web
Vusers ,运行在HTTP模式或者Wireless Session Protocol (WSP) 回放模式下的WAP
Vusers都支持web_custom_request函数。

Using
Binary Code

可以使用下面的格式在web_custom_request
函数的“Body”属性中加入二进制字符串。

\x[char1][char2]

通过2个字符[char1][char2]来表示十六进制的值。

例如:\x24表示16*2+4=36,它代表“$”符号,\x2B代表的是“+”符号。

如果不足2个字符,也不是有效的十六进制字符,VuGen则会当作ASCII文本处理。所以要注意,对于不足2个字符的十六进制,要在前面补0。例如
“\x2”是无效的十六进制串,需要边为“\x02”。

注意二进制的值是以“\\x”
的形式出现在脚本中的,也就是说在“x” 前面有2个反斜杠。这是由C语言的转义语法决定的。但是,当使用VuGen生成web_custom_request
函数时,只需要输入一个反斜杠。

如果在web_custom_request
中使用参数化,定义参数时只需要包含一个反斜杠这是由于参数替换时是不考虑C的语法转换的。

List
of Attributes
FtpAscii:“1”使用ASCII模式处理FTP操作;"0"
使用二进制模式。

TargetFrame:
当前链接或资源所在Frame的名称。除了Frame的名字,还可以指定下面的参数:

_BLANK:打开一个空窗口。

_PARENT:把最新更改过的的Frame替换为它的上级。

_SELF:替换最新更改过的的Frame。

_TOP:替换整个页面。

RecContentType:录制脚本时响应头的内容类型。例如text/html、
application/x-javascript等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。最频繁使用的类型是
text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示
html文本。"RecContentType=application/msword":表示当前使用的是Msword。

Referer:
当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。

Resource:指示URL是否属于资源。1
是;0
不是。设置了这个参数后,RecContentType参数被忽略。“Resource=1”,意味着当前操作与所在脚本的成功与否关系不大。在下载资源时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受“Run-Time
Setting—Browser Emulation--Download non-HTML resources”
这个选项的影响。此操作的响应信息是不做为HTML来解析的。“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时也会解析它。

ResourceByteLimit:web页面下载资源的极限大小。当达到设置的极限后,无法下载其他资源。仅仅对需要下载的资源有效。

下载过程:如果总计下载大小小于极限值,则正常开始下载。如果当下载时达到了设置的极限值,资源大小可知(在HTTP响应头中指定了
Content-Length),这中情况下,如果只需要一个缓冲区,那么下载可以正常完成。如果需要的不止一个缓冲区,或者资源大小不可知,下载就会中断同时关闭当前连接。

这个特性可以用来模拟用户不等待一个页面下载完成时导航到另一个页面的情况。

ResourceByteLimit
在HTTP模式中无法使用,在Concurrent
Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的。

Snapshot:快照的文件名,关联时使用。

Mode:两种录制级别HTML、HTTP。

HTML级别:在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。

HTTP级别:VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法更为灵活,但是生成的脚本不够直观。

ExtraResBaseDir(目前仅适用与web_custom_request函数):根URL,放在EXTRARES组里。它是用来解析相对URL的(译者加:类似于Windows的相对路径和绝对路径)。

URL可以是绝对路径(例如http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相对路径(例如“forecast.jsp?locCode=LFPO”)。

真正的URL的下载是通过绝对路径进行的,所以相对URL路径必须使用根路径URL去解析。例如,使用http://weather.abc.com/weather/做为根路径来解析“forecast.jsp?locCode=LFPO”,最后的URL是:http://weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果没有指定“ExtraResBaseDir”,默认的根URL是主页面的URL。

Body(目前仅适用与web_custom_request函数):请求体。不同的应用中,请求体分别通过Body、BodyBinary或者BodyUnicode参数来传递。请求体可以只使用其中一个参数,也可以使用一连串的分开的参数组成多请求体。例如:

web_custom_request(

……

"BodyUnicode=REPRICE"

"BodyBinary=\\x08\\x00\\xCC\\x02\\x00\\x00"

"Body=.\r\n"

"-dxjjtbw/(.tp?eg:ch/6--\r\n",

LAST);

在上面的代码中,使用了3个参数来划分请求体,一个是Unicode段,一个是二进制段,最后一个是常规的字符串。最终的请求体是这3个参数按照在函数中的顺序连接起来的值。

还有一个很少用到的参数,Binary。它也能描述二进制请求体,但只允许函数中只有一个请求体参数。

所有的请求体都是ASCII字符,以null结束。

Body:表示规则的,可打印的字符串。无法表示空字节。所有的字符都以一个反斜杠表示。注意:在旧的脚本中,可以看见不可打印的字符在请求体中以16进制方式进行编码。(例如
“\\x5c”),在这种情况下,必须使用“Binary=1”来标识。空字节使用"\\00"来表示。相反,新脚本则会把把请求体分开放在不同的参数中("Body=...",
"BodyBinary=...", Body=...")。

BodyBinary
:表示二进制代码。不可打印的字符在请求体中以16进制方式\\xHH进行编码。在这里HH
表示十六进制值。空字节使用"\\00"来表示。

BodyUnicode:美国英语,
特指拉丁
UTF-16LE(little-endian)编码。这种编码方式会在在每个字符末尾附加一个0字节,以便使字符更可读。但是在VuGen中实际的参数把所有的0字节都去掉的。但是在发送给Web
服务器之前, web_custom_request函数会重新添加0字节的。对于不可打印的字符,使用单反斜杠表示,无法表示空字节。

注意:如果请求体大于100K,会使用一个变量来代替Body参数。变量是在
lrw_custom_body.h中定义的。

Raw
Body(目前仅适用与web_custom_request函数):请求体是作为指针传递的,此指针指向一串数据。二进制的请求体可以使用BodyBinary
属性来发送(或者使用Body 属性来传递,前提是必须设置"Binary=1"
)。无论如何,这种方法需要使用转义字符反斜杠把不可打印的字符转换为ASCII字符。为了能有一种更简便的表现原始数据的方式,Raw
Body属性应运而生,可以传递指向二进制数据的指针。

使用4个连续的参数集来表示指针,而且必须按照顺序排列:

RAW_BODY_START

指向数据缓冲区的指针

(int)
长度

RAW_BODY_END

例子:

char
*abc= ...

web_custom_request("StepName",

"URL=http://some.url ",

"Method=POST",

RAW_BODY_START,

"abc",

3,

RAW_BODY_END,

LAST);

在应用中,即使设置了数据的长度为0,指针也必须有值,不能为空。

在“Binary=1”时,不能使用上面的语法传递原始数据。

数据缓冲区中的数据不能使用参数化。也就时说,缓冲区中的任何参数(例如
"{MyParam}")不能被正确的替代为相应的值,只会以字面值发送。

List
ofResourceAttributes
Web页面中的非HTML机制产生了资源列表,包含了Javascript, ActiveX, Java
applets and Flash所请求的资源。VuGen's 的Recording
选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。

支持以下资源:

URL
要加载的web资源的url。

Referer
关联的url。

ENDITEM
每个资源的结束标记

相对于把每个资源都录制为单独的步骤来说,不录制非HTML元素使脚本更加简短和可读,特别是在VuGen的Tree视图下更为突出。

当VuGen录制过程中发现附加的资源(比如JS)时,会以列表的形式加到附加资源项中。回放脚本时,这些资源文件也是请求的一部分。可以对一些按规则变化的资源使用关联。

web_find
语法:
int web_find (const
char *StepName, , char *searchstring, LAST );

参数:
1、StepName:步骤名称,在Tree视图中出现。

2、Attributes
and Specifications list:

支持的属性有:

Frame:在多Frame的情况下,定义要查找Frame的范围。

Expect:定义在什么情况下函数检查成功:找到了指定的搜索标准或者没有找到。例如说,可以检查指定的错误信息是否出现在web页面中。合法的值有2个:found和notfound。默认值是“found”。

Matchcase:指定搜索是否区分大小写。

Repeat:指定当第一次发现要查找的字符串时,搜索是否继续。当一个web页面中包含多个被查找的字符串时,此参数是非常有用的。合法的值有2个:yes,no。默认值是“yes”。

Report:指定在什么情况下,VuGen在执行日志中显示此函数的检查结果。合法的值有:success,failure,always。默认值是“always”。

Onfailure:此参数决定在函数检查失败后,Vuser是否中断。参数值是abort。如果指定了Onfailure=abort,当函数检查失败时,不论在运行时设置中的error-handling是什么,脚本都会中断。

如果没有指定Onfailure=abort,那么运行时设置中error-handling将会起作用。

支持的特性有:RightOf,
LeftOf (不支持7.x及更高版本)。

RightOf:要查找的字符串右边的内容。

LeftOf:要查找的字符串左边的内容。

3、Searchstring:需要查找的字符串,格式为“What=stringxyz”。此搜索不区分大小写。

4、LAST:属性列表结束符。

返回值
整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
此函数的作用是在HTML页面中查找指定的字符串。

此函数只能在基于HTML录制的脚本中使用。当指定的HTML请求全部完成以后,开始执行搜索过程,比web_reg_find要慢。

web_find函数在C语言的脚本中已经被web_reg_find所替代,web_reg_find运行速度比较快,而且在HTML-
based和URL-based的录制方式中都可以使用。 在C语言脚本中,web_find是向后兼容的。Java和Visual
Basic脚本中不再支持它。

运行在HTTP模式下的WAP用户都和运行在WSP回放模式下的WAP用户都不支持此函数。

web_global_verification
语法:
int
web_global_verification (, LAST );

参数:
List of Attributes:

1、Text:此属性是一个非空的,以NULL结尾的字符串,表示要查找的内容。语法是”Text=string”。还可以使用text
flags自定义字符串。

2、TextPfx:没有指定Text的情况下使用此属性。要查找的字符串的前缀。语法是”
TextPfx =string”。还可以使用text flags自定义字符串。

3、TextSfx:没有指定Text的情况下使用此属性。要查找的字符串的后缀。语法是”
TextSfx =string”。还可以使用text flags自定义字符串。

4、Search:可选项,在哪里查找字符串。可选的值是:Headers,Body,NORESOURCE或All。默认值是NORESOURCE。语法是“Search=value”。

5、Fail:当字符串找不到时的处理选项:Found
(默认值)或NotFound。Found表示当找到对应的字符串时发生了错误(例如“Error”)。NotFound表示当找不到字符串时发生了错误。语法是“Fail=value“。

6、ID:在日志文件中标识当前函数。

LAST:属性列表结束符。

注:text
flags:/IC表示忽略大小写;/BIN表示指定的是二进制数据。

返回值
整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
web_global_verification属于注册函数,注册一个在web页面中搜索文本字符串的请求,与
web_reg_find只在下一个Action函数中执行搜索不同的是,它是在之后所有的Action类函数中执行搜索的。可以搜索页面的
body,headers,html代码或者是整个页面。

在检测一些应用程序级别(不通过http状态码来表现)的错误时,web_global_verification是非常有用的。如果要定位通过HTTP状态码表现的错误时,使用web_get_int_property。

查找范围:all:这个HTML页面;Headers:页面的头;body:页面的体,包含所有的资源但不包含头;NORESOURCE(默认选项):仅仅包含页面的体,把包括头和资源。

如果不知道要查找的精确的文本,或者要查找的多个文本不是完全相同的,可以使用前缀和后缀来表示。这时需要用到TextPfx和TextSfx属性。这2个属性必须同时指定,一旦指定了其中一个,就不能指定Text属性了。

注意:web_global_verification在WAP协议下不能运行。

web_image_check
语法:
int
web_image_check(const char *CheckName, , <"Alt=alt"|| "Src=src">, LAST
);

参数:
1、CheckName:名称,在Tree视图中出现。

2、List
of Attributes:

支持的属性有:Frame(在多Frame的情况下,定义要查找Frame的范围)。

支持的选项有:expect,
matchcase, repeat, report, onfailure。

Tip:选项跟属性的区别,大部分选项都只允许设置预定义的值,其他的值都是无效的。

3、Alt:检查图象的ALT标记。不允许空值。

4、Src:检查图象的SRC标记。不允许空值。

5、LAST:参数列表结束的指示符。

返回值
整型。

说明
web_image_check检查指定的图象是否在HTML页面中出现。

Alt或者Src两者必须有一个在参数列表中出现。如果两项都通过,那么检查成功。

此函数仅仅支持基于HTML的脚本。

web_reg_add_cookie
语法:
int
web_reg_add_cookie(const char * cookie, const char * searchstring, LAST );

参数:
1、Cookie:定义需要增加或修改的Cookie。

Cookie的参数格式为:=VALUE;
(required);domain=DOMAIN_NAME;(required);expires=DATE;path=PATH;(default path is
"/");secure。

此参数中的cookie元素和HTTP响应头中的Set-Cookie是相同的。例如“Session=1234;domain=sanditon.com”,在这里,“Session”是cookie的名称。

2、Searchstring:要查找的文本字符串。字符串不能为空,以null结尾。格式为“Text=string”。

3、LAST:属性列表的结束符。

返回值
整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
web_reg_add_cookie是注册类型的函数。它首先注册一个搜索文本字符串的请求。检查动作在后续的Action函数之后进行。如果字符串被找到,就添加到cookie中。

需要注意,尽管web_reg_add_cookie在功能上跟HTTP
Set_Cookie头相似,它们还是有个明显的区别。根据HTTP标准,domain属性在Set-Cookie头中是可选的。如果没有指定,默认的domain的值是产生cookie的服务器的host
name。当使用web_reg_add_cookie函数时,服务器的hostname对于压力测试的机器来说是不可用的,所以domain属性是必选项。

此函数在HTML-based
和URL-based的脚本中都可以使用。(参照录制选项的录制标签页)。此函数是在服务器内容到达客户端之前注册搜索请求的,所以当所请求的内容一到就会执行搜索操作,脚本会比较高性。

web_reg_add_cookie是用户手动添加的,无法录制。

web_reg_find
语法:
int web_reg_find
(const char *attribute_list, LAST);

参数:
1、attribute_list:

通过Name=Value对来传递参数。例如“Text=string”。Text,TextPfx,TextSfx三个必须有一个出现。其他的属性是可选的。

a)Text:要搜索的字符串,字符串必须非空,以NULL结尾。可以使用text flags自定义搜索字符串。

b)TextPfx:要搜索的字符串的直接前缀。

c)TextSfx:要搜索的字符串的直接后缀。

d)Search:搜索的范围。可选的值是:Headers 、Body(在请求体中搜索)、Noresource (仅仅在HTML请求体中搜索,不包括头和资源)、ALL
(在请求体、头和资源中搜索),默认值是“BODY”。

e)SaveCount:匹配的个数。

f)Fail:设置函数检查在什么状态下失败。

g)ID:日志文件中标识此函数的一个字符串。

h)RelFrameId:相关联的FrameId。注意:此参数在GUI级别的脚本中不受支持。

2、LAST:属性列表结束的标记符。

返回值
整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
web_reg_find属于注册函数,注册一个在web页面中搜索文本字符串的请求,在接下来的Action(象web_url)类函数中执行搜索。

通过查找期望的字符是否存在来验证是否返回了期望的页面。例如,通过查找“Welcome”来检查主页是否完全打开了。也可以查找“Error”检查浏览器是否发生错误。还可以使用此函数注册一个请求来统计特定字符串出现的次数。

如果检查失败,在接下来的Action类的函数中会报告错误。此函数仅仅注册请求,并不执行。函数的返回值只表明注册是否成功,并不表示检查的结果。

此函数不仅能够查找text,还能查找到围绕着text的strings。不要同时指定text和前缀后缀。

Fail,处理选项,可以是“Found或“NotFound”。默认是“NotFound”。

“Fail=Found”
指示当对应的字符找到时,函数检查失败。例如,查找单词“Error”,如果找到了,说名web请求没有成功,你想把函数检查设置为失败。

“Fail=NotFound”指示当对应的字符找不到时,函数检查失败。如果查找的是web请求成功时出现的字符串时,需要使用NotFound。

SaveCount参数指示保存到参数中的匹配的字符串的个数。使用这个属性,需要指定“SaveCount=param”。检查操作被执行后,param
的值是null结尾的数字类型的值。

如果指定了SaveCount,且没有使用Fail参数,检查不会失败,无论需要查找的字符串是否找到。通过检查SaveCount的值确定字符串是否被找到。如果param是0,说明没有找到对应的字符串。

如果同时指定了SaveCount和Fail,指定的错误处理选项和SaveCount协同工作。
handling option specified works together with the SaveCount.
Thus,如果指定了SaveCount且指定了“Fail=NotFound”
,但是字符串被找到,SaveCount被赋值为字符串出现的次数,检查成功。如果字符串找不到,SaveCount被赋值为0,检查失败(注意,参数的
0值只在运行时设置中Continue on error 选中时才有意义)。

此函数在HTML-based和URL-based的脚本中都可以使用。此函数是在所请求内容到达之前注册搜索请求的,所以当所请求内容一到达后就会执行搜索,产生的脚本比较高效。

web_concurrent_start
语法:
int
web_concurrent_start ( [char * ConcurrentGroupName,] NULL );

参数:
ConcurrentGroupName:可选的,并发组的标识符。

NULL:参数列表结束的标记符。

返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。

说明
web_concurrent_start函数是并发组开始的标记。组中所有的函数是并发执行的。并发组的结束
web_concurrent_end 函数。在并发组中,可以包含的函数有:web_url、web_submit_data、web_custom_request、
web_create_html_param、web_create_html_param_ex、web_reg_save_param、
web_add_header。

在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。

所有的Web
用户,HTTP模式下的WAP用户持本函数。运行在Wireless Session Protocol(WSP)回放模式下的WAP虚拟用户,不支持本函数。

web_concurrent_start
语法:
int
web_concurrent_end ( reserved );

参数:
reserved:保留的供扩展的字段。

返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。

说明
web_concurrent_end,并发组结束的标记。脚本执行时,碰到
web_concurrent_end函数时,开始并发执行所有记录的函数。

在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。

可以并发执行的函数的个数是有限制的,使用运行时设置-Netword标签页的Concurrent
Connection来设置。

上一篇:python基础16_闭包_装饰器


下一篇:[LintCode] Generate Parentheses 生成括号