软件性能测试解析与优化
2011-10-09孟祥丰
孟祥丰
(渭南师范学院 陕西 渭南 714000)
软件性能测试,作为软件工程的一部分,随着软件生产的产业化运作应运而生,是软件生产的一个动态监控过程,对软件开发全过程进行检测,可以随时发现问题、报告问题,并重新评估新的风险,设置新的监控基准,并持续下去。软件测试是软件质量控制的过程,是对软件系统中潜在的各种风险进行评估的活动,其目的是监测和排除缺陷,以确保软件产品在可用性、功能性、可操作性等多方面满足质量需求。目前,软件测试已经由被动的以监测和发现错误为目的发展到从软件质量控制(Software Quality Control,SQC)开始转移到软件质量保证(Software Quality Assurance,SQA),使软件测试从单纯的缺陷检测和发现覆盖到整个软件开发过程,避免了软件开发过程中由于软件需求和设计等方面的缺陷所带来的巨大风险。一个典型的软件过程可以分为测试需求分析、测试设计、测试执行、缺陷和配置管理过程等许多个不同的阶段。在软件测试技术方面已经被细化为单元测试、集成测试、系统测试、用户验收测试等不同的测试技术。而在对软件产品质量呼声日高的今天,软件性能测试技术尤为重要。
1 性能测试的目的
性能测试的目的不仅是发现软件缺陷,还可能包括以下几个方面:
1)验证能力 这是性能测试中最简单也是最常用的一个应用领域,典型的能力验证问题会采用这样的描述方式:“***系统能够在***条件下具有***能力?”。通常情况下,企业在进行项目验收阶段要求能力验证型的性能测试或者委托第三方软件测试机构开展独立的性能验证,其主要特点是在已确定的生产环境中实际使用被测系统,即这套系统能不能承受大量的并发用户同时访问?
2)规划能力 这与1)有较大的不同,以规划能力为目的的性能测试关注的是“应该如何才能使系统具有要求的性能能力?”或者“系统能否支持未来一段时间内的用户增长?”。因此,这种性能测试强调对系统当前性能的评估,通过评估可以在应用实际部署之前,预见系统负载压力的承受能力。
3)调优性能 性能调优是以第一种或第二种为目的的性能测试实施后提供原始数据进而分析系统瓶颈和优化为目的,因此3)常与其他的性能测试活动交杂在一起。该类性能测试需要在确定的基准环境下,采用基准负载,关注基准性能指标后,调整系统运行环境和实现方法,执行测试,记录测试结果进行分析,再调整、执行、分析,不断往复,直到系统性能达到要求为止。比如:用户提出业务操作响应时间长,如何定位问题,调整性能?
2 性能测试过程
现以Loadrunner为例,说明性能测试的一般步骤:
1)确定用户要测试的业务。也就是通过需求分析,确定测试的目的和测试的性能指标(响应时间,并发用户数,吞吐量和资源利用率等)。
2)通过用户对软件的操作和Vugen的录制功能记录并生成虚拟用户脚本。
3)修改脚本,确定脚本能够回放成功。
4)在Controller中根据需求配置测试场景。包括虚拟用户数、运行参数、用户增长方式、测试循环方式、用户退出方式和需要监视的性能指标等。
5)执行测试场景。Controller控制Load Generator对被测系统的加压方式和行为,同时搜集被测系统各个环节的性能数据。Load Generator记录最终用户响应时间和脚本执行日志,并将数据传送到Controller中,由其进行结果的汇总。
6)借助Analysis分析测试数据,设计调优方案。
7)进行调优测试,重复测试过程,直至符合系统性能测试的要求。
性能测试的一般流程如图1所示。
图1 软件性能测试流程图Fig.1 Processing diagram of software performance testing
3 测试方案的制定和执行
3.1 测试方案设计
在软件性能测试的初始阶段,首先应对业务模型和系统架构进行调研,收集测试需求,然后生成性能测试计划。业务调研和系统调研,需要性能测试团队提前了解被测试项目的业务功能和系统架构。其间,开发部门应协助提供被测系统相关的文档和说明,如系统总体介绍、系统规格书、用户使用手册、网络拓扑结构图和系统配置说明、关键服务器及应用部署与配置等文档。通过和业务部门协商明确本次测试针对哪些业务行为,制定此次测试的目标,细化测试的关注点和性能指标要求。通过以上内容制定详细的测试方案,并制定详细测试计划和各阶段目标。软件性能测试的方法可以根据测试目的的不同,选择不同的方法,具体如表1所示。
表1 测试目的与测试内容的对应关系Tab.1 The purpose of testing and testing items’correspondence
3.2 测试环境准备
测试环境准备分为环境搭建和数据准备。
环境搭建包括被测试系统的硬件环境建立和软件应用系统建立及基础数据环境建立。只有在充分认识测试对象的基础上,才知道每一种测试对象需要什么样的配置,才有可能配置一种相对公平、合理的测试环境(这在性能对比测压中尤其重要)。考虑到其它因素,如网络锁、网速、显示分辩率、数据库权限、容量等对测试结果的影响。如条件允许,我们最好能配置几组不同的测试环境。同时必须保障被测试系统的业务可用性和功能的正确性,包括测试系统(如被测试项目的操作系统、中间件、数据库、压力测试控制台、压力测试发起工具等)的环境搭建、软件的安装;测试环境的网络环境建立(如开放防火墙和网关等);最后进行测试环境可用性验证。测试环境应该在架构上一致,测试用机的单元因子也必须和生产环境一致。
测试数据准备包括测试应用系统基础数据准备,即需要按性能测试规模要求,准备足够的、一定规模的基础数据,通常采用全量恢复生产数据的方式以达到和生产环境数据一致性的要求。在所有的测试中,测试数据的收集工作都是较为困难的,GIS软件更是如此,每一种软件都有它的文件格式,有的软件还有几种格式。在这种情况下,只能把第3方格式的数据转换成每一种被测试软件自已的格式。同时,还应对数据作一定的处理,如处理数据冗余,处理显示风格等。如在测试时会更新数据,操作前一定要备份数据。其外,还应评估数据格式和数据量对测试的影响,如有必要,应准备多组数据。最后,一定要检查测试数据的有效性,避免损坏数据对测试结果的影响。测试数据的抽取,即按测试用例要求,严格按其数据约束条件,定义数据抽取策略和方法(如按数据类型事先写好SQL)。测试数据准软件测试技术应用,即按其抽取原则,从基础数据中提取符合要求的测试数据,作为测试程序(脚本)参数化数据。
3.3 确定监视指标
测试中需要对服务器相应的性能计数器进行监视,其监视结果既是性能测试指标的一部分,又可以用于结果分析,协助确定引起性能问题的原因。主要监视服务器端操作系统相关的计数器、应用服务器相关的计数器、数据库相关的计数器等。
3.4 测试执行
测试前期的准备工作纷繁复杂,做好测试准备工作,已是完成了测试工作的一大半,但要产生一份具有说服力的测试报告,还应正确把握测试的强度,保持测试的一致性,提高测试的精度。判断软件的好坏,要看软件解决实际应用的能力,只有在一定的测试强度下,才能测试出各种软件资源的消耗率,软件运行的速度,软件的稳定性。通过对比在不同的测试强度下,不同软件每一个功能模块解决实际问题的能力和软件运行的效率,我们才可能判断出不同软件的每一个模块的强弱,甚至于整个软件的优劣。性能测试开始后,所有参数的输入都应遵循统一的标准,无论是哪一个环节,哪怕是一点点偏差,都应立即纠正,绝不能心存侥幸。要特别注意外部环境对测试结果的影响,如果在整个测试过程中,外部境不一致,如网速、机器内存使用率不一样,就有可能导致测试结果与实际情况有出入。
测试执行阶段可以划分为两个子阶段,前一个阶段的目的非常清楚,就是发现缺陷,督促大家就是找出缺陷。测试用例的执行,应该是帮助我们更快地发现缺陷,而不是成为“发现缺陷”的障碍——使发现缺陷的能力降低。从理论上说,如果缺陷都找出来了,质量也就有保证了。所以在这一阶段,要不顾风险,就是发现缺陷,这样不仅对开发团队也非常有利,能尽早地修正大部分缺陷;对测试有利,测试效率高,后面的回归测试也会稳定,信心更充分。 在代码冻结或产品发布前的稍后的子阶段,目的是减少风险,增加测试的覆盖度,这时测试的效率会低一些,以损失部分测试效率以极大降低风险、获得更高质量的收益。
4 测试报告和分析
性能测试报告和结果分析是在测试执行完成以后,对性能数据进行采集结果收集工作和针对性能测试过程中暴露的问题进行分析的阶段。性能测试报告是对性能测试过程中的监控结果以及报表进行汇总,按照一定的模板整理出的一份结论性文档。开发团队和性能测试团队应依据对性能测试实施过程中监控和记录的数据和表格,分析系统中存在的性能问题和程序缺陷。首先,最好从所有的测试数据中,筛选出具有代表意义的数据,做出统计图,然后和开发人员一起,认真分析数据,找出软件存在的问题,得出测试结论。其次,要针对在报告中阐述问题,分析其中的原因,提出解决或优化方案。
5 结束语
以上对软件性能测试方法和过程进行了简单的分析和研究,但这只是其中冰山一角,总的说来,对软件的性能测试有许多方法和尝试,其中技巧和方法因软件本身性质和复杂程度而有所不同,并没有什么固定的模式和方法。各种软件性能测试,范围大小不同,强度高底有别,但只要本着认真、客观,科学的工作态度,遵循本文论述的方法,做好测试工作是不难的。本篇文章主要谈的是软件性能测试方面的问题,相信对其它方面的测试也有一定的借鉴作用。
[1]朱少民.全程软件测试[M].北京:电子工业出版社,2007.
[2]韩庆良.软件性能测试过程研究与应用[D].济南:山东大学,2007.
[3]段念.软件性能测试过程详解与案例剖析[M].北京:清华大学出版社,2006.
[4]刘慧梅,徐华宇.软件测试中代码分析与插装技术研究[J].计算机工程,2007,33(1):86-88.
LIU Hui-mei;XU Hua-yu.Research on code analysis and instrumentation in software testing[J].Computer Engineering,2007,33(1):86-88.
[5]李军锋,任世鹏.软件可靠性及其测试分析[J].软件导刊,2010,9(8):46-48.
LI Jun-feng,REN Shi-peng.Analysis on software reliability and its testing[J].Software Guide,2010,9(8):46-48.
[6]方海光.我国教育软件价值评测研究[D].成都:中国科学院研究生院(成都计算机应用研究所),2006.
[7]陈绍英,夏海涛,金成姬.Web性能测试实战[M].北京:电子工业出版社,2006.