我最近在项目中兼任项目测试组长角色,这次项目中负责性能测试的QA组长调走了,只好由我硬着头皮顶上去。在这段日子里,使我对性能测试有了新的认识,性能测试绝不象大多数人认为的是一件简单的事情。目前,性能测试已跨越了单靠手工敲敲键盘、点点鼠标就可以完成的阶段,正朝着自动化和智能化方向发展。 性能测试的重要性随着网络发展更凸显重要性,由于网络环境、数据库环境、应用服务器环境、系统平台和技术等的复杂性和多样性,难以预知的用户负载和愈来愈复杂的应用程序使软件性能非常难于控制。虽然,改善系统性能不是单单依靠性能测试就能完成的,但性能测试至今仍是控制性能有效的手段。 什么是性能测试 性能测试主要是通过自动化的测试工具模拟多种正常、峰值及异常负载来对系统的各项性能指标进行测试。一般来说,性能测试可概括为三个方面:在客户端性能的测试、在网络上性能的测试和在服务器端性能的测试。通常情况下,三方面有效的结合可以达到对系统性能全面的分析和瓶颈的预测。 性能测试的基本策略是自动负载和压力测试。通过在一台或几台PC机上模拟成百上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、服务器峰值数据、数据库状态等。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。 (1)并发性能测试 并发性能测试是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统出现瓶颈或者不能接收更多负载,通过综合分析执行指标和资源监控指标来确定系统并发性能的过程。例如当负载压力逐渐增加时,通过检测系统的相应输出如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。 并发性能测试一般不采用手工方式,而是利用工具采用自动化方式进行。在测试时常常需要模拟真实环境测试,以考察在真实环境中的表现,这样测试出来的数据才有实际意义。目前,成熟的并发性能测试工具有很多,选择的依据主要是测试需求和性能价格比。 (2)疲劳强度测试 疲劳测试是采用系统稳定运行情况下能够支持的最大并发用户数,持续执行业务一段时间,通过综合分析执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。 疲劳强度测试可以采用工具自动化的方式进行测试,也可以手工编写程序测试,其中后者占的比例较大。一般情况是以服务器能够正常稳定响应请求的最大并发用户数进行一定时间的疲劳测试,获取执行指标数据和系统资源监控数据。如出现错误导致测试不能成功执行,则及时调整测试指标,例如降低用户数、缩短测试周期等。还有一种情况的疲劳测试是对当前系统性能的评估,用系统正常业务情况下并发用户数为基础,进行一定时间的疲劳测试。 (3)大数据量测试 大数据量测试可以分为两种类型:一是针对某些系统存储、传输、统计、查询等业务进行大数据量的独立数据量测试;二是与压力性能测试、负载性能测试、疲劳性能测试相结合的综合数据量测试方案。大数据量测试的关键是测试数据的准备,可以依靠工具准备测试数据。 进行性能测试的前提条件 在任何性能测试活动开始前,软件应用程序必须达到性能测试接受标准。如果应用程序没有达到这些标准,则不应该进行性能测试,否则就是浪费时间和成本。进行性能测试的前提条件包括: (1)已通过单元测试能力 在性能测试前所有应用程序必须先通过全面的单元测试策略,同时所附带的可被执行的单元测试代码应是完整和有效的。如果单元测试因为应用程序中的错误或缺少单元测试代码,那么应用程序则不应该进行性能测试。 (2)已通过低负载级别能力 在单用户和10个用户的低负载级别上,应用程序应该能在正常的计算时间达到合理的性能。如果应用程序无法在低负载级别正常运行,那么它肯定无法在更高负载级别正常运行。这时,开始性能测试将会浪费时间。 (3)已准备好测试数据 在性能测试期间执行应用程序所需的数据必须先准备好或已详细描述,以使性能测试小组能够建立与生产环境尽可能接近的模拟数据,要确保测试数据必须是真实、一致和完整的,任何与真实环境相差太远的测试数据都是无用的性能测试行为。 常见的性能测试误区 (1)没有设置好性能测试期望 在性能测试开始前没有从几个不同的角度设置期望,以确保测试结果是有价值的,这是最常见的性能测试误区。这些期望包括测试小组需要定义合理的输入和输出性能期望,如果没有提前设置,那么很难判断被测试的应用程序的性能是否合格。 (2)性能测试环境失真 显然,测试环境应尽可能地与生产环境相似,因为任何差异都将引入不确定性。因此,性能测试环境应在每个细节(从服务器防火墙和后端资源的数量到网络电缆的规格)上完全模仿生产环境。 理想的性能测试环境应该由专用的服务器机器与连接它们的专用网络组成,非专用服务器环境可能会产生许多的问题。例如共享的网络资源和内部网共享性能环境,这些都可能造成性能测试结果的失真,这与测试时网络的利用率直接有关。因此,如果基于应用程序的服务器也作为其他无关的应用程序或配置的服务器在运行,那么进行性能测试将是失真的。 另一方面,性能测试环境的客户机端对性能测试结果也有重大影响。负载测试客户机机器应被完全专用于负载测试任务,客户机机器也应保持在网络配置上并尽可能地接近专用的环境,例如类似竞争本地CPU、内存和磁盘资源的其他应用程序不应共享这些机器,这些对本地资源的竞争也会影响被测量的响应可靠性。 (3)性能测试没有与功能测试相结合 众所周知,功能测试可以发现性能问题,性能测试也能发现功能问题。因此,性能测试和功能测试应是紧密联系在一起的,原因之一是很多性能问题是由软件自身功能缺陷引起的。如果应用系统功能不完善或者代码运行效率低下,通常会带来一些性能问题。所以,功能测试要先于性能测试执行或者同步相结合进行,软件功能完善可以保证性能测试进行得更加顺利。 性能测试的步骤 每种不同的应用系统的开发,开发人员可能选择不同的实现方式。因此,根据测试项目的不同,所选用的度量和评估方法也有不同。不过仍然有一些通用的步骤帮助我们完成一个性能测试项目,步骤如下: (1)明确性能测试的目标和需求 一般来说,一个性能测试计划的第一步是确定客户需求和期望,并根据实际业务需求确定系统需求。只有清楚了解各方面的需求,才能明确测试的范围,才能选择适当的测试方法。 性能测试需求的来源一般是软件需求、设计文档或用户备忘录等设计和需求相关的文档。当然,并非所有的性能测试需求都在这些文档中以明确的方式标识出来,此时就需要根据不十分明确的文档描述进行进一步的细化。在条件允许的情况下,还可以包括开发工程师和客户代表,辅助对性能测试需求进行分析和确认。 (2)确定测试计划和测试基准 如果不进行合理的规划,性能测试将会是一项令人望而生畏且有些混乱的任务。性能测试计划是用来指导性能测试过程的主要文档,在测试计划中除了要写明本次测试的测试目标、测试需求外,还需要在测试计划中给出明确的测试通过条件,测试时间和资源计划。 在制定测试计划时,应该使用测试基准来确定应用程序中是否出现性能倒退。基准测试可以在一个相对短的时间内收集可重复的结果。性能测试基准的来源主要是用户对各项指标提出的明确需求;如果用户没有提出性能指标则根据用户需求、测试设计人员的经验来设计各项测试指标。任何测试的目的都是确保软件符合预先规定的目标和要求,性能测试也不例外,所以必须制定一套标准的测试基准。 (3)设计测试场景和设计测试用例 这是性能测试的主要内容。性能测试的测试设计一般基于测试场景(Test Scenario),一个测试场景就是一个用户的实际使用系统的剖面。在性能测试过程中,明确每个场景的参与者人数、比例和具体行为是非常重要的,这些都是构成性能测试脚本的基础。 因此,测试场景的提取需要测试设计人员对用户的行为和业务有较为深入的了解。明确了性能测试场景之后,可根据不同的应用领域设计各种测试用例来达到性能测试目标。最后需要注意的是,性能测试设计还应该包括测试环境、测试数据等的设计,因为影响系统性能的因素很多,保持测试过程中环境和数据的可控性是非常重要的。 (4)测试工具的选择和使用 性能测试是一项复杂的工作,一个性能测试项目的质量如何,测试人员的素质、能力和经验是最关键的因素。要保证性能测试项目的高质量,必须依赖两个重要的因素:人和工具。“工欲善其事,必先利其器”,拥有一套熟悉,功能全面、质量可靠的性能测试工具对于从事性能测试的人员非常有帮助。 性能测试是通过工具模拟大量用户操作,对系统增加负载和压力。例如通过产生模拟真实业务的负载对被测系统进行加压,研究被测系统在不同负载压力情况下的表现,找出其潜在的瓶颈。因此,一个良好的性能测试工具必需能做到以下几点:提供产生压力的手段,能够对后台系统进行监控,对压力数据能够进行分析,快速找出被测系统的瓶颈。 例如,一组性能测试运行完毕后,我们会得到详尽的数据。这些数据的量非常大,靠人工去分析这些数据几乎是不可能的,性能测试工具能提供数据分析,帮助性能测试人员去阅读、解读和分析数据,辅助测试人员定位系统的瓶颈。因此,选择一款合适的性能测试工具并培训一支高素质的工具使用队伍无疑是至关重要的。 (5)性能测试结果分析 这是性能测试过程中最困难,也是最重要的步骤。它需要分析人员在运行性能测试后,收集相关信息,进行数据统计分析,通过排除误差和其他因素,让测试结果体现接近真实情况,以找到性能瓶颈。
|