转载自:
性能测试是 web 应用系统的一项重要质量保证措施。在现实中,很多 web 性能测试项目由于性能测试需求定义不合理或不明确,导致性能测试项目不能达到预期目标或进度超期。本文针对 web 应用系统的技术架构和系统使用特点,探讨如何有效实施性能测试过程,并重点介绍如何分析获得合理的性能测试需求,最终对 web 应用系统性能进行科学、准确的评估。
基于web服务器的应用系统由于提供浏览器界面而无须安装,大大降低了系统部署和升级成本,得以普遍应用。目前,很多企业的核心业务系统均是web应用,但当web应用的数据量和访问用户量日益增加,系统不得不面临性能和可靠性方面的挑战。因此,无论是web应用系统的开发商或最终用户,都要求在上线前对系统进行性能,科学评价系统的性能,从而降低系统上线后的性能风险。
在很多性能测试项目中,由于不能合理定义系统的性能测试需求,不能建立和真实环境相符的负载模型,不能科学分析性能测试结果,导致性能测试项目持续时间很长或不能真正评价系统性能并提出性能改进措施。
本文在总结许多web应用系统性能测试实践经验和教训的基础上,从与性能测试工具无关的角度介绍web应用系统性能测试的方法和实施过程,以及如何定义合理的性能测试需求。
性能测试:通过模拟大量浏览器客户端同时访问web服务器,获得系统的性能数据。
虚拟用户:模拟浏览器向web服务器发送请求并接收响应的一个进程或线程。
响应时间:浏览器向web服务器提交一个请求到收到响应之间的间隔时间。
思考时间:浏览器在收到响应后到提交下一个请求之间的间隔时间。
请求成功率:web服务器正确处理的请求数量和接收到的请求数量的比。
吞吐量:单位时间内web服务器成功处理的http页面或http请求数量。
在线用户:用户通过浏览器访问登录web应用系统后,并不退出该应用系统。通常一个web应用服务器的在线用户对应web应用服务器的一个session。
并发用户数:web服务器在一段时间内为处理浏览器请求而建立的http连接数或生成的处理线程数。当所有在线用户发送http请求的思考时间为零时,web服务器的并发用户数等于在线用户数。
web应用系统的前端为浏览器,后台为web服务器(如apache,microsoft internet information server),浏览器和web服务器之间的交互基于http协议。http协议本身是无连接的,web服务器通过session机制来建立一个浏览器所发出的先后连接之间的关联。通过实验证明,当浏览器客户端在首次访问web服务器后,如果该浏览器客户端不发送后续请求,服务器维持该浏览器客户端的session变量所消耗的系统资源非常小。
标准的web应用系统性能测试过程包括确定性能测试需求,开发性能测试脚本,定义性能测试负载模型,执行性能测试和形成性能测试报告。本章将分别介绍上述过程,并通过举例说明如何完成每一环节。
科学定义web应用系统性能测试需求对一个成功的性能测试非常重要。通常,web应用系统的性能测试需求有如下两种描述方法。
2.1.1 基于在线用户的性能测试需求
该需求描述方法主要基于web应用系统的在线用户和响应时间来度量系统性能。当web应用系统在上线后所支持的在线用户数以及操作习惯(包括操作和请求之间的延迟)很容易获得,如企业的内部应用系统, 通常采用基于在线用户的方式来描述性能测试需求。以提供网上购物的web应用系统为例,基于在线用户的性能测试需求可描述为:10个在线用户按正常操作速度访问网上购物系统的下定单功能,下定单交易的成功率是100%,而且90%的下定单请求响应时间不大于8秒;当90%的请求响应时间不大于用户的最大容忍时间20秒时,系统能支持50个在线用户。
2.1.2 基于吞吐量的性能测试需求
该需求描述方法主要基于web应用系统的吞吐量和响应时间来度量系统性能。当web应用在上线后所支持的在线用户无法确定,如基于internet的网上购物系统,可通过每天下定单的业务量直接计算其吞吐量,从而采取基于吞吐量的方式来描述性能测试需求。以网上购物系统为例,基于吞吐量的性能测试需求可描述为:网上购物系统在每分钟内需处理10笔下定单操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。
在确定web应用系统性能测试需求后,就要根据性能测试需求中确定的功能开发性能测试脚本。比如,针对前面定义的网上购物系统的性能测试需求,将开发下定单功能的性能测试脚本。
性能测试脚本是描述单个浏览器向web服务器发送的http请求序列。每个性能测试工具(如ibm rational performance tester, loadrunner)所提供的测试脚本语法是不同的。测试人员利用性能测试工具可从头手工编写测试脚本,也可以通过录制浏览器和web服务器之间的网络通信数据而自动形成测试脚本。
任何性能测试工具都不能保证录制形成的性能测试脚本的正确性,测试人员应通过在单用户下运行性能测试脚本对其正确性进行验证。测试脚本不正确的一个重要原因就是脚本的数据关联不正确,也就是并没完全建立一个测试请求和前面的响应内容之间的关联。测试脚本http请求和响应之间的数据关联是否正确的一个重要标准是单用户运行脚本,脚本能完成期望的功能。
在完成性能测试脚本的数据关联后,需要对脚本进行参数化,也就是把脚本中的某些请求数据替换成变量,变量的值来于一个独立的数据文件,从而保证在多虚拟用户运行脚本的情况下,每个虚拟用户所提交的数据是不同的。
此外,为了测试web应用的可靠性,还需要对请求所收到的响应进行验证(比如验证响应的http返回码或验证响应的内容),便于性能测试完成后统计请求成功率。
性能测试负载模型定义了测试工具如何向web应用系统提交请求,包括向web应用系统发送请求的虚拟用户数,每个虚拟用户发送请求的速度和频率。针对前面介绍的网上购物系统的性能测试需求,在性能测试工具中定义的性能测试负载模型应包括如下信息:
虚拟用户数:性能测试不仅仅是执行一次,而且每次执行时虚拟用户数也不固定,因此在性能测试负载模型中定义的虚拟用户数将在测试执行时进行设置。
虚拟用户发送请求的思考时间和迭代次数:虚拟用户发送请求的思考时间长短是决定web应用系统负载量的重要因素之一,而迭代次数将决定性能测试的执行持续时间。对基于在线用户的性能测试需求,将基于录制脚本时记录的思考时间,而且由于现实中不同用户访问系统的思考时间不同,可把思考时间设置为在一定范围内的随机值。对于基于吞吐量的性能测试需求,将把思考时间设置为零,此时web应用系统的在线用户数量将等于并发用户数。同时,为了避免性能测试压力的随机性,将增加请求的迭代次数来增加测试执行持续时间,从而获得系统在稳定压力下的性能数据。
虚拟用户启动模式:在现实中,web应用系统的用户不太可能同时做相同的操作,因此为了让web应用系统所承担的压力随时间均匀分布,建议虚拟用户依次启动,同时也避免大量用户同时登录造成系统阻塞。以10个虚拟用户模拟下定单为例,可设置每个虚拟用户间隔30秒启动,这样10个虚拟用户可在5分钟后完成启动,并保证10个虚拟用户不会在同一时刻下定单,从而更符合实际情况。
执行性能测试是指通过多次运行性能测试负载模型,获得系统的性能数据。在执行过程中,需利用测试工具、操作系统、系统软件(如web server或db server)提供的资源监控手段对资源进行监控和分析,帮助发现资源瓶颈,并在系统层面进行优化。同时,还需对应用进行性能分析,帮助定位应用代码中的性能问题,切实解决系统的性能问题。
性能测试项目的最后阶段就是向相关人员提交性能测试报告,汇报性能测试结果。在向相关人员汇报性能测试结果时,并不是性能测试报告越丰富、性能数据越多越好。好的性能测试报告是能准确、简单地传递性能测试结论,而不需太多的技术细节。
针对基于在线用户数的性能测试需求,可通过下图总结性能测试结论。其中横轴是在线用户数,纵轴是响应时间,如40在线用户访问网上购物系统时,90%的下定单请求响应时间不超过10秒。
针对基于吞吐量的性能测试需求,可通过下图的曲线来描述性能测试结果。以网上购物系统为例,下图描述下定单的并发用户、下定单响应时间以及吞吐量(服务器每秒处理定单笔数)之间的关系,从而快速判断系统是否能满足性能测试需求。从下图中可看出,并发用户增加,请求的响应时间也增加。服务器的吞吐量是先随并发用户数增加而增加,当吞吐量到达一定峰值后,再增加并发用户数,吞吐量会减少。原因在于当并发用户数少时,向web服务器提交的请求量不大,服务器处理能力还有富余,所以吞吐量逐步增大;但当并发用户数超过某一值时,由于向服务器提交的请求太多,造成服务器阻塞,反而导致吞吐量减少。
前一章介绍了web应用系统的性能测试过程,确定性能测试需求是整个性能测试的起点和成功的重要因素。性能测试需求定义得过高,虽然确保系统上线后能满足性能需求,但可能会造成硬件资源的浪费;性能测试需求定义得过低,系统上线后可能会出现性能问题。如何通过分析系统上线后可能的用户访问行为,来获得合理的性能测试需求指标呢?
假设现有一个基于web的办公自动化系统(简称oa系统),该系统提供公文收发和查询功能。在部署该系统前,将对该系统进行性能测试。下面将详细介绍如何分析该oa系统的使用情况,定义合理的性能测试需求。
在线用户数量是指在特定时间区间内,有多少用户访问web应用系统(对应到web服务器的session数),根据系统可能访问用户数以及每个用户访问系统的时间长短来确定。
对于将要部署的oa系统,通过分析获得该系统有8000个注册用户,基本上所有的用户每天(8小时工作时间)都会访问oa系统,平均在线时间(从登录oa系统到退出oa系统之间的时间间隔,也可以是多次在线时间的合计)为12分钟,那么该oa系统的平均在线数(也就是web应用session变量数)为200个(8000 * 0.2 / 8),假设峰值在线用户数是平均在线用户数的3倍(该倍数可根据实际情况调整),则性能测试需求的在线用户数为600。
由于时间和资源限制,不可能对web应用系统的所有功能进行性能测试,而是从业务的角度(如某一功能操作的用户多)和技术的角度(如某一功能虽然访问用户不多,但内部处理逻辑复杂或处理数据量大)来选择web应用系统的特定功能作为性能测试用例。
以oa系统为例,由于所有用户都经常公文查询功能,因此确定的性能测试用例为公文查询。
响应时间的快慢直接影响了系统使用用户的满意度,采用平均响应时间来描述系统系统性能测试需求是不科学的,因为无法直接和客户的满意度挂钩。而且,在做性能测试,如果某一请求的响应时间过长或过短,将导致平均响应时间和实际情况偏离。
以oa系统为例,定义的响应时间需求为:90%(该百分比和要求的系统用户满意度相关)的查询请求响应时间不超过8秒(该时间可根据实际情况确定)。
单位时间内web应用系统需处理多少笔特定的交易可通过统计获得。以oa系统为例,假设每个用户每天(一天按8小时计算)平均会查询公文4次,那oa应用的web服务器平均每分钟要能处理8000 * 4 / ( 60 * 8 ) = 66.67笔查询公文交易,考虑到峰值因素,要求每分钟能处理66.7 * 3=200笔查询公文交易。
通过前面的分析,能明确定义合理的性能测试需求。oa系统性能测试需求定义如下:
基于在线用户数的性能测试需求:600个在线用户按正常操作速度访问oa系统的查询公文功能,所有查询请求的成功率是100%,而且90%的查询请求响应时间不大于8秒。
基于吞吐量的性能测试需求:oa系统在每分钟内需处理200笔查询公文操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。
web应用性能测试项目成功的关键不在于性能测试工具,而在于有效的性能测试分析方法和实践。只有切实掌握性能测试需求分析方法,性能测试实践经验,才能保证一个web应用性能测试的成功。