第二,中间件的设置和优化
这里的中间件是广义的中间件,是应用程序调用的第三方软件,包括操作系统、数据库、Web服务器、消息服务器等。我们不能改变中间件的程序,只能通过调优手段来提高它所支持的软件系统的性能。
第三,硬件的配置
这里包括服务器硬件配置和网络环境。服务器硬件包括内存、CPU等,网络环境有交换机、路由器等。
1.2 软件性能测试
在上一节中,我们知道软件系统的性能问题多种多样,这给用户带来巨大的风险,那么我们如何能够在软件系统上线之前,找出软件中潜在的性能问题呢?目前软件性能测试是发现软件性能问题最有效的手段,而完备有效的性能测试是最关键的,在本节中我们将从流程和技术的角度解析如何构建一个高效的性能测试模型。
1.2.1 性能测试在软件测试的周期位置
首先,软件性能测试属于软件测试范畴,存在于软件测试的生命周期中。一个软件的生产过程通常遵循V型图,如图1-3所示。
图1-3 软件开发-测试V型图
在通常的软件生产周期中,先由用户提出用户需求或经系统分析核定以后提出系统需求,开发人员再经过需求分析提出软件需求规格说明,进行概要设计,提出概要设计说明,进行详细设计,提出详细设计说明,最后就是对每个模块进行编码。到测试阶段,测试按照开发过程逐阶段进行验证并分步实施,体现了从局部到整体、从低层到高层逐层验证系统的思想。对应软件开发过程,软件测试步骤分为代码审查、单元测试、集成测试、系统测试。
而性能测试就属于软件系统级测试,其最终目的是验证用户的性能需求是否达到,在这个目标下,性能测试还常常用来做:
(1)识别系统瓶颈和产生瓶颈的原因;
(2)最优化和调整平台的配置(包括硬件和软件)来达到最高的性能;
(3)判断一个新的模块是否对整个系统的性能有影响。
瓶颈本来是指玻璃瓶中直径较小并影响流水速度的一段,用它来比喻软件系统中出现性能问题的节点是很形象的,比如一个典型的分布式系统架构如图1-4所示。
图1-4 软件系统压力流动图
如果把软件系统看做是交通系统,那么网络就是一条条大道,客户端、防火墙、负载均衡器、Web服务器、应用服务器(中间件)、数据库等各个系统节点就是交通要塞,客户的请求和数据就像在道路上行驶的车辆,如果在某处发生堵车,那么整个交通系统都会不畅。在这个时候,我们就要分析是哪里出了问题,是道路不够宽,还是某处立交桥设计不合理而引起堵塞等。找到问题的关键点,那么此关键点就是本系统的瓶颈。软件系统也是如此,我们做性能测试的大部分工作都是为了寻找这个瓶颈到底在何处。
需要注意的是,软件的性能瓶颈可能不止一处。
作为软件测试的一种,软件测试的规则同样适用于性能测试中:
(1)确定预期输出是测试必不可少的一部分
如果事先无法肯定预期的测试结果,往往会把看起来似是而非的东西当作正确结果。必须提倡用事先精确对应的输入和输出结果来详细检查所有的输出。对于性能测试来说,预期输出就是用户的性能需求,一份明确的性能需求是成功性能测试的先决条件。
(2)必须彻底检查每一个测试结果
事实上,在最终发现的错误,有相当一部分在前面的测试中已经暴露出来了,然而由于人们未能细心检查先前的测试结果而遗漏了。
一段程序中存在的错误概率与在这段程序中发现的错误数呈正比。
这是pareto原则应用于软件测试,也包括性能测试,即性能测试发现的错误中的80%很可能集中在20%的程序模块中。
(3)穷举测试是不可能的
在性能测试中不可能覆盖每一个功能部分,这也意味着有性能问题的模块可能被忽略掉,这样的话,我们在设计性能测试案例时,应该采取一些策略和技巧,使用尽可能少的性能测试用例,发现尽可能多的bug。这方面内容我们将在本书的第10章中介绍。