性能测试从零开始第1章软件性能测试当今,计算机和软件工程发展越来越快,新的概念名词和技术手段层出不穷,可谓日新月异。在软件性能测试范畴内就有很多,诸如并发测试、压力测试、基准测试、测试场景等概念和名词,这让刚接触性能测试的新手眼花缭乱,目不暇接。但我们如果能深入软件性能测试的本质,从哲学的角度看问题,找出其内在联系,比如因果关系、形式内容关系,甚至重叠关系等,理清思路之后,那么做软件性能测试就会如庖丁解牛,游刃有余。1.1什么是软件的性能1.1.1软件计算机软件作为人类逻辑智慧的结晶,它可以模拟并替代人类的一些活动,替人“发号施令”。在计算机软件发展的短短几十年内,计算机软件以非常快的速度渗透到了人类社会的各个角落,比如现在我们在家上网,出门坐公交车刷卡,在工作中发电子邮件等,这些生活的背后都有大量的软件系统运行支持。同时,有关软件的概念和名词也呈爆炸性增长,从google中搜索“软件”关键词,就有135000000条记录;软件的方向和领域也在不断细化,比如软件架构和平台、软件工程、软件应用,还有软件开发测试等,因此我们可以判断软件的发展趋势是系统化、复杂化,这个趋势使软件能够提供越来越强大的功能,但同时也为我们理解和把握软件带来困难。但我们做事的原则应该是要把复杂的事情变简单,而不是更复杂,更难理解。当我们试图理解和分析一个复杂的事物的时候,最常用的方法是分而治之,就是要用一个或多个简单的概念去解释或描述这个复杂的事物,这符合我们人类的认知规律,人们对简单的概念能够理解,那么对简单进行综合和归纳,就形成了对复杂的认知。比如,我们想要让一个没有上过网的人明白什么是“电子邮件”,那就可以告诉他“通过网络发送的邮件”,当然他很有可能对“网络”也一头雾水,那么你可以继续向他解释“打鱼的网”。但在软件领域中,我们却经常搞不明白这个道理,一个刚入门有志于软件性能测试的菜鸟小心翼翼地向一个前辈高人请教什么是性能测试,前辈首先以威严的口气告诉他“性能测试是很复杂的”,然后徐徐道来“性能测试分为负载测试、压力测试、容量测试等”。到这里,我相信可怜的菜同学对性能测试已经更加糊涂了,他在请教问题之前,恐怕还能知道性能测试是测试软件性能的,在得到高手回答之后,他开始勤奋地请教google,没想到google回答他的是更多的名词概念(网上文章都是前辈仙人写的)。随着时间推移,菜同学升级成牛同学,他对性能测试名词概念烂熟于心(google功底深厚),并且牛同学又牢牢坚持与时俱进的思想,独立创新了N个性能测试概念,并开始向一群小菜粉丝们讲经布道,于是上一幕的画面和对白又开始回放,只是演员变了……这只是一个假想的故事,故事的结局就是通过“学习”,性能测试不仅没有简单,反而越来越复杂了。我们要真正掌握性能测试,那就要避免这样的事情发生,从本质上认识软件性能和软件性能测试。辩证唯物主义哲学认为,时间和空间是运动着的世间万物的存在形式。大到社会形态,小到个人的活动,都是在一定的空间和时间内进行的。因此,我们在试图把一件事情表述清楚时,通常要抓住事情的几个关键要素:时间、空间(地点)、人物(主体)、事件。比如“旅行者的一次长途旅行在两个月内从北京到西藏”,这句话中包含了关键要素,其时间是两个月,空间是北京到西藏,人物是旅行者,发生的事件是旅行者在两个月时间范围内发生空间中的转移;又如“一场足球赛”,这个名词看起来简单,但仍清楚地隐含了三个要素,即:时间,通常是90分钟(如果没有加时赛和伤停补时);空间,足球场内;人物,足球运动员,事件就是在足球规则下可能发生的事情,如进球等。计算机的出现是人类历史上一次伟大的革命,在哲学“物质”这个名词的外延中又多了一个新型事物——计算机软件。如果我们认识到计算机软件也是万物之一,分析其作为“物质”的性质也逃脱不了自然法则的“紧箍咒”,那么我们同样可以把软件作如下简单的理解:主体:程序,是人类逻辑思维的物化,表现形式为一系列指令代码。时间:即使计算机速度再快,任何软件程序每一段代码的运行都是需要时间的,例如从用户的感受来讲,就是程序将运行结果响应给用户的速度。空间:软件运行的环境,以资源的方式存在,通常是软件以间接或直接的方式占用并使用硬件资源和其他软件资源。硬件资源主要指运行该软件的硬件平台,有CPU、内存和存储系统等,如果软件是基于网络架构的,那么硬件还有网络硬件,如交换机、路由器等。软件资源包括操作系统、开发平台、中间件和数据库等,它们以库文件和API的方式提供给应用软件使用。事件:软件按照用户的要求运行,运行的同时必然要占用时间资源和空间资源。由于软件代码是人的逻辑思想的表现,所以软件在设计思想和实现方法上也有很大差异。另外,随着软件的发展,产生了各种应用领域的软件,它们之间存在着千丝万缕的关系。从层次上看,有系统软件,应用软件和介于两者之间的中间件。因此一个软件的运行牵涉的因素很多,需要从各个方面分析。1.1.2软件性能的产生用户能够看到的是软件越来越通用,功能越来越庞大,从哲学角度上看待软件本身,其发展是一个从简单到复杂,从低级到高级,从无序到有序的过程。在计算机发展的初期,计算机软件对硬件有很强的依赖性,而且还没有广泛的通用性,只有少数的个人或机构才使用软件这个“奢侈品”,当时用户也没有软件性能的概念,通常为了实现软件的功能而不计一切代价。比如,1946年2月15日,世界上第一台通用电子数字计算机“埃尼阿克”(ENIAC)在美国研制成功。它当时由1.8万个电子管组成,是一台又大又笨重的机器,体重达30多吨,占地有两三间教室般大。它当时的运算速度仅为每秒5000次加法运算,在现在看来,它占用如此多的资源,又运行得如此慢,在当时却是相当了不起的成就,因为它已经实现了功能——能够做加法运算。可见初期的软件是简单的,当时用户的要求用现在的眼光来看真有点可怜巴巴,对软件的要求不高,只要能工作就OK了。软件诞生后,短短几十年,软件业奇迹般的高速发展,逐渐走下了高高在上的神坛,广泛应用到人类社会的各个领域,用户也不再把软件看做神秘的玩意,而是普通的商品,开始从经济学的角度来考虑软件产品,这是一个意味深长的变化。讲经济就是要运用投入产出的关系分析和指导软件工程的各种活动和环节,软件运行不能以硬件不计成本为假设,要尽可能地少占用各种硬件资源,同时,软件运行的速度也要尽可能地快,每秒5000次加法运算是根本不可想象的,也是不可能被用户接受的。这些其实就是用户的最原始的性能需求。1.1.3功能与性能的关系首先,软件的性能和功能的源头都是来自于用户的需求。功能指的是在一般条件下软件系统能够为用户做什么,能够满足用户什么样的需求。拿一个电子邮件系统来讲,用户期望这个软件系统能够提供收发电子邮件、保存草稿、设置偏好等功能,只有这些功能实现了,用户才认为这是他想要的软件。但是随着软件市场竞争的激烈,软件技术的日益提高,系统能不能工作已经是一个最起码的门槛,能够“又好又快”才会得到用户的青睐,而性能则是衡量软件系统“好快”的一个重要考虑因素。“好”就是要为用户省钱,用最小的硬件成本运行软件系统;“快”就是软件响应时间要短,我们的用户都是急性子,最好一秒钟也不要等。简单地说,性能就是在空间和时间资源有限的条件下,软件系统还能不能工作。如果把上面邮件的功能和性能需求量化,写成用户需求说明书可能是下面这个样子:功能:邮件系统能够支持收发以30种语言为标题和正文的邮件,并支持粘贴10MB的邮件附件。性能:邮件系统能够在2GBRAM/1GHzCPU的服务器上,支持10000注册用户,日均处理10000邮件,响应时间不超过5秒/封。我们来对比一下功能需求说明和性能需求说明,发现两者有一些不同之处:(1)功能需求中名词和动词多,描述软件主体和动作行为,比如“标题”、“正文”、“收发”、“粘贴”等;(2)性能需求中对涉及容量和时间词汇多,如“2GBRAM服务器”、“1000注册用户”、“5秒/封”等。相信我们的读者已经从上面的对比看出功能和性能的区别了,软件性能和功能区别的实质是,软件功能焦点在于软件“做什么”,关注软件物质“主体”发生的“事件”;而软件性能则关注于软件物质“做得如何”,这是综合“空间”和“时间”考虑的方案(资源和速度),表现为软件对“空间”和“时间”的敏感度。认识到性能的这个基本特征对于性能测试人员非常重要,因为在下面的章节中我们将要通过多个“空间”和“时间”的组合,来揭开性能指标的实质和提高的办法。另外,我们也要认清一个事实,软件的性能实现是建立在功能实现的基础之上的。这就像一个人首先要能跑,这是一个健康的人的正常功能,然后才能参加百米比赛,这就如对人身体的性能考验。而百米比赛隐含了两个要素:一个是运动员有一个一百米的运动空间;另一个是比赛,要跑得足够快,要在短时间内跑完。因此我们说百米比赛其实就是一个空间和时间的综合结果。“空间”和“时间”是一个哲学中抽象层次较高的概念,在不同的应用范围有不同的诠释。那么在软件理论和实践中,我们怎样理解“空间”和“时间”呢?所谓“仁者见仁,智者见智”,下面我们就分别从用户的角度和软件人员的角度来看一下软件的性能。1.1.4用户眼里的软件性能软件系统在满足用户强大的功能需求同时,架构和实现上也变得复杂,软件系统经过单机系统时代、客户机服务器系统时代,到现在跨广域网的庞大分布式系统时代,这样的例子在金融、电信系统中随处可见。系统的业务量大了,就要使用更多的时间和空间资源,在一般情况下不能出现的软件性能问题就暴露出来了,这些问题“不鸣则已,一鸣惊人”,轻则让软件对外不能正常提供服务,重则可能会导致系统的崩溃甚至数据的丢失,这都会给用户带来无法估量的损失。案例1某西部大型油田使用钻井平台数据采集系统,在上线之前已经通过功能测试,但软件系统上线之后,在使用采集的电子数据勘探油层时,总是不能准确地找到油口,导致数百万元的损失。经过研究试验,发现软件从平台采集的数据和手工采集的数据有很大出入,性能测试后,找到根本原因:由于采集过程中产生的数据量非常大,导致软件系统在采集过程中线程死掉,丢失部分数据,最终产生的是一个错误的采集结果,为工程人员提供了错误的判断依据。案例2日本第三大手机运营商——软银移动2006年10月遇到了麻烦,本指望通过降低手机资费来吸引用户,谁想大量用户蜂拥而至却导致自己的电脑系统陷入瘫痪,软银移动在10月29日不得不宣布暂停接纳新的用户,直接损失逾亿日元。用户当然不想看到以上的场景发生在自己的软件系统上,“瘫痪”意味着响应时间过长,不能为客户正常提供服务;数据丢失则是一个不可接受的严重问题,损失几乎不可弥补。因此用户对软件性能的要求日益细化严格,可以说是“与时俱进”。简单地说,在软件发展的初级阶段,“又要马儿跑,又要马儿少吃草”,这是当时很多用户对软件系统提出的性能要求,“跑”有关时间,“草”有关空间。马儿跑,就是软件系统给用户的响应要快,处理时间要短;马儿少吃草就是软件系统能够尽可能地少占用和消耗资源,诸如内存、CPU等。因此,测试人员在做性能测试时,往往要把响应时间、内存利用率、I/O占用率等写在最后测试报告里,因为这是用户最关心的东西。随着用户的软件质量意识的增强,用户对软件的性能需求也越来越多,越来越细致。这时不仅要让马儿跑,还要马儿能快能慢(软件系统的伸缩性),“路遥知马力”(软件系统在长时间运行下的稳定性)等。细数起来,如下:计算性能;资源的利用和回收;启动时间;伸缩性;稳定性。计算性能——就是马儿要能跑,要有很快的速度,最好是“日行千里,夜行八百”。对软件系统来讲,计算性能是用户最关心的一个指标,即软件系统有多快。比如,用户会关注软件系统执行一个典型的业务需要花多少时间。我们要给出用户答案,我们的系统完成用户典型操作,比如业务的交易计算,数据的增、删、改、查时间是不是在用户可以接受的范围内。资源的利用和回收——就是马儿少吃草。软件系统的“草料”就是其依存的硬件和软件资源,硬件资源包括客户端硬件、服务器硬件和网络硬件;软件资源包括操作系统、中间件和数据库等。其中要特别说的是