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",
        "URL=http://act.cmcmcdn.com/upload/201507/3b491068507d8f85ea7b35d756da7215.png",
        "Resource=1",
        "RecContentType=image/png",
        "Referer=http://127.0.0.1:1080/WebTours/",
        "Snapshot=t11.inf",
        LAST);

    web_concurrent_end(NULL);

    lr_rendezvous("集合点");//集合点设置在开始事务代码之前

    lr_start_transaction("login");

    lr_think_time(59);

    web_submit_data("login.pl",
        "Action=http://127.0.0.1:1080/WebTours/login.pl",
        "Method=POST",
        "RecContentType=text/html",
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
        "Snapshot=t12.inf",
        "Mode=HTTP",
        ITEMDATA,
        "Name=userSession", "Value=121041.120453625zcczAfcpzDDDDDDDDHDfzpDVfi", ENDITEM,
        "Name=username", "Value=test1", ENDITEM,
        "Name=password", "Value=test1", ENDITEM,
        "Name=JSFormSubmit", "Value=off", ENDITEM,
        "Name=login.x", "Value=57", ENDITEM,
        "Name=login.y", "Value=5", ENDITEM,
        LAST);

    web_concurrent_start(NULL);

    web_url("nav.pl_2",
        "URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://127.0.0.1:1080/WebTours/login.pl",
        "Snapshot=t13.inf",
        "Mode=HTTP",
        LAST);

    web_url("login.pl_2",
        "URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://127.0.0.1:1080/WebTours/login.pl",
        "Snapshot=t18.inf",
        "Mode=HTTP",
        LAST);

    web_concurrent_end(NULL);

    web_concurrent_start(NULL);

    web_url("flights.gif",
        "URL=http://127.0.0.1:1080/WebTours/images/flights.gif",
        "Resource=1",
        "RecContentType=image/gif",
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
        "Snapshot=t14.inf",
        LAST);

    web_url("itinerary.gif",
        "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif",
        "Resource=1",
        "RecContentType=image/gif",
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
        "Snapshot=t15.inf",
        LAST);

    web_url("in_home.gif",
        "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif",
        "Resource=1",
        "RecContentType=image/gif",
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
        "Snapshot=t16.inf",
        LAST);

    web_url("signoff.gif",
        "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif",
        "Resource=1",
        "RecContentType=image/gif",
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
        "Snapshot=t17.inf",
        LAST);

    web_concurrent_end(NULL);

    lr_end_transaction("login",LR_AUTO);

    return 0;
}

集合点设置

IP欺骗技术

  因为笔者的电脑是自动获取IP的,所以做不了IP欺骗,具体的设置IP欺骗步骤可以参考虫师的博客:http://www.cnblogs.com/fnng/archive/2013/03/02/2940284.html

负载均衡技术

  为什么测试机即负载发生器可能会成为瓶颈?这是由于负载 不均匀造成的。例如,在测试过程中使用4台测试机作为负载发生器,虚拟用户为500个,这时如果负载分配不均匀,可能出现这种现象,就是500个虚拟用户从4台中的两台测试机中产生,这样就导致有两台机器特别忙,而另外两台机器就特别闲,这样这两台特别忙的机器,其本身就可能成为瓶颈了。

  在默认的模式下,controller中添加多台load generators机器时,不管如何添加,最终只能选中一台机器,如图6所示

图6(load generators机器设置,注:笔者的负载发生器只有本机)

  这样的负载分配是不均匀的,为了解决这个问题,首先要更换场景模式,选择scenario->convert scenario to the percentage mode命令,将场景模式由组模式更换为百分比模式,如图7所示

图7(选择多个负载发生器)

RTS设置

  关于多脚本RTS的设置方式有两种:shared RTS和individual RTS。前者是表示所有运行的脚本都使用相同的RTS设置项,后者是指每个脚本单独地设置其RTS内容。如图8所示

图8(多脚本RTS设置)

  单击shared rts或individual rts按钮会弹出run-time settings对话框,主要关注pacing,log,think time,miscellaneous这4个选项的设置内容。如图9所示

1)pacing:主要设置每次迭代之间的时间间隔,根据不同的测试目的,可以设置不同的时间策略;

2)log:主要设置回放脚本时收集的日志方式,一般使用扩展日志中的参数提交的方式;

3)think time:主要设置思考时间,关于思考时间也需要根据测试目的来确定;

4)miscellaneous:需要设置出错时处理以及虚拟用户是按进程还是线程运行。

图9(以shared rts为例的run-time setting窗体)

  后面还有两个内容:执行路径转换与在loadrunner中使用功能测试脚本,个人觉得这两个知识点暂时用不上,故不提及了,以后如果有必要再进行补充。

时间: 2024-11-17 03:56:49

loadrunner提高篇-场景设计实践的相关文章

loadrunner提高篇-结果分析实践

分析图合并 一.分析图合并原理 选择view->merge graphs,弹出如图1所示对话框 图1(设置合并图) 1.选择要合并的图.选择一个要与当前活动图合并的图,注意这里只能选择X轴度量单位相同的图. 2.选择合并类型. 1)叠加:查看共用同一X轴的两个图的内容.合并图左侧的Y轴显示当前图的Y轴值,右边的Y轴显示合并进来的图的Y轴值,如图2所示 图2(叠加合并分析图) 2)平铺:在平铺布局查看,共用同一个X轴,合并进来的图显示在当前图的上方,如图3所示 图3(平铺合并分析图) 3)关联:合

loadrunner提高篇-block(块)技术和参数化

Block(块)技术 block(块)技术是应用于在一个脚本中实现不同事务.不同次数循环或不同百分比循环的情况.比如在一个脚本中,登录执行3次,查询执行1次. 使用方法如下: 1.录制一个脚本,包含2个业务:登录和查询 2.vuser->run time settings->general->run logic,选择run,插入一个block块,然后选择block(),单击insert action按钮,选中要添加的action,如图1所示: 图1(为block添加action) 3.重

loadrunner提高篇-插入检查点与关联函数

插入检查点   靠LR自动生成的脚本是不够的,很难达到业务要求,因此需要对录制完的脚本进行完善,使其能达到业务模拟的要求 ,这样尽可能地使虚拟用户模拟时更接近用户的实际使用. 在进行压力测试时,经常会有页面间数据传递的操作.如果在测试过程中传递数据的次数逐渐增多,页面就有可能发生传递混乱,或者客户端与服务器端数据传输被中断.传输过程中产生了错误的数据等情况.为了判断数据传递的正确性,LR提供了插入检查点的方法.之前在入门篇的博客中有提到插入检查点的原因,这里就不再细说了,大概提一下,是因为当事务

【Loadrunner】初学Loadrunner——场景设计

在使用Loadrunner的时候,常常需要使用到场景设计.但是怎么设计一个满意的场景?如何开展? 首先可以点击tools > Create Controller Scenario > OK(单个脚本的场景设计到这里就可以结束了) > File > New (第一次使用的时候在点工具 > 创建的时候就会出现新场景设计页面,这里的步骤是非第一次使用场景设计页面创建时的操作步骤).场景设置有手动设置和基于目标的场景设置两种,下面就逐一介绍. 一.手动设置场景Manual Scena

loadrunner 场景设计-手工场景方案(Schedule)设计 Part 1

参考:http://blog.sina.com.cn/s/articlelist_5314188213_1_1.html loadrunner 场景设计-手工场景方案(Schedule)设计 Part 1 A.   定义方案schedule 在 Scenario Schedule面板中,选择一个方案schedule,或通过点击New Schedule定义一个新的方案 定义schedule: a.新建schedule:点击新建按钮(可选) b.重命名schedule:在Schedule Name输

loadrunner实战篇 - 客户关系管理系统性能测试

系统介绍                                                             图1(客户关系管理系统模块关系图) 需求分析 一.性能指标 性能指标分析,根据客户需求与本系统相结合,用户希望模块能满足下表所列的性能指标. 图2(性能指标) 很明显,上面的需求是不具可操作性的,这就像和客户谈需求一样,客户只是很简单地描述了需求,而如果仅仅从上面这个简单的表格来进行性能测试,是很难的一件事情,并且很可能测试出来的结果与实际结果存在很大的差距,这样就需

EntityFramework之领域驱动设计实践

EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领域驱动设计实践 (二):分层架构 EntityFramework之领域驱动设计实践 (三):案例:一个简易的销售系统 EntityFramework之领域驱动设计实践 (四):存储过程 - 领域驱动的反模式 EntityFramework之领域驱动设计实践 (五):聚合 EntityFramewor

(转)EntityFramework之领域驱动设计实践

EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领域驱动设计实践 (二):分层架构 EntityFramework之领域驱动设计实践 (三):案例:一个简易的销售系统 EntityFramework之领域驱动设计实践 (四):存储过程 - 领域驱动的反模式 EntityFramework之领域驱动设计实践 (五):聚合 EntityFramewor

搞懂分布式技术6:Zookeeper典型应用场景及实践

搞懂分布式技术6:Zookeeper典型应用场景及实践 一.ZooKeeper典型应用场景实践 ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上对ZK的应用场景也有不少介绍,本文将介绍比较常用的项目例子,系统地对ZK的应用场景进行一个分门归类的介绍. 值得注意的是,ZK并非天生就是为这些应用场景设计的,都是后来众多开发者根据其框架的特性,利用其提