第13回 负载、性能测试和容量测试的关系和区别 <script type="text/javascript"></script><script class="blogstory"></script>
对于软件应用系统,仅仅从功能上满足用户的需求是不够的,还需要从性能、可用性等方面更好地满足客户的需要。
尤其对于实时软件系统、嵌入式系统和在线服务系统,这方面要求更高些。这就要求我们要做好系统的压力测试、性能测试、容量测试,以保证系统能提供良好的高性能、高可用性,让客户满意。
1.强度测试或压力测试
强度或压力测试是在一种需要异常数量、频率或资源的方式下,执行可重复的负载测试,以检查程序对异常情况的抵抗能力,找出性能瓶颈。异常情况,主要指那些峰值、极限值、大量数据的长时间处理等,包括:
- 连接或模拟了最大(实际或实际允许)数量的客户机;
- 所有客户机在长时间内执行相同的、性能可能最不稳定的重要业务功能;
- 已达到最大的数据库大小,而且同时执行多个查询或报表事务
- 当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;
- 运行可能导致虚存操作系统崩溃或大量数据对磁盘进行存取操作的测试用例等。
压力测试可以分为稳定性测试和破坏性测试:
- 稳定性压力测试。在选定的压力值下,持续运行24小时以上的测试。通过压力测试,可以考察各项性能指标是否在指定范围内,有无内存泄漏、有无功能性故障等。
- 破坏性压力测试。在压力稳定性测试中可能会出现一些问题,如系统性能明显降低,但很难暴露出其真实的原因。通过破坏性不断加压的手段,往往能快速造成系统的崩溃或让问题明显的暴露出来。
在压力测试中,会给程序加上一些跟踪机制(如log、日志等),然后查看监视系统、服务器等性能的日志文件是必要的,找出问题出现的关键时间或检查测试运行参数,通过分析问题或参数从而有目的地调整测试策略或测试环境,使压力测试结果真实地反映出软件的性能。
2.性能测试
系统的性能指标,一般赢在产品需求文档中有明确定义,有三种形式描述软件系统的性能指标:
- 给出产品性能的主要指标,如在100000记录中查询一个特定数据的时间为0.5秒。
- 以某个已发布的版本为基线,如比上一个版本的性能提高30-50%。
- 和竞争对手的同类产品比较。
性能测试,根据其目的分为:
- 产品性能质量测试,通过测试,决定产品是否达到产品规格书所要求的性能指标(非功能性需求)
- 基准值测试,通过对当前产品的性能测试,确定产品具体的性能指标,建立性能指标基准。基准值,作为后继产品发布的性能参考(在新版本中,性能指标要求只升不降)或和竞争对手产品比较的参考。
- 性能规划测试,通过不断的测试,确定所需要的硬件配置(内存、CPU、网络等)、软件配置,以满足实现定义的性能指标要求。这种测试,对于软件系统的部署是非常有意义的。同时,也可以进一步了解硬件参数、软件参数对系统性能的影响程度,从而保证系统具有很好的扩充性或事先制定较好的系统增容的计划。
性能测试的方法,主要有:
- 稳定压力加载,一次性将负载加到某个水平,持续一段时间,也称为flat测试。
- 逐渐加载或交替加载到某个负载水平,也称为“ramp-up”测试。
- 峰谷测试,确定从系统高峰时间的负载转为几乎空闲、再攀升到高负载这样峰值交替情况下的系统性能状态/指标。这种测试兼有容量测试的特点或属于容量测试的一部分。
性能测试,一般都通过测试工具来模拟人为的操作而进行。性能测试的重点在于测试环境的建立、前期数据的设计与后期数据的分析。因为性能测试需要获得一定特定条件下(如100、200、500、1000个实时的连接)的系统占用资源(CPU、内存等)数据或系统行为表现,而且还要依靠测试工具或软件系统记录下这些指标变化的数据结果。例如,如果对一个Browser/Server结构的网络实时在线的培训系统软件进行测试,系统性能焦点是在不同数量的并发连接下,服务器的CPU、内存的占用率、客户端的响应时间等,如表1所示。
第16回 不容忽视的安装或部署测试
安装测试是指按照软件产品安装手册或相应的文档,在一个和用户使用该产品完全一样的环境中或相当于用户使用环境中,进行一步一步的操作完成安装的过程所进行的测试。
安装测试可以分为
- 全新安装,待安装的软件包是完整的,包含了所有的文件。
- 升级版本安装,部分文件构成的软件包。
- 补丁式安装,很小的改动或很少文件的更新,软件版本不变
- 系统运行环境改变,性能调优,只改参数,没有软件文件的变化。
- 客户端软件安装
- 服务器安装
- 整个网络系统安装
- 环境的不同设置或配置:强调用户的使用环境,考虑各种环境的因素的影响,如一个完全崭新的、非常干净的操作系统或应用系统之上去进行某个产品的安装,或者是考虑各种硬件借口的要求。
- 安装文档的准确性。进行安装测试时,必须一步一步地完全按照文档去做(如拷贝文档指令,粘贴到系统安装相应地方),不能下意识地使用已有的经验去纠正安装不对的地方。
- 安装的媒体制作是否有问题,包括最后制做时可能会丢了一个文件,或感染上计算机病毒等。
安装测试有时容易被忽略,如果没做好,其损失依然很大,如必须换回全部安装盘、或重印安装手册、或加重技术支持负担,所以安装测试也是重要的一个测试阶段。
软件部署逻辑、物理设计完成后,必须通过验证才能进入实施阶段。部署设计的验证首先是在实验室环境中进行,也就是和软件的系统测试结合起来做,包括性能测试、安装测试等,这被称为软件部署的试验性系统验证。实验室环境还不是真正产品运行的环境,部署设计的进一步验证需要在实际的运行环境中进行,这就是原型系统的验证。Beta测试,将系统(试用版)有限地部署给选定的一组用户,以确定其能否满足业务要求,所以可以被看作原型系统验证的一部分。
软件部署的试验性系统和原型系统验证完成之后,实际也宣告了软件部署的实施结束。软件部署的验证和实施的过程一般包括以下步骤:
- 开发试验性系统 (构建网络和硬件基础结构、安装和配置相关的软件)
- 根据测试计划/设计执行安装测试、功能测试、性能测试和负载测试
- 测试通过,开始规划原型系统
- 完成原型系统的网络构建、软硬件的安装和配置
- 数据备份或做好可以恢复(Roll-back)的准备
- 将数据从现有应用程序迁移到当前解决方案
- 根据培训规划,培训部署的管理员和用户
- 完成所有的部署
部署测试的进一步说明
试验性部署测试和原型部署测试的目的是,在测试条件下尽可能确定部署是否既能满足系统要求,又可实现业务目标。理想情况下,功能性测试可以模拟各种部署方案以完成所需要执行的测试用例,并且定义相应的质量标准来衡量其符合性。负载测试衡量在峰值负载下的测量性能,通常使用一系列模拟环境和负载发生器来衡量数据吞吐量和性能。对于没有明确定义、缺乏原始数据积累的全新系统,功能性测试和负载测试尤其重要。
通过测试能够发现部署设计规范存在的问题,可能需要返回先前的部署设计阶段,重新设计或修正设计,再进行试验性部署测试,直至没有问题,才向原型系统展开部署。测试原型部署时,也可能会发现部署设计中存在问题,同样需要返回先前的部署设计阶段。如果发生这种情况,其代价相当大,并严重影响产品发布的时间表。所以,软件部署设计的评审是非常重要的,应避免任何严重设计的问题被忽视。这样,试验性部署测试和原型部署测试所发现的问题,就可以通过软硬件的配置调整就可以解决,如增加内存、参数修改等。
实际运行系统的部署,通常分阶段进行,有助于隔离、确定和解决服务可能在实际运行环境中遇到的问题,特别是对会影响大量用户的大型部署具有尤其重要的意义。分阶段部署可以先向一小部分用户部署,然后逐步扩大用户范围,直至将其部署给所有用户。分阶段部署也可这样进行:先部署一定类型的服务,然后逐步引入其余类型的服务。所以,软件实际运行系统的部署过程被分为两个重要阶段LA ( Limited Available)和GA ( General Available)。由于测试永远不可能完全模拟生产环境,并且已部署解决方案的性质会发生演进和改变,因此应继续监视部署的系统,以确定是否有需要调整、维护或修补的部分。