目录
1.1软件危机和软件生存期
(1)软件危机
(2)软件生存周期
1.2软件测试的意义
1.3什么是软件测试
(1)软件测试的定义
(2)软件测试的范围
1.4怎样认识软件测试
1.测试的基本原则
2.证实程序的正确性是测试的目的吗
3.测试的局限性
4.程序验证方法能否取代测试问题
5.软件测试信息流
1.5软件测试发展的历史回顾
1.历史回顾
2.与软件测试相关课题的发展
1.1软件危机和软件生存期
(1)软件危机
计算机软件的发展经历了曲折的道路。 在这期间值得一提的是在20世纪60年代出现的“软件危机”。随着计算机硬件技术的进步,计算机的元器件质量逐步提高,整机的容量、运行速度以及工作可靠性有了明显的提高。
与此同时,硬件生产的成本降低了。计算机价格的下跌为它的广泛应用创造了极好的条件。 在此形势下自然要求软件与之相适应。 一方面适应高速度、大容量、高可靠度的高性能硬件;另一方面要适应在广泛应用情况下出现的大型、复杂问题对软件技术提出的迫切需求。
然而,事实上软件技术的发展未能满足这些需求。 和硬件技术的快速发展相比,软件的确大大地落后了。多年来由于问题未得到及时解决,致使矛盾日益尖锐。 这些矛盾归结起来主要表现在以下几个方面。
(1)由于缺乏大型软件开发的经验和软件开发数据的积累,使得开发工作的计划很难制定。 (2)作为软件设计依据的软件需求,在开发的初期提得不够明确,或是未能做出确切的表达。
(3)开发过程中没有遵循统一的、公认的方法论或是开发规范,参加工作的人员之间的配合不够严密,约定不够明确。
(4)缺乏严密有效的软件质量检测手段,交付给用户的软件质量差,在运行中暴露出各种各样的问题。
(2)软件生存周期
正如同其他事物一样,从发生、发展到达成熟阶段,以至老化和衰亡,有一个历史发展的过程,任何一个计算机软件都有它的生存期(Life Cycle)。
这个生存期包括6个步骤,即:计划 (P1anning)、需求分析(Requirement Analysis)、设计(Design)、程序编写 (Coding)、测试(Testing)、运行和维护(Run and Maintenance)。
这些步骤的主要任务如下。
(1)计划:确定软件开发的总目标;给出软件的功能、性能、可靠性以及接口等方面的设想。
(2)需求分析:对开发的软件进行详细的定义,由软件人员和用户共同讨论决定哪些需求是可以满足的,并且给予确切的描述;写出软件需求说明书(Software Requirement Specifications,或称软件规格说明书),以及初步的用户手册(System User’s Manual),提交管理机构审查。 (3)软件设计:设计是软件工程的技术核心。
(4)程序编写:把软件设计转换成计算机可以接受的程序,即写成以某个程序设计语言表示的源程序清单。
(5)测试:测试是检验开发工作的成果是否符合要求,它是保证软件质量的重要手段。通常测试工作分为三步,即:
● 单元测试(Unit Testing)—单独检验各模块的工作。
● 集成测试(Integrated Testing)—将已测试的模块组装起来进行检验。
● 确认测试(Validation Testing)—按规定的需求,逐项进行有效性测试,以决定开发的软件是否合格,能否提交用户使用
(6)运行和维护:已交付用户的软件投入正式使用以后便进入运行阶段。以上步骤表明了每个软件从它的酝酿开发,直至使用相当长时间以后,被新的软件代替而退役的整个历史过程。 按此顺序逐步转变的过程可用一个软件生存期的瀑布模型加以形象化描述。
在软件运行的过程中若有必要修改,得提出充分的修改理由,经过审核,才能确定下来。
接着需要经历制定修改计划、确定新的需求、修改软件设计、修改编码、进行测试以及重新投入运行等一系列步骤。这些步骤正是上述开发一个新软件的步骤。
若是运行中多次提出修改,将多次经历这些步骤。我们把这一过程用下面的图来表示,并称此为软件生存周期。
实际上软件生存周期和软件生存期表达的是同一内涵,为简便起见通常只称为软件生存期。
1.2软件测试的意义
根据Boehm的统计,软件开发总成本中,用在测试上的开销要占30%~50%。
如果我们把维护阶段也考虑在内,讨论整个软件生存期,开发测试的成本比例会有所降低,但不要忘记,维护工作相当于二次开发,乃至多次开发,其中必定也包含有许多测试工作。
因此,有人估计软件工作有50%的时间和50%以上的成本花在测试工作上。
20世纪70年代中期以来,形成了软件生存期概念。 这时人们对于软件测试的认识更广泛,也更深刻了。这对于软件产品的质量保障以及组织好软件开发工具有着重要的意义
首先,由于能够把整个开发工作明确地划分成若干个开发步骤,就把复杂的问题按阶段分别加以解决。
其次,把软件开发划分成阶段,就对中间产品给出了若干个监控点,提高了开发过程的可见度,为各阶段实现目标的情况提供了检验的依据。
即使只谈程序本身的正确性,它也和编码以前所完成的需求分析及软件设计工作进行得如何密切相关。
因此,即使针对源程序进行测试,所发现的问题其根源可能在开发前期的各个阶段。解决问题、纠正错误也必须追溯到前期的工作。
下图给出了测试工作与软件开发前期工作的关系。图中开发工作是自上而下进行的,而几种不同的测试都会涉及前期工作的不同阶段。
确认、验证与测试在整个软件开发过程中作为质量保证的手段,应当最终保证软件产品的正确性、完整性和一致性。
我们可以把确认、验证与测试活动分为三类(如下图所示)
(1)完整性检验—验证每一开发阶段(或开发步骤)中产品的完整性;分析每一产品,确保其内部的一致与完全。
(2)进展检验—保证各个开发阶段(或开发步骤)之间其规格说明书的完全性和一致性。 (3)适用性与充分性检验—把取得的结果与对问题的理解作比较,保证所完成的结果是必要而充分的解。
在整个软件生存期各阶段中确认、验证与测试活动包括以下阶段:
(1)需求分析阶段
(2)概要设计阶段
(3)详细设计阶段
(4)编码及测试阶段
(5)运行及维护阶段
1.3什么是软件测试
(1)软件测试的定义
1973年W.Hetzel曾经指出,测试是对程序或系统能否完成特定任务建立信心的过程。
G.J.Myers则持另外的观点,他认为:“程序测试是为了发现错误而执行程序的过程”。 以上讨论的软件测试定义都是强调软件的正确。
有些测试专家认为软件测试的范围应当包括得更为广泛些。J. B. Goodenough认为测试除了要考虑正确性以外,还应关心程序的效率、健壮性(robustness)等因素,并且应该为程序调试提供更多的信息。 他列出了如下一张测试组成表
S.T.Red wine认为,软件测试应该包含以下几种测试覆盖:
(1)功能覆盖;
(2)输入域覆盖;
(3)输出域覆盖;
(4)函数交互覆盖;
(5)代码执行覆盖。
(2)软件测试的范围
至于测试的范围,A.E.Westley将测试分为四个研究方向,即:
(1)验证技术(目前验证技术仅适用于特殊用途的小程序);
(2)静态测试(应逐步从代码的静态测试往高层开发产品的静态测试发展);
(3)测试数据选择;
(4)测试技术的自动化。
1.4怎样认识软件测试
●认为测试工作不如设计和编码那样具有开拓性,也不容易看到进展。
●以发现软件错误为目标的测试是非建设性的,甚至是破坏性的。
●认为测试工作枯燥无味,不能引起人的兴趣。
●测试工作的确是艰苦而细致的工作。
● “这程序不会有问题,因为是我写的。”
为了澄清认识和端正态度,有必要对以下几个方面的问题加以说明。
1.测试的基本原则
原则1:穷尽测试是不可能的。所谓穷尽测试就是对所有输入数据的各种可能进行排列组合试验的测试。如图是具有四个判断和一个循环的程序
原则2:测试工作具有创造性,但很困难。
Bill Hetzel总结出成功测试的必要元素:
● 创造性和洞察力; ● 商业知识; ● 正确的测试方法; ● 良好的测试经验。
2.证实程序的正确性是测试的目的吗
如果我们测试活动的目标始终围绕着揭露程序中的错误,那么在选取测试数据时,自然要考虑那些易于发现程序错误的数据,并且认为能够发现程序错误的数据是好的数据,能够高效率揭露程序错误的测试是成功的测试;而持相反观点的人必然认为那些是坏的数据,找出程序错误的测试是失败的测试。
由于各开发阶段工作的连续性,以及逐步扩展,早期开发中出现的错误如果不能得到及时发现和解决,必然要在后面各阶段中逐步传递,并且也会逐步扩展。
下图表明了这一步扩展的现象。
下图则给出了由于需求分析中的错误,在软件开发的后期各个阶段修正时需要消耗的代价。 由此可以看出开发前期出现错误带来的严重后果。
十分明显,及时排除早期开发中出现的错误,可以排除它给后期工作带来的麻烦,以避免付出高额的代价,从而大大提高了开发的效率。这对降低整个软件的开发成本有着特别重要的意义。
3.测试的局限性
这种局限性主要表现在以下三个方面。
(1)输入/状态空间的无限性。 (2)故障巧合性。 (3)系统缺陷的不确定性
4.程序验证方法能否取代测试问题
首先,必须看到程序验证方法也是有局限性的。
其次,已经验证为正确的程序,仍然可能存在错误。
经验证为正确的程序,还可能存在着以下几种错误:
(1)需求规格说明书错误。(2)接口错误。(3)目标错误
从上述分析可以看出,要想用程序正确性验证方法代替程序测试是不可能的。在实际的软件开发项目中,测试仍然是最为现实、有效的质量保障手段。
5.软件测试信息流
为进一步说明软件测试的过程,这里给出软件测试的信息流图,如图
实施测试应该给出三类信息。
(1)软件配置:这是测试的对象,包括软件需求规格说明书、设计规格说明书和被测的源程序。 (2)测试配置:包括测试计划、测试步骤、测试用例(测试数据),以及具体实施测试的测试程序等。
(3)测试工具:为高效率完成测试所采用的测试工具软件。
1.5软件测试发展的历史回顾
1.历史回顾
早在20世纪50年代,英国著名的计算机科学家图灵就曾给出程序测试的原始定义。
20世纪50年代以后,随着高级语言的诞生和广泛使用,测试工作自然把重心逐渐转移到用高级语言编写的程序系统了。尽管随机选取测试数据的方法一直是低效的,然而测试在程序的开发过程中仍然没有受到应有的重视。测试方法和理论研究发展缓慢。
20世纪70年代以来,由于加深了对测试工作的认识,测试的重要意义逐渐被人们理解,加之一些测试工具陆续出现,上述矛盾得到了缓和。
1982年6月在美国北卡罗莱纳大学召开了首次软件测试的正式技术会议,这次会议成为软件测试技术发展中的一个重要里程碑。
会议以后,软件测试的研究更加活跃,有关软件测试技术的论文如雨后春笋。F.P.Brooks总结了开发IBM OS/360操作系统中的经验,在著名的《人月神话》一书中阐明了软件测试在研制大系统中的重要意义。B.W.Bohem指出,由于测试工作主要集中在系统的递交阶段,使得测试的效果完全依赖于运行情况,这是当时测试工作的一个致命弱点。
20世纪70年代中期,软件测试技术的研究达到高潮。J.B.Goodenough和S.L.Gerhart首先提出了软件测试的理论,从而把软件测试这一实践性很强的学科提高到理论的高度,被认为是测试技术发展过程中具有开创性的工作。
在软件测试理论迅速发展的同时,各种高级的软件测试方法也将软件测试技术提高到了初期的原始方法无法比拟的高度。
20世纪60年代末、70年代初软件危机的矛盾日益突出,软件工程化的概念逐渐形成。把软件工程活动分为需求分析、设计、编码、测试和维护几个阶段的软件生存期的概念被人们广泛接受。
2.与软件测试相关课题的发展
近年来,尽管软件测试技术有了长足的进步,但总的来说,仍然和软件开发实践提出的要求有相当大的距离。测试手段的进展也远远没有达到令人满意的程度
与软件测试相关的课题主要包括图论及其应用、程序正确性证明、程序排错、软件质量保证以及软件复杂性度量。