软件测试(第2版)
上QQ阅读APP看书,第一时间看更新

1.4 软件测试

1.4.1 软件测试的概念

1. 软件测试的定义

什么是软件测试?简单地说,软件测试就是为了发现错误而执行程序的过程。软件测试是一个找错的过程,测试只能找出程序中的错误,而不能证明程序无错。软件测试要求以较少的用例、时间和人力找出软件中潜在的各种错误和缺陷,以确保软件的质量。

在IEEE所提出的软件工程标准术语中,软件测试被定义为:“使用人工或自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。”软件测试是与软件质量密切联系在一起的,软件测试归根结底是为了保证软件质量。通常软件质量是以“满足需求”为基本衡量标准,IEEE提出的软件测试定义明确提出了软件测试以检验是否满足需求为目标。

软件测试在软件生命周期中占据重要的地位,在传统的瀑布过程模型中,软件测试仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近年来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶段中都应包含测试。由于软件工程采用的生存周期方法把软件开发划分成若干阶段,这样就对中间产品提供了检验的依据,各阶段完成的软件文档成为检验软件质量的主要对象。显然,表现在程序中的错误,并不一定是编码所引起的,很可能是详细设计、概要设计阶段,甚至是需求分析阶段的问题引起的。因此,即使针对源程序进行测试,所发现的问题的根源可能在开发前期的各个阶段,解决问题、纠正错误也必须追溯到前期的工作。正是如此,测试工作应该着眼于整个软件生命周期,特别是着眼于编码以前各个开发阶段的工作来保证软件的质量。也就是说,测试应该从软件生命周期的第一个阶段开始,并贯穿于整个的软件生命周期,从而检验各阶段的成果是否接近预期的目标,尽可能早地发现错误并加以修正。如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。美国软件质量安全中心在2000年对美国100家知名的软件厂商进行统计,得出这样一个结论:软件缺陷在开发前期发现比在开发后期发现,在资金、人力上节约90%;软件缺陷在推向市场前发现比在推出后发现,在资金、人力上节约90%。所以说软件测试并非传统意义上产品交付前单一的“找错”过程,而是贯穿于软件生产过程的始终,是一个科学的质量控制过程。从一个软件项目的需求分析、概要设计、详细设计以及程序编码等各个阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应该是软件测试的对象,在软件生产整个过程都需要有软件测试工程师的介入。

软件测试的基本要求体现在两个方面,首先是软件产品内容上的正确性和完整性,其次就是软件生命周期中各个阶段在逻辑上的协调性和一致性以及最终的软件内部结构的一致性。在软件生命周期各个开发阶段的主要测试活动如表1.1所示。

表1.1 软件生命周期中的主要测试活动

000

表1.1中的测试过程包含在软件生命周期的每个阶段中。在需求阶段,重点要确认需求定义是否符合用户的需要;在设计和编码阶段,重点要确定设计和编码是否符合需求定义;在测试和安装阶段,重点是审查系统执行是否符合系统规格说明;在维护阶段,要重新测试系统,以确定更改的部分和没更改的部分是否都正常工作。

2. 软件测试的目的

软件测试的目的是为了保证软件产品的最终质量,在软件开发的过程中,对软件产品进行质量控制。测试可以达到很多目的,但最重要的是可以衡量正在开发的软件的质量。

测试是为了证明程序有错,而不能保证程序没有错误。事实上,在软件运行期间测试活动从未间断,只是在软件产品交付给用户之后,将由用户继续扮演测试的角色而已。Glen Myers在关于软件测试的优秀著作《The Art of Software Testing》中陈述了一系列可以服务于测试目标的规则,这些规则也是被广泛接受的,主要有以下3点。

• 测试是一个程序的执行过程,其目的在于发现错误。

• 一个好的测试用例很可能会发现至今尚未察觉的错误。

• 一个成功的测试是发现至今尚未察觉的错误的测试。

软件测试是以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患所带来的商业风险。软件是由人来完成的,所有由人做的工作都不会是完美无缺的。软件开发是一个很复杂的过程,期间很容易产生错误。尽管软件从业人员、专家和学者付出了很多努力,但软件错误仍然存在。因此大家也得到了一种共识:软件中残存着错误,这是软件的一种属性,是无法改变的。所以通常说软件测试的目的就是为了发现尽可能多的缺陷,并期望通过改错来把缺陷统统消灭,提高软件的质量。

同时,测试不仅仅是为了发现软件缺陷和错误,也是为了对软件质量进行度量和评估,以提高软件的质量。软件测试是以评价一个程序或者系统属性为目标的活动,以验证软件满足用户的需求的程度,为用户选择与接受软件提供有力的依据。

此外,通过分析错误产生的原因还可以帮助发现当前开发工作所采用的软件过程的缺陷,以便进行软件过程改进。同时,通过对测试结果进行分析整理,还可以修正软件开发规则,并为软件可靠性分析提供依据。