软件性能测试流程David_sheng编写目的本文档从性能工程的角度提出开展性能测试工作的流程,和进行性能测试工作的策略,下面我们讨论性能工程的需求阶段、设计阶段、实施阶段、产品部署阶段、维护阶段所要开展的工作,和相应要采取的策略。我现在调研的这个项目,一个内网网站,前台包括:新闻,公告,资料上传和下载,视频播放,留言,投票,专题活动,后台包括:用户管理,权限管理,布局设置,系统设置对于投票来说,会要求省和地市的用户在某个时间段进行投票。我想问用户的是:1)网站的在线访问人数估计有多少人,并发人数有多少人2)功能的系统响应时间可接受的范围3)系统支持的最大吞吐量是多少4)用户频繁使用的功能模块是什么5)用户一般习惯的场景操作有什么6)网站的高峰时段是何时?为什么进行性能测试?性能测试致力于减少应用程序、升级程序或修补程序部署中的风险。性能测试的核心原理是通过将生产时的工作量应用于部署系统来衡量系统性能和最终用户体验。构造严密的性能测试可回答如下问题:➤应用程序是否能够很快地响应用户的要求?➤应用程序是否能处理预期的用户负载并具有盈余能力?➤应用程序是否能处理业务所需的事务数量?➤在预期和非预期的用户负载下,应用程序是否稳定?➤是否能确保用户在真正使用软件时获得积极的体验?通过回答以上问题,性能测试可以量化改变业务指标所产生的影响。进而可以说明部署的风险。有效的性能测试过程将有助于您做出更明智的发布决策,并防止系统出现故障和解决可用性问题。性能测试流程性能测试通常由五个阶段组成:测试计划、脚本创建、场景定义、场景运行和结果分析。测试计划:定义性能测试要求,例如并发用户的数量、典型业务流程和所需响应时间。脚本创建:将最终用户活动捕获到Vuser自动脚本中。场景定义:使用LoadRunnerController设置性能测试环境。场景运行:通过LoadRunnerController驱动、管理和监控性能测试。结果分析:使用LoadRunnerAnalysis创建图和报告并评估性能。性能测试问题及对应人员性能测试需求的来源性能测试需求的来源有三个方面:需求文档设计文档与客户沟通确定性能测试需求的解决方法在没有需求文档和设计文档的情况下,我们需要对客户业务使用情况进行分析,提出我们所关注的性能测试需求,并告知业务人员。让业务人员来判断我们的性能需求是否能满足客户的真实要求。1、确定当前系统的业务使用状况:通过日志记录-客户端模块使用情况了解在某个时间段内,客户执行某个操作的具体情况。2、了解不同视角的用户性能:ⅰ)用户视角:响应时间:用户所能感受到的响应时间,也是用户最重视的性能体验。确立响应时间的原则:2/5/10原则2:2秒钟用户会觉得是一个很好的体验。5:5秒钟用户可能会觉得差了一点,还行,比较好。10:10秒钟是用户所能承受的最大极限。鉴于不同地区的网络环境,将用户所能承受的响应时间极限定为12~15秒。此部分需与业务人员讨论。稳定性:系统长时间运行不会出现错误的能力。验证方法:系统在满负载的运行8小时,系统是否会出现服务不可用,ConnectionRefusedHTTP404,500错误。ⅱ)系统视角:延迟,系统资源使用状况延迟:包括数据库延迟和网络延迟此部分需与DBA及系统部人员讨论。系统资源使用状况:服务器的CPU使用率是否长期高于80%,达到90%,100%的程度,整个磁盘的I/O是否达到极限。内存的使用数是否只剩下极少的几兆,几十兆。ⅲ)开发者视角:从代码实现和数据库实现来考虑性能。看看这两方面得到实现是否足够好。3、了解真正的性能测试需求方法:ⅰ)识别项目干系人:指的是和项目相关的人,开发人员,设计人员,需求人员,业务人员,上层领导,了解他们对性能测试的考虑。ⅱ)隐藏在“性能测试”之后的实际想法,比如:是因为开发人员对所完成的代码没有信心,又不愿意做修改,要求我们对其所作的程序进行性能测试,还是设计人员使用了一项新技术,心里没低,所要求作的性能测试,等等。确立性能测试目标1、以“需求”为本考虑系统需不需要作性能测试,性能测试的内容和范围。2、测试目标确定的经济性考虑ⅰ)投入到性能测试的人员是多少?ⅱ)具备可以确定性能测试需求,制定性能测试方案的人员是多少?可以执行性能测试的人员是多少?ⅲ)这些人员需要投入多长时间?ⅳ)所要开发系统的运行环境和设备,这些设备的配置对于性能测试的影响,比如说:tomcat4.1的应用服务器,它的配置文件缺省的jvm的使用空间是64M,一个机器的内存为1G,我们将jvm的使用空间设置为512M对性能测试的影响。ⅴ)内部的人员无法满足性能测试的要求,通过外聘,采用外聘的方式,公司所能承受的成本是多高。3、基于风险的测试目标确定ⅰ)系统如果不做性能测试,会有多大的风险,如果在性能指标上达不到用户的要求会有多大的风险。需要进行评估。ⅱ)如果做性能测试会有多大的风险,性能测试的投入会有多大,会有多大的风险需要进行评估。确定性能测试目标的方法我们要确定系统的吞吐量和并发用户数的设计目标可以采用以下三种方式:确定在某个特定时间端内,估计系统会有多少用户同时访问在某个特定的时间端内,正在访问系统的用户的典型操作是什么?哪个页面的访问量最大?在某个特定的时间端内,系统需要处理多少种用户场景这些数据可以在系统服务器的日志文件、TSP监视数据种找到,也可以通过监视数据库的活动情况来获得。不同阶段的性能测试目标设计阶段的性能测试目标设计阶段的性能测试目标为考察系统是否满足预期的性能要求。开发阶段的性能测试目标ⅰ)将开发阶段的性能测试目标作为对系统进行调优的参考:考虑在每个开发阶段,性能是否能够达到标准,考虑当前阶段的性能瓶颈,及其性能瓶颈出现的原因是在于数据库访问(SQL语句或者存储过程写的不够好)还是其他的原因。ⅱ)用性能测试手段发现系统存在的问题:通过模拟真实场景,发现在现场测试中可能存在的问题,比如说:用户数的突然增加,导致的应用程序崩溃,服务器崩溃的问题。产品部署阶段的性能测试目标提供部署方案的参考,确定合适的硬件设备,虽然更高的设备可以获取商业上的利益,但应考虑客户的具体情况。系统维护阶段的性能测试目标考察系统的可扩展性:从系统的视角考虑,在用户数扩大,在业务量增大的情况下,是一个怎样的表现。性能测试方案的确立在确立性能测试方案之前,需要作的工作1、确定测试目标和需求这里的灵活性比较大,与性能测试成败有很大的关系。2、了解现状ⅰ)业务使用状况通过日志记录,在某个时间段内,用户的操作。ⅱ)了解环境:包括网络条件,服务器条件,软硬件条件,应用服务器环境及各种配置信息。3、确定需要监控的指标:ⅰ)CPU使用率ⅱ)内存使用情况在此应优先监控应用服务器的性能指标。对于Tomcat或者Weblogic来说,监控他的JVM使用状况,连接池的连接数量,内存使用状况等信息。对于数据库来说监控cache的命中率,索引的使用状况,数据库的连接数。用例和场景设计用例和场景设计的步骤:1、对业务的分析和分解2、根据业务确定用例3、不同用例按照不同的发生比例组成场景4、了解每个场景的实际意义(对场景执行测试,收集结果)5、了解业务的分布情况,根据业务确定用例,在设计用例的时候,根据前期收集的数据,设计不同的场景来组成用例,并了解每个场景的实际意义,执行场景,收集结果数据。设定需要监控的资源设定需要监控的资源主要有一下几个方面:1、CPU利用率2、内存使用情况3、数据库监控4、JVM使用状况监控应优先监控应用服务器的性能指标。对于Tomcat或者Weblogic来说,监控他的JVM使用状况,连接池的连接数量,内存使用状况等信息。对于数据库来说,cache的命中率,索引的使用状况,数据库的连接数,具体的监控指标请性能测试工程师,根据性能需求确定。性能测试的应用领域系统性能测试的主要应用领域是验证能力、性能调优。1、验证能力包括ⅰ)验证新的系统,新的架构能否满足用户的需求。ⅱ)向用户提供性能测试报告,说明系统的性能达到了预期设计的标准。ⅲ)确定新平台的产品架构,假设以前用ASP,现在用.net,或者换到j2ee平台上,验证新系统架构是否满足性能要求,这个要求不是用户提出来的,也不是直接用户体验的,而是在架构设计过程中要确定的指标。2、性能调优在系统开发过程中,通过性能测试,了解当前系统瓶颈(比如说在于数据库访问,SQL语句或者存储过程写的不够好,或者说数据库设计的问题,索引做的不够好),所选择的应用服务器有问题,或者说代码这一层,业务逻辑实现的不够好,导致它性能的缺陷。以确定问题出现在应用层,数据库层,代码层。实施阶段将影响性能的因素按照以下顺序进行判断:1、网络状况2、硬件设备3、系统/应用服务器/数据库配置4、数据库设计和数据库访问实现(SQL)5、业务的程序实现但是在开发阶段做性能调优时关注的顺序:请更多的关注SQL一级和代码一级。若是对于一个实际在线上运行的系统,请直接按照以上5点的顺序。注:很多的性能问题,是由于应用服务器的配置完全不合理,比如:tomcat4.1的应用服务器,没有修改它的配置文件中缺省的jvm的使用空间。各阶段所要进行的性能测试设计阶段的性能测试在设计阶段的性能测试主要的目的是验证你的架构。验证的方式有两种:1、在对于系统架构有一个预期的性能目标的情况下,去验证当前架构能否满足预期的性能目标。2、系统架构是基于以前的架构修改过来的,对于两者进行一个对比测试,了解两种架构各有什么优势。实施阶段的性能测试在实施阶段进行性能测试的目的是为了阶段性的验证系统性能,进行性能调优,并通过系统调优发现系统缺陷。产品部署阶段的性能测试在产品部署阶段,将性能测试作为验收测试的一部分。维护阶段的性能测试在维护阶段——考察系统的可扩充性/定位系统缺陷,考察系统的可扩充性用来定位系统的缺陷。系统稳定性的度量为了验证系统的稳定性,我们需要对系统进行一个可靠性度量,在目前没有一个行业或者国际标准进行可靠性度量的前提下,我们又无法获得确切的用户需求(用户提不出系统稳定性的量化标准),我们可以采用如下方式来验证系统的稳定性。通过在做性能测试的过程中得到系统稳定性数据的方式来验证系统的稳定性手段:对一个系统进行一个长时间的运行,观察它的可用内存,cpu使用率有无显著的变化,如果在长时间使用的情况下,cpu,内存无显著变化,则可以认为系统具有稳定性。性能测试的基本概念1、响应时间:客户端从发送请求的那一刻起到收到应用程序响应的最后一个字节时止而不得不等待的时间长度。2、点击数:对每一个对象的请求,比如说:一个页面有五个部分组成,一个框架,四张图片,这样算做5个点击数。3、页面请求:请求了一个页面,不管这个页面包括了多少对象。4、吞吐量:i)按照流量来计算的吞吐量,用来衡量网络状况或者应用服务器的处理能力,在指定的时间内,每秒钟字节的出入.ii)用点击数来衡量吞吐量,每个固定的时间段内有多少点击数,用于银行系统。5、并发用户:从业务上的并发:200人同时在线。从服务器上的并发:200人同时向服务器发出请求。200人同时做一个提交的操作,服务器接受到多少请求。6、资源利用率:cpu利用率,内存利用率,磁盘I/O状况等在性能测试中需要注意的问题1、环境设计的问题2、其他需要注意的地方环境设计的问题1、网络环境2、软硬件环境3、环境的维护方案4、时间同步问题5、“镜像”环境时间同步问题:各种服务器部署在不同的机器上,在进行性能测试分析响应时间的时候就需要进行时间同步,通过日志来对比时间,但日志上记录的是本地时间,让日志记录的时间有可比性,需要做时间同步。同步的方法:在UNIX操作系统上用NTP协议可以做时间同步,在windows系统上可以通过加入域来时间同步,