应用系统的结构图,如下所示:
这个图比较直观、简洁地反映了一个应用系统的运行过程,其中包括客户端、网络、应用服务器和数据库服务器,其中每一个环节都是在执行性能测试分析中必不可少的元素,结构图中也合理得分析出了响应时间的处理过程,当请求从客户端发出之后到最后返回到客户端,这个过程中每一个环节的处理都有可能最后成为系统运行中的性能瓶颈,所以可见对系统整体结构的理解是何等重要。
接下来我们来看看关于并发用户和集合点的定义:
并发用户:通俗意义上讲就是同时操作的用户,当然这个“同时”可以理解为同一时间段,还可以理解为同一时间点,当然如果说并发就是同一时间点上同时操作的用户,这样理解没有错误,但对于实际情况来讲,是没有严格意义上的并发执行的,就如同进程和线程关系一样,在某一个点严格上讲就只有一个人得到执行的权利。
集合点:用以同步虚拟用户,以便恰好在同一时刻执行任务。对于LoadRunner来说,集合点只是一种策略,而这个策略也会有很多规则,因为实际情况中并非所有用户都会同时到达集合点,因为从客户端发出到网络、中间件、应用层再到数据库,这其中的每一个环节都有延时,也就是说不可能所有的用户都能到达所谓的集合点,才开始同时执行操作。
集合点和并发用户的关系:
集合点和并发用户的关系具体怎样就要看需求是什么了。例如用户要求“本系统要达到并发用户200”,这种需求从严格意义上来讲是不合格的,因为对于一个系统来说有很多个功能,比如系统登录、注册、查询、删除等等,是要求登录达到200,还是所有功能总共达到200,因为当用户进入系统之后,有些用户在执行注册,有些用户在执行查询,是否可以并行操作,也是所谓的并发,所以说要理解集合点和并发数,从根本上就应该更清晰的理解业务流程,只有把业务分析清楚了,方才可以合理的使用集合点,正确的理解并发用户数。
LoadRunner本身就已经在模拟实现一个并发的过程,而增加集合点设置只是为了并实现严格意义上的所谓的并发,而实际是这个集合点的设置也并非绝对达到了这个目的,结构中的过程就可以证明。当然为此我也通过一些实例来做验证,以下是对Mercury web Tours网站首页,录制访问过程,脚本如下:
脚本 1:设置集合点
Action()
{
lr_rendezvous("同步访问web页面");
lr_start_transaction("start");
web_url("mercuryWebTours",
"URL=http://192.168.3.34:1080/mercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_end_transaction("start", LR_AUTO);
return 0;
}
脚本 2:不设置集合点
Action()
{
web_url("mercuryWebTours",
"URL=http://192.168.3.34:1080/mercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
return 0;
}
在相同场景实际中执行两个脚本之后,发现其响应时间其实误差很小。
并不是集合点在我们的性能测试中没有作用,如果没有作用我相信设计LoadRunner的公司也不会给出来,而是要理解如何选择去用它,这才是关键。之前我们就讲到过,在一些业务流程比较复杂的应用程序测试中,我们就必须要使用集合点,比如一个企业系统中业务是这样的:用户登录进入之后,一部分人在完善个人资料,一部分人在查询数据,另一部分人在执行删除操作,还有一部分来发送消息等等。就这样的一个业务中,在模拟执行性能测试时,就必须明确并发用户跟集合点的关系,在实际录制脚本的时候,我们就需要把这个业务分割成多个事务,然后分别对各个不同的事务要设置集合点,为什么此时要使用集合点呢,因为我们必须分析出每一个事务的并发情况,加入200个用户进去之后,我们就这样放任去这200个用户自由去操作,就不能判断出查询并发数多少、删除并发数多少、发送消息的并发又是多少,因为进入系统之后,没办法确定200个用户都同时干了些什么,所以此处才是集合点使用最合理的地方。至于,我为什么很少使用集合点,也源于此,因为通常情况我们主要是对单一业务进行压力测试,比如登录或者是注册,单一功能就如同上面的那个访问web页面一样,脚本只有一个操作,此时对于LoadRunner来讲,其实有没有设置集合点效果不大,而且为了模拟能更加接近去实际情况,当然这也是要做实际分析的。
网友评论