从计算机问世以来,软件的编制与测试就同时摆在人们的面前。早在*"世纪&"年代,英国著名的计算机科学家图灵就给出了软件测试的原始定义。他认为,测试是程序正确性证明的一种极端实验形式。早期测试主要针对机器语言和汇编语言,设计特定的测试用例,运行被测程
序,将所得结果与预期结果进行比较,从而判断程序的正确性。测试用例一般在随机选取的基础上,吸取测试者的经验或是凭直觉判断出某些重点测试区域。但测试在
软件开发中的作用并没有受到应有的重视。测试方法和理论研究进展缓慢,除去一些非常关键的程序系统外,一般程序
的测试大都是不完备的。在开发工作结束后,含有大大小小缺陷的程序投入运行了。这些隐藏的缺陷一旦暴露出来就会给用户和维护者带来不同程度的严重后果。早年火星探测运载火箭因控制程序中错写了一个逗号而爆炸,对空防御系统曾把月亮当做洲际导弹的目标来轰击,都已成为人们谈论测试时的笑
测试工作未受到重视的另一个原因是人们的心理因素。从软件系统开发者的角度,研制工作的目标是使系统能够运转起来,这是富有刺激性和创造性的任务,当付出的精力逐渐变为成果时,人们不愿做那些后续的既麻烦又可能否定自己成果的测试工作,也不愿意让别人给自己开发的软件挑毛病。正如+,-./所说的那样,软件测试是设法从程序中找错的破坏性过程。测试人员和开发人员的这一对抗心理,在一段时间内成为测试工作的障碍,极大地影响了测试技术的发展。
直到*"世纪0"年代以后,测试的意义才逐渐被人们认识,软件测试的研究才开始受到重视。1(2(3.445/总结了开发63+789$:"操作系统中的经验,阐明了软件测试在大型系统研制中的重要意义。’;0&年,<44=->4?@A首次提出了软件测试理论,从而把软件测试这一实践性很强的学科提高到了理论的高度。随后,B?C>@全面地讨论了测试准则、
在软件测试理论迅速发展的同时,各种高级的软件测试方法也将软件测试技术提高到了无法比拟的高度。L(E(B?C>@提出了程序插装的概念,使被测程序在保持原有逻辑完整性的基础上,插入“探测仪”,以便获取程序的控制流及数据流信息,并可得到测试的覆盖率。D(I(B4MN
=->对路径测试进行了深入的研究,提出了系统功能测试及代数测试等概念。O(P(EHC.5-等人将符号执行的概念引入到软件测试中,提出了符号测试方法,并且建立了Q688IR等符号测试系统。S(P(Q-TJHH4提出了基于程序变异的测试方法,使传统的测试技术领域增加了新的成
员———错误驱动测试。!"##年$%&’()*+),(等人首先引入了数据流测试方法,通过对数据流进行静态分析以找出程序中潜藏的缺陷。!"-.年/01,23,41’105等在数据流测试方法中加入了变量值域分析,使数据流方法能检测出很多类型的软件缺陷。!"--年6*5789将数据流信息应用到路径选择中,并定义了相应的测试覆盖准则,如所有定义,引用路径覆盖准则、所有定义覆盖准则、所有计算引用覆盖准则等,并给出了各种覆盖准则之间的包含关系,如599:;<:=5(3’#599:<’)’等。
!"->年针对程序域错误,$%?3,()等提出了一种新的测试策略———域测试策略,以后发展成为一个有效的模块测试方法。!"">年@1*)9对给定路径上不满足要求的分支,利用分支函数极小化,实现了测试数据的自动生成。!""!年A)B,991提出了一种基于故障的测试数据生成方法,
E>世纪#>年代,软件工程的概念逐渐形成。把软件工程活动分为需求分析、设计、编码、测试和维护几个阶段的软件生存期的概念被人们广泛接受。同时,在软件开发的实践中,人们也逐渐认识到,在开发初期发现并解决软件故障所付出的代价远比在编码以后经过测试而发现故障并加以改正的代价小得多。各种有关生存期前几个阶段的测试理论和测试方法应运而生。?%F%41+;)7给出了软件生存期各个阶段的测试目标。!"-G年$%H%450)’提出规格说明指导的模块测试方法,主张在早期开发中就考虑测试的需求。!"--年4599提出了一种利用I规格说明进行软件测试数据生成的方法。!"">年J’5,提出从关系代数查询表示的规格说明中生成测试数据的方法。!""K年?)0<8)*对基于过程控制的形式化规格说明方法进行改进,提出了基于布尔规格说明的测试数据生成方法。!""L年B5*,28给出了许多
面向对象的程序中,对象是封装了描述其属性的数据以及可以施加在这些数据上的操作的封装体。属性表示对象的状态,操作表示对象的行为,消息则描述了对象执行操作的规格说明。对象之间通过发送消息启动相应的操作,通过修改对象的状态,实现系统状态间的相互转换。类是对具有相同属性和行为的一组相似对象的描述,它描述了该类对象所具有的共同特征。!"-"年6,);9)*从面向对象的测试与传统测试的不同点出发,提出了面向对象单元测试的解决方案,从此开始了面向对象软件测试的研究工作。随后,45**19;较系统地考虑了类间的继承测试,提出了一种根据类间继承关系的层次特性对类进行增量测试的技术,其特点是通过复用和增量新新父类的测试信息去指导子类的测试。A117S根据类是抽象数据类型的实现这一原理,引入了一种与面向对象语言语法相似的代数规范描述语言$&RPT,作为类的测试模型。我国著名软测试专家陈火炎教授提出了一种基于代数规范描述的黑白盒集成类测试方法,该方法用黑盒测试选取测试用例,用白盒测试来检测程序执行一个测试用例时产生的两个对象是否处于相同的抽象状态,并补充一些测试用例,对类进行测试。
近年来,尽管软件测试技术与实践有了很大的进展,但总的来说,仍然与软件开发实践的要求相距较远。就目前软件工程发展的状况而言,软件测试仍然是较为薄弱的一个方面。不仅测试理论,已有的测试方法也不能满足当前软件开发的实际需求。为此,国际上每两年召开一次软件测试与分析研讨会,专门就软件测试与软件质量问题进行广泛的交流。为推进和协调软件测试的研究工作,!"""年在美国洛杉矶召开的第#!届国际软件工程会议上,将软件测试作为一个技术专题展开,以改善软件开发过程,提高软件质量。我国每两年召开一次的全国软件工程会议、全国容错计算会议都设有软件测试专题部分。#$$!年首次召开的全国测试学术会议,将软件测试作为一个主要的议题,以推进我国软件测试工作的研究。
为了提高软件测试效率,加快软件开发过程,一些测试工具相继问世,如静态分析工具、测试数据生成工具、测试评估工具以及将多种测试工具融为一体的集成化测试系统等。
(!)静态分析工具
静态分析工具是在不执行程序的情况下,分析软件的特性。静态分析主要集中在需求文档、设计文档以及程序结构上,可以进行类型分析、接口分析、输入输出规格说明分析等。常用的静态分析工具有:%&’()*+公司开发的)*+&,-*.’分析工具;,*/0(12’3’4’12-5公司开发的6’407*289;<&4*2分析工具及,*/0(12’=>1?-&.10&*?公司开发的@&4-*<’2分析工具等。
(#)测试数据生成工具
测试数据生成工具可以为被测程序自动生成测试数据,减轻人们在生成大量测试数据时付出的劳动,同时还可避免测试人员对一部分测试数据的偏见。常 测试评估工具用来评估程序结构元素被覆盖的程度,从而确定测试运行的充分性。常见的测试评估工具有:A’DD中心开发的G程序测试覆盖分析工具:6:G;310&*?1D公司开发的FE2’G*
(N)集成化测试系统
集成化测试系统将多种测试工具融为一体,是一种功能较强的测试工具。常见的有:J&M-2*4*/0公司开发的对7&?;*(4应用程序进行自动测试的集成化测试系统J&-2*4*/06’40/*27&?M;*(4;美国F1214*/0公司开发的自动故障检测系统F1214*/0&?4E2’HH;以及FE2’:20&1公司推出
的一组在多平台上测试G9GHH和OP363:
软件测试在我国起步较晚,最初主要在项目组内部进行手工测试。近年来,随着计算机在我国许多重要部门的广泛使用,软件测试的研究逐渐被重视起来,并取得了一些初步的研究成果。例如,中国科学院计算技术研究所进行的软件测试方法研究,北京大学计算机科学系进行的面向对象软件测试工具、测试建模和测试数据生成技术及相关问题的研究;北京航空航天大学开发的G软件分析与测试工具,1/’F2*9G及GHH软件分析与测试工具,1/’F2*9GHH;南京大学软件新技术国家重点实验室则着重研究软件复杂度分析和动态测试问题,开发了计算机辅助面向对象软件测试工具包!!"#;以及中国空间技术研究所、北京控制工程研究所进行的星载计算机软件测试环境及实现的研究等。