性能测试原理及性能测试实例分析
上一篇 / 下一篇 2007-04-17 16:16:37 / 个人分类:Mercury LoadRunner
#Xa~!u D T:j'G;p~0 |
gN/{"z I]G0R0 |
1Mph1Xw[m;d8^0• 软件测试中的性能测试51Testing软件测试网aY5p#?oG
2]+O1yqG S0软件测试是保证软件质量的重要手段,也是软件过程中一个必不可少的环节。而性能测试则隶属于软件测试中的系统级测试,它对软件在集成系统中运行的性能行为进行测试,旨在及早确定和消除软件中与构架有关的性能瓶颈。
-gb7D#?G;\+Q0;@F1}7i$_#d1Ct0• 性能测试的含义
(g1_5UL:H%f3tC7W051Testing软件测试网8n8uO$h$hT目前对性能测试没有明确的定义,一般地,它主要是针对系统的性能指标制定性能测试方案,执行测试用例,得出测试结果来验证系统的性能指标是否满足既定值。性能指标里可能包括系统各个方面的能力,如系统并发处理能力,批量业务处理能力等。
GD+DG bK P-B9J4Xy051Testing软件测试网`2I?CV+Y• 性能测试的分解
-@a;l#Lq3@$iZ051Testing软件测试网-f Z'hS+k+a m在性能测试的执行中,可以根据具体的性能指标,分解为几种测试,根据其关系,可以在不同的时间和空间内执行。这些子测试通常包括以下几种:
$~v.W7TDh+E051Testing软件测试网/C+Nyg~*B并发测试:验证系统的并发处理能力。一般是和服务器端建立大量的并发连接,通过客户端的响应时间和服务器端的性能监测情况来判断系统是否达到了既定的并发能力指标。51Testing软件测试网&R{9qE^
-ylA-yH1O|_$~a0负载测试:验证系统的负载工作能力。系统配置不变的条件下,在一定时间内,服务器端在高负载情况下的性能行为表现。这里的负载可以是用户数,交易数,事务数等。51Testing软件测试网@&ppY{ k
Z"Av;{x&j0配置测试:核实在操作条件保持不变的情况下,系统在使用不同配置时其性能行为的可接受性。51Testing软件测试网1e/w,}k%GL!K
51Testing软件测试网+?9uu3sB8@'H健壮性测试:核实被测系统的性能行为在异常或极端条件之下的可接受性。这里的异常或极端条件指的是资源过少,用户数过多,突发故障等。
7t7j&Q I|epSE0$Xp,U*gV c0随着软件系统的规模日益庞大,结构日趋复杂,对软件系统的性能测试已经成为必须和趋势。尤其大型的分布式软件系统更要在正式运行前进行性能测试,因 为这样的系统在投入生产之后,往往要接受大批量的业务量,这对应用程序本身,操作系统, 中心数据库服务器,中间件服务器,网络设备的承受力都是一个严峻的考验。在其中任意一个环节出现的问题都可能给用户带来巨大的商业损失。预见软件系统的并 发承受能力以避免商业风险,这是在软件测试阶段就应该解决的。例如中国人民银行的现代化支付系统和上海外汇交易中心的本币交易系统都在投入生产之前进行了 多轮的第三方性能测试,起到了很好的作用。51Testing软件测试网sk}bn X2[:Gw!mG
51Testing软件测试网gVmR6U下面我就介绍一个性能测试案例。
)h;OpB:w,J051Testing软件测试网0la[&j#g"j;jU@•一个性能测试实例51Testing软件测试网*^f5A4C)E
P%~%k$A7opU G0• 被测系统
:~J%s.|#~1E03DuZ0JO"bx#K;Q2sw01)被测系统介绍51Testing软件测试网 z#KV6ckG
51Testing软件测试网c@x-@m3[本系统应我国金融信息化发展设计,采用当今比较先进和流行的技术,是运行在城域网上的大型分布式应用系统。51Testing软件测试网^+]A"`u
51Testing软件测试网6\_{UZ@ a本系统遵循J2EE规范,采用B/S体系结构进行设计和开发。业务主要分为交易业务和查询业务,查询业务采用J2EE规范,交易业务以J2EE体系架构为基础,进行进一步的处理,采用了TCP的四层结构。系统体系结构图如下:51Testing软件测试网J1X!OtSO#t7[2}UM4`J
图表 1被测系统体系结构设计图
{#jRI]stq.aQ0- 表示层:
K zG H\(Tl0运行在终端上。运行java applet程序,提供协议控制和用户界面,与系统最终用户实现直接交互,通过TCP/HTTP与前置系统通讯。向前置系统发送请求报文,并接收前置系统返回的回应报文。51Testing软件测试网j*@lk c)m$y
- 商业逻辑层:
作为中间层实现核心业务逻辑服务。51Testing软件测试网:r,p(F4LisD+j.M
1X}y5x5cP4|0交易应用服务:运行在交易主机上。在tuxedo中间件上运行业务处理程序,按交易规则处理前置机发来的交易指令,通过tuxedo jolt与前置机连接,通过DB2 C API与数据库连接。
7VG:l7G'Gd#[-W0dJvC(c7s k7N0交易前置服务和查询前置服务:运行在前置机上。交易前置服务运行服务程序接收终端请求报文并通过tuxedo jolt客户端将其转发给交易主机,再通过轮询和同步反馈接收交易主机返回的报文,将其转发给业务终端;查询前置服务运行在weblogic应用服务器上 并调用Jreport组件,通过JDBC完成对查询流指令的发送并接受数据库返回的结果给业务终端。
idl"f:u3Rw0- 数据层:
运行在数据库主机上。负责整个系统中数据信息的存储、访问及其优化。运行DB2数据库服务程序。通过DB2 C API与交易主机通讯,JDBC与查询前置服务通讯。51Testing软件测试网 Cd&xFIf!]n0?mt)^
数据库主机和交易主机运行在交易中心城市,前置机运行在各个分中心城市,终端是各个城市参加交易的单位,整个系统覆盖城域网。t,?|s a02) 被测系统的性能要求和性能指标51Testing软件测试网z]7Y#B"Nx:?
51Testing软件测试网&k0B!iY-v1L@)|U \V金融系统是业务处理十分频繁、数据交换吞吐量很大的系统,业务处理的速度直接关系到公司的经济效益和客户对公司的评价。在客观条件下,整个广域网系统必须在大业务量的情况下同时保持快速的实时响应能力,以保证整个业务系统的通畅运行。用户对此提出如下性能指标:
{4y/@1^f0F-sG0表格1用户要求性能指标表
}5E)F#YCE051Testing软件测试网0@4z;[FQw!y下面我们会根据此系统和给定的性能指标来进行性能测试:
N2r;@ Ze-d-b N3g051Testing软件测试网\#^;G2AA"R H1GA {1Aq4o051Testing软件测试网@6Y,@Wk5Y(oZ+r Y性能测试的目的是最大程度地模拟真实业务场景,来验证系统的性能指标,并发现可能存在的性能瓶颈。51Testing软件测试网%H2dg)G:q1N
Z m1i j6L`-@01)对被测系统进行系统分析51Testing软件测试网5s4k2Pz0]+l
C9z!MY+n3`~g0我们可以看到本系统大体上由终端、前置机、交易主机、数据库主机节点组成。
Y)ncA7Eg00V8P#f#z [4dG1Fq0在整个业务流程中,业务终端→前置机→交易主机→数据库主机形成了一个压力流串,每个节点在压力下能够正常工作是整个系统正常运转的基础。也就是说,如果其中任意一个节点在业务压力下发生了拥塞、处理不力等不正常情况,那整个系统都无法正常运转。
`]w'dn051Testing软件测试网1cg2n)f%f我们来看一下业务流程。51Testing软件测试网!}t:my"j"I,E
5z7Ji%j4_0首先,从终端到前置机,终端产生业务报文发送至前置机,前置机上运行查询前置服务和交易前置服务,查询前置服务向下通过HTTP协议以WEB服务形 式和终端连接,向上通过JDBC直接与数据库系统相连。交易前置服务向下通过基于TCP协议的socket连接和终端通讯,向上通过tuxedo jolt客户端和交易应用服务连接。交易应用服务进行业务逻辑计算,并操作数据库系统。51Testing软件测试网h3W&A-M0V;F1bg
51Testing软件测试网2e#?Xa1^J3_2ns由以上分析,我们可以整理出整个系统的两条压力流程线来,之所以我们把其分为两条流程线,是因为交易前置服务和查询前置服务的工作原理完全不同,下与终端的连接,上与交易主机的连接也完全是独立的两个通路。51Testing软件测试网$z^'M p+mly'F)HR+|
51Testing软件测试网 p;`M#_}/iQ终端→交易前置机→交易主机→数据库系统
E ?d p YD)M!u.z0&k9g8e)A?"_l2R0终端→查询前置机→数据库系统
7w|4PX/_051Testing软件测试网!P4K(]2w`c4Hy下面我们先独立分析两条流程线,之后我们将再次综合分析,以考虑二者之间的相互影响作用。51Testing软件测试网q:~T7ax
51Testing软件测试网6C0qHx"Qb8r4|第一条路线上主要运行的是登陆指令和交易指令信息。
"UL4B S*n7?z0)|i-m![1d:}:n0当系统运作时,多个交易终端与交易前置服务建立socket连接,完成登陆,之后发送交易指令,造成对交易前置服务的压力。交易前置服务通过运行服 务程序接收到交易指令,并检验其合法性,然后通过交易中间件tuxedo的客户端把业务的压力传递给交易主机进行处理。交易主机进行必要的金融计算和业务 逻辑运行,得出反馈结果,生成消息,一方面顺原路返回到各个终端上去,一方面记录入数据库。
*PE8xk4R,Na0`!Yy%J J],oB"|i0在本条流程线上的加压主要考验交易前置服务程序的socket多连接建立能力,tuxedo交易中间件的即时响应能力,交易主机的计算能力,以及DB2数据库的DML语句加锁机制。
BCA(_6o6s {051Testing软件测试网}2Yg-XA meO第二条路线上主要运行的是查询指令信息。51Testing软件测试网;_w m6t'i6R:P;GQ
51Testing软件测试网 t6N,ne$O-R\查询指令产生时,通过http协议访问weblogic上的web服务器和应用服务器上的相应组件,以JDBC接口访问后台的DB2数据库,并把数据库返回的结果发送至终端界面。51Testing软件测试网9k&s6Soj)n3l
51Testing软件测试网 c8Em DB3B在本条流程线上的加压主要验证weblogic处理能力,数据库中索引是否创建合理。51Testing软件测试网'|1P)K)V$ISd5h
51Testing软件测试网p/q0[L D nz两条流程线相对独立,但又是互相依赖的。由于是对同一个数据库系统进行读操作和写操作,查询流程的结果依赖于交易流程数据的产生,交易流程的产生的数据又通过查询流程得到验证。在进行压力测试时,两者的协同会对数据库形成压力的冲击。51Testing软件测试网k%t.a^!k:|!h'r5e
鉴于以上分析,结合用户性能指标,我们决定把本次性能测试分解为如下几个子测试来进行。Qp)@"q s%i!{5MA0J0A: 并发登陆测试:750个终端一分钟内并发登陆系统,并且响应时间在30秒之内。51Testing软件测试网 `Qr XEHMT*`
51Testing软件测试网 GdnH:gB: 业务负载测试
%D<#c#L051Testing软件测试网LZ'`*Z8{9]'O%V此下又有三个子测试。51Testing软件测试网`Gom0u7I? x
- 交易流程测试:多个终端发起交易请求,逐渐加压,以达到300笔/秒的压力为限。
- 查询流程测试:多个终端进行查询,逐渐加压,以达到400笔/秒的压力为限。查询成功与否以所请求的web页面完全展现为标准。(查询响应能力其实和数据库中的数据量有关系,后来和用户进一步确认,基础数据为30万条)
- 综合测试:
+}0a` W!R?-j0在上面两种测试都通过的情况下,进行综合测试。
1p{7J;|5ft051Testing软件测试网Cv mYCd2)性能测试的执行过程,性能测试依照下面的步骤来进行:
"^9as"y|*\0`#m$rOU4W0本次压力测试采用MI公司的loadrunner工具,脚本编辑和编译工作在VU Generator(脚本作坊)中进行。51Testing软件测试网c;w1J3G5j'\#zF2q#Y
51Testing软件测试网G:^2r,O3|(uS,yw y;k理想的脚本是对现实世界的业务行为进行了完全无误的模拟,这其实是不可能的。我们的目标是使模拟的误差在我们认可的范围之内,并能有方法加以控制。51Testing软件测试网j;l:K U'A/}
51Testing软件测试网3E&N4b2W#UZJQ针对并发登陆测试和交易流程测试,由于两者运行机理相同,都是终端调用socket client,和交易前置的socket server建立连接,将请求消息发送至交易前置机。我们考虑采用将此部分java socket程序编入测试脚本程序,生成登陆和交易业务脚本,通过loadrunner来执行。这样做的好处是绕过终端IE界面复杂的处理逻辑,直接施压 在前置机上(这种方式同时也带来了偏差,在执行测试场景时通过其它方法得到了一定的弥补)。
G4zcy*[4\6M(f3C0J J;A6Q^q0脚本除了要实现与前置机的socket连接,业务发送等功能,还要建立用户信息数据池,设置检测点、异常退出点,为脚本执行后的结果统计和分析提供正确的依据。
m!S+LKq(N'E0X#cA6`nj/D1C9ng`0交易业务脚本内容略。部分如下:51Testing软件测试网._:S9rW(P lC
public class Actions {/*登陆变量初始化*/ProtocolManager protocol;//ProtocolManager为实现socket连接的类 ServiceName service; //ServiceName对服务端的信息进行了封装,包括IP地址和端口号。LoginMessage login;//LoginMessage为登陆时需要向服务器发送的消息,待服务器确认并返回回应消息时,登陆成功。protocol = new ProtocolManager(); //创建ProtocolManager类的protocol对象service = ServiceName.getInstance();//获得ServiceName的实例login=new LoginMessage();//创建LoginMessage类的login对象service.setIP("200.31.10.18");// 设置服务端的IP地址service.setPort(17777);//设置服务端的端口号/*设置登陆消息*/ login.serUserName(lr.eval.string(“{loginName}”));//从数据池里读出用户名,设置在login成员 变量里login.setPasswd(“1234”);//数据库中添加的用户密码都为1234/*发送登陆消息*/protocol.login (login);//发送登陆消息lr_start_transaction("trade");//交易开始点TradeMessage trademessage;//生成交易消息/*设置交易消息*//i+K^QQ.L:i*Y0………………………….
G{ c&r'h:d:V&G"`h0,]$x:@HW&c0………………………….
i:P'USAF w9R O}0/*发送交易消息*/