对于一个软件系统,运行时执行速度越快、占用系统存储资源及其他资源越少,则软件性能越好。
软件性能与软件功能是软件能力的不同体现,以一个人的工作能力来比喻,“功能”是某个人能够做的事情,“性能”指此人完成这件事情的效率。
在功能相同的情况下,性能是衡量事情完成效果的一个重要因素。
1.1.2不同角色对软件性能的理解1)从系统用户角度看软件性能系统用户指实际使用系统功能的人员。
2)从系统运维人员角度看软件性能系统运维人员指负责软件系统运行维护的工作人员。
(4)系统性能越好,在大量用户访问系统时系统稳定性越好,能够提供持续服务。
(5)系统性能扩展性越好,越容易提升系统的处理能力,以适应更多的访问需求。
能意味着重大的销售损失或用户流失,保持系统系统性能对于软件系统的运营企业具有非常重要性能的的意义,系统下降可良好的系能对于提高用户体验、提升站点声誉、提升客户忠诚度、增加系统收入等都具有重要作用。
1.2.2并发用户数并发用户数指系统能够同时处理的用户请求的数目,也可以理解为同时向系统提交请求的用户数目。
平均并发用户数:指在系统正常访问量情况下的并发用户数。
最大并发用户数:指在峰值访问情况下的并发用户数。
(2)系统服务器资源利用率已经达到了上限,即服务器的CPU利用率、内存利用率等指标已经达到了需求规定的上限。
(3)系统请求成功率,即成功请求数/总请求数。
当系统压力过大时,某些用户请求就会执行失败,如果失败率过高,就说明系统已经达到了处理能力的上限,所以可以根据成功率来判断是否已经达到了最大并发用户数。
平均并发用户数仅反映了系统某个时刻的用户访问情况,并不反映系统的性能情况;而最大并发用户数反映了系统的处理能力,往往作为一项重要的性能指标在需求分析时进行定义。
系统吞吐量越大,说明系统性能越好。
衡量吞吐量的常用指标内包括:RPS:请求数/秒,描述系统每秒能够处理的最大请求数量。
PPS:页面数/秒,描述系统每秒能够现实的页面数量。
PV:页面数/天,描述系统每天总的PageView数量。
TPS:事务/秒,描述系统每秒能够处理的事务数量。
QPS:查询/秒,描述系统每秒能够处理的查询请求数量。
1.2.4服务器性能计数器服务器性能计数器指服务器或操作系统性能的一些数据指标,在性能测试中发挥着监控和分析的关键作用。
常用的操作系统性能计数器包括SystemLoad、进程与线程数、使用内存数、CPU使用率、磁盘I/O、网络I/O等。
所以在进行性能需求分析时,往往通过资源利用率指标来定义服务器性能要求。
2.2软件性能测试的目标目标分为4个方面:能力验证、缺陷发现、能力规划、性能优化1、能力验证分为3个层面:验证性能指标与需求的符合情况软件系统性能测试最主要的目标:验证软件性能是否符合软件需求文档中的性能指标要求,是否符合预定的设计目标。
2、缺陷发现缺陷发现性能测试的主要目的是:通过性能测试的手段来发现系统中存在的缺陷,并不需要验证性能指标是否满足需求的要求。
3、能力规划特点:1、规划能力是一种探索新的测试2、配置规划可用于了解系统的性能以及获得扩展性能的方法。
4、性能优化性能条有的前提:进行性能瓶颈定位特点:1、确定基准环境、基准负载和基准性能指标2、调整系统运行环境和实现方法、执行测试2.3常用性能测试方法定义说明性能测试名称基准测试通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某种性能指标进行定量的和可对比的测试。
主要目的是检查系统处于压力情况下应用的表现。
负载测试通过在被测系统中不断增加压力,直到达到性能指标极限要求。
主要目的是找到特定环境下系统处理能力的极限。
并发测试并发测试主要指当测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题,如内存泄露、线程锁、资源争用问题。
主要目的并非为了获得性能指标,而是为了发现并发引起的问题。
主要目的是验证系统运行的可靠性。
数据量测试通过让软件在不同数据量情况下运行,以检验系统性能在各种数据量情况下的表现。
主要目的是找到支持系统正常工作的数据量极限。
配置测试通过对被测系统的软/硬件环境的调整,了解各种不同环境对系统性能影响的程度,从而找到系统各项资源的最优分配原则。
主要目的是了解各种不同因素对系统性能影响的程度,从而判断出最值得进行的调优操作。
最好有专职的系统管理员担任这个角色支持较色(网络)网络方面的支持,协助测试工程师解决网络方面的问题,必要时为测试分析角色提供网络方面的分析支持网络方面的能力和技能,最好由专职的网络管理人员担任支持角色数据库方面的支持,必要时为测试网络方面的能力和技能,最好由专职(数据库)分析角色提供数据库方面的支持DBA担任支持角色(中间件)中间件平台方面的支持,在必要时为测试分析较色提供中间件方面的支持深入了解中间件产品的特点和配置方案,可以由专职的中间件专家担任第六章LoadRunner基础6.2LoadRunner功能结构6.2.1LoadRunner工具组成LoadRunner功能非常复杂,核心模块为VirtualUserGenerator、Controller、Analysis、LoadGenerator、Proxy五部分。
虚拟用户脚本生成器VirtualUserGenerator,简称VuGen,是用来录制虚拟用户脚本的工具支持大量的通信协议,支持自动化脚本录制和二次开发,为系统性能测试提供寻虚拟脚本支持。
负载生成器LoadGenerator,简称LG,负责将VuGen脚本复制成大量虚拟用户对系统生成负载,在性能测试中,用来模拟大量用户并发访问系统。
用户代理Proxy,是客户端和服务器的中介,负责协调不同负载机上的虚拟用户,产生步调一致的虚拟用户。
测试控制器Controller,负责对整个测试的过程进行设置,制定测试过程中的VU脚本、并发用户数、加压方式、执行周期、监控参数等,同时提供测试过程中的监控功能。
6.2.1LoadRunner工作原理controller是执行负载测试管理和监控的中心,在这里定制具体的性能测试方案,执行性能测试,收集测试数据,监控测试指标。
LG是虚拟多用户并发访问被测系统的组件,虚拟多用户并发访问系统的前提是已经具备了虚拟用户的脚本,Vugen是录制和编辑虚拟用户脚本的工具,录制好的脚本是不同语言表达的文本文件,在LG执行时,被解析和执行,脚本录制和回访是在Proxy支持下完成的。
Controller中的实时监控工具将测试过程中收集到的客户机、服务器和网络性能指标数据显示在监控页面上,便于测试人员对系统表现进行随时掌握。
Analysis在测试完成后,对测试过程中收集到的各种性能数据进行计算、汇总和处理,生成各种图标和报告,为系统性能测试结果分析提供支持。
6.3LR关键概念6.3.1虚拟用户虚拟用户(virtualuser,简称Vuser)指性能测试过程中执行VU脚本以模拟虚拟真实用户对系统访问的执行实体。
一台测试机上只能有一个真实用户执行系统功能,但在loadrunner中,可以运行多个Vuser,很方便模拟多用户对系统的并发访问。
6.3.2VU脚本VU脚本(script)记录了用户执行系统功能的操作过程,是Vuser执行的对象。
LoadRunner还可以通过参数化、关联等手段对VU脚本进行二次开发,提高脚本的灵活性。
6.3.3场景场景(scenario)是一次性能测试执行内容的定义,用来模拟虚拟用户是如何产生压力的。
场景中包含所有执行的脚本、虚拟用户、负载生成器、运行过程配置、实时监控五方面内容。
在定义场景时,包含手工场景和面向目标场景两种设置方式。
6.3.5检查点检查点(checkpoint)提供了一种结果正确性验证的机制,保证了测试工具对执行通过判断的准确性。
LoadRunner的VuGen组件允许插入文本检查点和图形检查点。
6.3.7集合点集合点(rendezvous)提供一种用户并发访问机制,用来模拟多用户对系统的并发访问。
在Vuser需要执行脚本中插入集合点,配置多个Vuser同时执行操作,当某个Vuser到达集合点时,将进行等待,知道参与该集合的全部Vuser都到达或者已经指定数量的Vuser到达后,同时释放Vuser,让它们同时开始下一任务的执行,从而模拟多用户并发访问系统。
第七章脚本的录制与开发课题背景:使用LoadRunner对系统进行并发负载测试时需要依赖虚拟用户脚本,虚拟用户脚本的录制需要基于相应的通信协议。
7.1.最常用的几种LoadRunner支持通信协议1.HTTP协议超文本传输协议(HTTP,H压迫而textTransferProtocol)是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过互联网传达万维网文档的数据传送协议。
一般在测试B/S架构应用系统时,需要选择这个协议。
2.FTP协议FTP是TCP/IP协议组中的协议之一,是英文FileTransferProtocol的缩写。
该协议是Internet文件传送的基础,它是由一系列规格说明文档组成,目标是提高文件的共享性,提高非直接使用远程计算机,使存储介质对用户透明和可靠高效的传送数据。
如果测试的系统是一个FTP服务器时,可以选择该协议进行脚本的录制。
3.Socket协议Socket通常也称为“套接字”,是一般网络软件的不同实体之间进行通信的一种协议。
我们选择协议时,只有在其他协议不合适,或实在不清楚选择何种协议时,才会选择Socket协议。
4.WebService协议WebService是一种面向服务体系架构的实现技术,提供了服务描述、发布、提供、管理等一些协议。
使用WSDL来描述系统,使用UDDI来发布、查找服务,使用SOAP来调用服务。
依据WebService规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
如果被测试功能是通过WebService方式提供,那么在录制脚本的时候可以选择WebService协议。
5.RTE协议RTE协议是对一些遗留系统进行测试时进行终端仿真时使用的协议。
终端仿真就是使用一个计算机终端模仿另一个计算机终端。
通常被模仿的终端是较早的型号,以便于用户最初写给该终端进行通信的程序了。
7.2通信协议的选择方法通过询问开发人员了解被测试系统所使用的协议,通常这是最简单也最直接的方法。
通过概要或详细设计手册获知所使用的协议。
通过协议分析工具捕包分析,然后确定被测试对象所使用的协议。
通过以往测试经验确定被测试对象所使用的协议,这种方法确定协议有一定的不确定性使用LoadRunner的协议分析功能,试着录制一下脚本,然后这个功能会自动帮助用户分析应该使用的协议,具有一定的可信度。
LoadRunner录制脚本1.基本录制流程2.录制选项录制启动设置创建录制结束在LoadRunner中有两种脚本录制模式:HTML-basedscript和URL-basedscript。
①.HTML-basedscript(基于HTML的脚本)录制模式指在脚本中采用HTML页面形式来表示,为每个用户操作生成单独的步骤,这种脚本更容易理解和维护,一般使用HTML录制模式。
②.URL-basedscript(基于URL的脚本)可以录下通过浏览器对服务器所作的所有请求和资源获取,它自动将每一步的HTTP资源录制为URL_steps(通过Web_url函数进行处理)。
URL-based方式录制的脚本不太直观,阅读不便。
3.选择录制方式的参考方案如果应用是Web应用,首先是HTML-based录制模式。
如果应用是使用HTTP协议的非Web应用,则首选URL_based录制模式。
如果Web应用中使用了Javaapplet程序,且applet程序与服务器之间存在通信,则选用URL-based录制模式。
7.4脚本开发知识1.在LoadRunner的脚本中,通常含有如下三种函数:(1)VuGen通用函数。
一般以lr开头。
不同类型的Vuser的函数一般以本协议类型开头。
HTTP的协议函数还包括web_list、web_link等。
lr_get_attrib_long:检索命令行中使用的long类型变量。
lr_get_attrib_string:检索命令行中使用的字符串。
(3)系统信息函数用来得到VuGen的系统信息Lr_user_data_point:记录用户定义的数据采集点。
Lr_get_host_name:返回执行Vuser脚本的主机名。
Lr_get_master_host_name:返回运行Controller的计算机名。
lr_save_int:把一个整数保存为参数。
lr_save_var:把字符串的一部分内容保存为参数。
(5)消息函数如:lr_output_message:将消息发送到输出窗口。
lr_message:将消息发送到Vuser日志和输出窗口。
lr_rendezvous:在Vuser脚本中设置集合点。
脚本注释LoadRunner提供了两种脚本注释方法:(1)单行注释“//”;(2).块注释。
文本检查点的两种形式:代码一:web_reg_find(“Text=”,LAST);代码二:web_reg_find(“Text=”,LAST);If()lr_output_message(“”);elselr_output_message(“”);(2)自动检查点按F4|ContentCheck或Run-timesettings|ContentCheck(3)图片检查点Web_image_check(“函数标题”,“ALT=图片说明”,“LAST”)检查点的设置技巧:检查点可以是常量,也可以是变量;检查点可以是文本、图像文件,也可以是数据库记录等。
2.事务设置(1).事务的开始函数是lr_start_transaction(),选择新事务起点,鼠标右键|Insert|startTransaction(2).事务的开始函数是lr_end_transaction(),选择新事务结束点,鼠标右键|Insert|EndTransaction(3).事务的状态LoadRunner_PASS事务是以PASS状态通过的,该事务做了正确的事情。
LoadRunner_FAIL事务是以FAIL状态通过的,该事务做失败的事情。
LoadRunner_AUTO事务的状态是由系统判断的,结果为PASS/FAIL/STOP。
3.参数化参数化包含以下两个任务:(1)在脚本中用参数取代常量值;(2)设置参数的属性以及数据源。
4.关联设置。
关联主要有手动关联和自动关联。
手动关联中,关联函数web_reg_save_param是一个注册型函数。
5.集合点设置集合点通过在脚本中插入lr_rendezvous()函数实现。