loadrunner提高篇 - 场景设计实践
集合点设置
一、为什么要进行集合点设置?
因为在测试过程中,并不能保证所有的Vuser都在同一时刻进行操作,这样就达不到并发测试的目的,故需要用到集合点技术,集合点的意思是如果在一个操作之前设置了一个集合点,LR会等待所有的Vuser都准备好要执行该功能时才开始执行,其强调的是所有的Vuser都已准备好了,如果只是部分vuser准备好了,该功能还是不会被执行。
二、如何进行集合点设置?
1、scenario->rendezvous,如图1所示(例子用的是手工测试场景模式)
注:在场景设置集合之前(即在录制脚本过程中或录制完后),脚本一定要插入集合点;否则会发现scenario菜单中rendezvous项是不可选的。

图1(设置集合点)
2、点击rendezvous按钮后,会弹出rendezvous information窗体,设置集合点信息,如图2所示
1)rendezvous:显示脚本中包含的所有集合点。默认情况下这些集合点处于启用状态(可用disable rendezvous按钮禁用);
2)scripts:显示了场景运行的所有脚本;
3)vusers:场景运行设置虚拟用户情况。默认情况下所有的vuser都会参与到集合点的策略中来(可用disable vuser按钮将vuser设置为不参与);

图2(集合点设置对话框)
3、点击policy按钮,在弹出窗体中设定集合点执行的策略,如图3所示
1)表示当所有用户数的x%到达集合点时,开始释放等待的用户并继续执行场景。
2)表示当前正在运行用户数的x%到达集合点时,开始释放等待的用户并继续执行场景。
3)表示当x个用户到达集合点时,开始释放等待的用户并继续执行场景。
4)timeout between vusers:当第一个用户到达集合点后,再等待30s,如果30s内到达的用户数达到指定的数量,就开始继续执行场景;如果在30s内还没有达到指定的用户数量,就不再等待,开始释放等待的用户并继续执行场景。详细原理,如图4所示

图3(集合点策略设置)

图4(集合点超时原理)
分析:当前面3个虚拟用户到达集合点后,第四个虚拟用户在30s内并未到达集合点,这样已经到达的虚拟用户不会再等后面的虚拟用户,而是直接释放虚拟用户,运行后面的脚本。
4、手动释放vuser技术
上面讲的都是自动控制vuser释放的情况,但在实际使用过程中,也可以手动对vuser进行释放,这涉及手动释放vuser技术。
手动释放vuser的步骤:开始执行场景->选择scenario->rendezvous->在场景运行过程中,release按钮会变成可用状态,这时可进行手动释放,如图5所示:

图5(手动释放vuser)
三、 集合点与事务的关系
在进行并发测试时需要设置集合点,同时为了获得事务的响应时间必须添加开始和结束事务,一般呢是将集合点设置在开始事务代码之前。原因如下:
1、集合点设置在开始事务代码后面:当虚拟用户运行到开始事务起点时,事务就开始统计时间,但是当第一个虚拟用户到达集合点时,后面的虚拟用户还没有达到集合点,这样第一个虚拟用户就不得不等其他的虚拟用户到达集合点后才能接着运行,但是虚拟用户到达集合点之前事务一直在统计时间,并没有暂停,那么这个等待的时间还是事务的真实时间,真实的事务响应时间应该除去虚拟用户之间的等待时间。
2、集合点设置在开始事务代码前面:虽然需要待所有的虚拟用户都到达集合点后才开始释放虚拟用户,但是此时事务并没有开始计时,只有运行到开始事务代码时才开始计时,这样统计出来的时间值就不包含虚拟用户,因为集合点的原因所浪费的等待时间。
四、附上为了设置集合点而录制的脚本
Action()
{
//该脚本用于集合点设置的验证
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("header.html",
"URL=http://127.0.0.1:1080/WebTours/header.html",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/",
"Snapshot=t3.inf",
"Mode=HTTP",
LAST);
web_url("welcome.pl",
"URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/",
"Snapshot=t5.inf",
"Mode=HTTP",
LAST);
web_concurrent_end(NULL);
web_concurrent_start(NULL);
web_url("hp_logo.png",
"URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://127.0.0.1:1080/WebTours/header.html",
"Snapshot=t4.inf",
LAST);
web_url("webtours.png",
"URL=http://127.0.0.1:1080/WebTours/images/webtours.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://127.0.0.1:1080/WebTours/header.html",
"Snapshot=t6.inf",
LAST);
web_concurrent_end(NULL);
web_concurrent_start(NULL);
web_url("home.html",
"URL=http://127.0.0.1:1080/WebTours/home.html",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
"Snapshot=t7.inf",
"Mode=HTTP",
LAST);
web_url("nav.pl",
"URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
"Snapshot=t8.inf",
"Mode=HTTP",
LAST);
web_concurrent_end(NULL);
web_url("mer_login.gif",
"URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t9.inf",
LAST);
web_concurrent_start(NULL);
web_url("8afc2fe48db9060fe1bdda2089e1d950.png",
"URL=http://act.cmcmcdn.com/upload/201507/8afc2fe48db9060fe1bdda2089e1d950.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://127.0.0.1:1080/WebTours/",
"Snapshot=t10.inf",
LAST);
web_url("3b491068507d8f85ea7b35d756da7215.png",
