第1章 软件性能测试
当今,计算机和软件工程发展越来越快,新的概念名词和技术手段层出不穷,可谓日新月异。在软件性能测试范畴内就有很多,诸如并发测试、压力测试、基准测试、测试场景等概念和名词,这让刚接触性能测试的新手眼花缭乱,目不暇接。但我们如果能深入软件性能测试的本质,从哲学的角度看问题,找出其内在联系,比如因果关系、形式内容关系,甚至重叠关系等,理清思路之后,那么做软件性能测试就会如庖丁解牛,游刃有余。
1.1 什么是软件的性能
1.1.1 软件
计算机软件作为人类逻辑智慧的结晶,它可以模拟并替代人类的一些活动,替人“发号施令”。在计算机软件发展的短短几十年内,计算机软件以非常快的速度渗透到了人类社会的各个角落,比如现在我们在家上网,出门坐公交车刷卡,在工作中发电子邮件等,这些生活的背后都有大量的软件系统运行支持。
同时,有关软件的概念和名词也呈爆炸性增长,从google中搜索“软件”关键词,就有135 000 000条记录;软件的方向和领域也在不断细化,比如软件架构和平台、软件工程、软件应用,还有软件开发测试等,因此我们可以判断软件的发展趋势是系统化、复杂化,这个趋势使软件能够提供越来越强大的功能,但同时也为我们理解和把握软件带来困难。
但我们做事的原则应该是要把复杂的事情变简单,而不是更复杂,更难理解。当我们试图理解和分析一个复杂的事物的时候,最常用的方法是分而治之,就是要用一个或多个简单的概念去解释或描述这个复杂的事物,这符合我们人类的认知规律,人们对简单的概念能够理解,那么对简单进行综合和归纳,就形成了对复杂的认知。比如,我们想要让一个没有上过网的人明白什么是“电子邮件”,那就可以告诉他“通过网络发送的邮件”,当然他很有可能对“网络”也一头雾水,那么你可以继续向他解释“打鱼的网”。但在软件领域中,我们却经常搞不明白这个道理,一个刚入门有志于软件性能测试的菜鸟小心翼翼地向一个前辈高人请教什么是性能测试,前辈首先以威严的口气告诉他“性能测试是很复杂的”,然后徐徐道来“性能测试分为负载测试、压力测试、容量测试等”。到这里,我相信可怜的菜同学对性能测试已经更加糊涂了,他在请教问题之前,恐怕还能知道性能测试是测试软件性能的,在得到高手回答之后,他开始勤奋地请教google,没想到google回答他的是更多的名词概念(网上文章都是前辈仙人写的)。随着时间推移,菜同学升级成牛同学,他对性能测试名词概念烂熟于心(google功底深厚),并且牛同学又牢牢坚持与时俱进的思想,独立创新了N个性能测试概念,并开始向一群小菜粉丝们讲经布道,于是上一幕的画面和对白又开始回放,只是演员变了……这只是一个假想的故事,故事的结局就是通过“学习”,性能测试不仅没有简单,反而越来越复杂了。我们要真正掌握性能测试,那就要避免这样的事情发生,从本质上认识软件性能和软件性能测试。
辩证唯物主义哲学认为,时间和空间是运动着的世间万物的存在形式。大到社会形态,小到个人的活动,都是在一定的空间和时间内进行的。
因此,我们在试图把一件事情表述清楚时,通常要抓住事情的几个关键要素:时间、空间(地点)、人物(主体)、事件。比如“旅行者的一次长途旅行在两个月内从北京到西藏”,这句话中包含了关键要素,其时间是两个月,空间是北京到西藏,人物是旅行者,发生的事件是旅行者在两个月时间范围内发生空间中的转移;又如“一场足球赛”,这个名词看起来简单,但仍清楚地隐含了三个要素,即:时间,通常是90分钟(如果没有加时赛和伤停补时);空间,足球场内;人物,足球运动员,事件就是在足球规则下可能发生的事情,如进球等。
计算机的出现是人类历史上一次伟大的革命,在哲学“物质”这个名词的外延中又多了一个新型事物——计算机软件。如果我们认识到计算机软件也是万物之一,分析其作为“物质”的性质也逃脱不了自然法则的“紧箍咒”,那么我们同样可以把软件作如下简单的理解:
主体:程序,是人类逻辑思维的物化,表现形式为一系列指令代码。
时间:即使计算机速度再快,任何软件程序每一段代码的运行都是需要时间的,例如从用户的感受来讲,就是程序将运行结果响应给用户的速度。
空间:软件运行的环境,以资源的方式存在,通常是软件以间接或直接的方式占用并使用硬件资源和其他软件资源。
硬件资源主要指运行该软件的硬件平台,有CPU、内存和存储系统等,如果软件是基于网络架构的,那么硬件还有网络硬件,如交换机、路由器等。
软件资源包括操作系统、开发平台、中间件和数据库等,它们以库文件和API的方式提供给应用软件使用。
事件:软件按照用户的要求运行,运行的同时必然要占用时间资源和空间资源。
由于软件代码是人的逻辑思想的表现,所以软件在设计思想和实现方法上也有很大差异。另外,随着软件的发展,产生了各种应用领域的软件,它们之间存在着千丝万缕的关系。从层次上看,有系统软件,应用软件和介于两者之间的中间件。因此一个软件的运行牵涉的因素很多,需要从各个方面分析。
1.1.2 软件性能的产生
用户能够看到的是软件越来越通用,功能越来越庞大,从哲学角度上看待软件本身,其发展是一个从简单到复杂,从低级到高级,从无序到有序的过程。
在计算机发展的初期,计算机软件对硬件有很强的依赖性,而且还没有广泛的通用性,只有少数的个人或机构才使用软件这个“奢侈品”,当时用户也没有软件性能的概念,通常为了实现软件的功能而不计一切代价。比如,1946年2月15日,世界上第一台通用电子数字计算机“埃尼阿克”(ENIAC)在美国研制成功。它当时由1.8万个电子管组成,是一台又大又笨重的机器,体重达30多吨,占地有两三间教室般大。它当时的运算速度仅为每秒5000次加法运算,在现在看来,它占用如此多的资源,又运行得如此慢,在当时却是相当了不起的成就,因为它已经实现了功能——能够做加法运算。可见初期的软件是简单的,当时用户的要求用现在的眼光来看真有点可怜巴巴,对软件的要求不高,只要能工作就OK了。