正如食品生产厂家在把产品销售给商家之前要进行合格检验一样,软件企业在把软件提交给客户之前也需要进行严格的测试。如果把所开发出来的软件看作一个企业生产出的产品,那么软件测试就相当于该企业的质量检测部分。简单地说,在编写完一段代码之后,检查其是否如自己所预期的那样运行,这个活动就可以看作是一种软件测试工作。
软件测试的定义
了解到软件测试的研究可以追溯20世纪60年代,至今已有50多年的发展历史,但对于什么是软件测试,还一直未能达成共识。根据侧重点的不同,主要有以下三种观点:
- IEEE在1983年将软件测试定义为“使用人工或自动化手段运行或测定某个系统的过程,其目的在于检测它是否满足规定的需求或是弄清预期结果与实际结果之间的差别”,该定义明确地提出了软件测试以检验是否满足需求为目标。
- Myers则认为软件测试“是为了发现错误而执行程序的过程”,明确提出了“寻找错误”是测试目的。
- 从软件质量保证的角度看,软件测试是一种重要的测试质量保证活动,其动机是通过一些经济、高效的方法,捕捉软件中的错误,从而达到保证软件内在质量的目的。
上述三种观点实际上是从不同的角度理解测试,是将测试置于不同的环境下得出的结论。事实上,在公开出版的刊物中,有多种不同的关于软件测试的定义,根据这些定义可以认为软件测试是一个在可控的环境中执行软件的过程,目的就是为了验证软件是否按照预期运行。测试过程中的活动既包括“分析”软件,也包括“运行”软件。常常把与分析软件开发中的各种产品相关的测试活动称为静态测试(static testing)。静态测试包括代码审查、走查和桌面检查。相比之下,把与运行软件有关的测试活动叫做动态测试(dynamic testing)。因此,不能简单地认为软件测试就是程序测试,只有在程序编码结束后才能够进行的工作;而是一项贯穿于整个软件开发过程的工作。测试对象既包括源程序,也包括需求规格说明、概要设计说明、详细设计说明。因此,也有人认为软件测试(software testing)就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。测试包括寻找缺陷,但不包括跟踪漏洞及其修复。测试的重要性在于,它必须保证所开发的软件达到设计时的需求,免除由于软件自身的“缺陷”带来的“漏洞”,最大限度地降低软件开发的成本。
软件测试有两个基本职责:即验证和确认。Schulmeyer和Mackenziee(2000)对验证和确认所做的定义是: - 验证(verification),保证开发过程中某一具体阶段的产品与该阶段和前一阶段的需求一致。
- 确认(validation),保证最终得到的产品满足系统需求。
有时,初学者常常会混淆软件测试和调试。其实二者是不同的,表现在以下几方面:
(1)调试是一个分析和定位软件bug的过程。可以认为它是一种支持测试,但不能完全代替测试的活动。
(2)调试的目的是为了使软件能够正确运行,而测试的目的是为了发现软件中存在的错误。
(3)调试的对象主要是源代码,而测试的对象则是软件开发过程中各个阶段所产生的所有产品。
软件测试生命周期
测试生命周期(software testing life cycle)的模型。把测试的生命周期分为几个阶段。前三个阶段就是引入程序错误阶段,也就是开发过程中的需求规格说明、设计、编码阶段,此时极易引入错误或导致开发过程中其他阶段产生错误。然后就是通过测试发现错误的阶段,这需要通过使用一些适当测试技术和方法来共同完成。后三个阶段就是清除程序错误的阶段,其主要任务就是进行缺陷分类、缺陷隔离和解决缺陷。其中在修复旧缺陷的时候很可能引进新的错误,导致原来能够正确执行的程序出现新的缺陷。
在软件测试生命周期的每个阶段都要完成一些确定的任务,在执行每个阶段的任务时,可以采用行之有效的结构分析设计技术和适当的辅助工具;在结束每个阶段的任务时都进行严格的技术审查和管理复审。最后提交最终软件配置的一个或几个成分(文档或程序)。