3MILY: 黑体">.软件错误的分类方法
软件的错误是非常复杂的,凡是人们能够想到的软件错误都是可能发生的。到目前为止,人们对软件错误的认识尚停留在表面上,其内在规律有待进一步研究。这也是目前软件测试技术发展比较缓慢的原因之一。虽然如此,人们还是可以根据软件错误的表现将其进行分类,常见的分类方法有:
(1)根据错误的征兆进行分类:这种分类方法是根据系统的输入和系统对输入的反应结果进行的分类。如表1.1所示。这种分类方法的好处是可以提高人们认识错误的严重程度,以便防范于未然。
表1.1 根据错误的征兆进行的分类
输入 系统反应 |
错误输入 |
正确输入 |
对输入的拒绝 |
正确 |
第I类型的错误(严重) |
得出错误的结果 |
第II类型的错误(严重) |
第III类型的错误(严重) |
系统崩溃 |
第IV类型的错误(严重) |
第V类型的错误(严重) |
(2)根据错误的起因进行的分类:计算机系统中的每一个错误,究其原因,大都可以归结为下列三种情况之一,硬件或软件中的设计错误、由于环境或部件的老化引起的硬件恶化、错误的输入数据。显然,在软件生存期的不同阶段,每类错误的分布是不一样的,因此,这种分类方法的好处,一是了解错误在不同时期的分布规律。例如,在系统运行的早期所发生的错误,很有可能是设计错误或数据错误所引起的,在运行相当长的时间后所发生的错误可能是由于数据错误引起的,而在运行相当长的时间后,就有可能是硬件恶化引起的,这为判断软件错误的类型并尽快修复提供依据。二是根据这种分类,可以知道那些错误是可以排除的,而那些错误又必须通过是更换设备才能解决的。
(3)根据错误发生的持续时间来分类:一般可将其分为永久性错误和瞬时错误。永久性错误是指经常发生的错误,这类错误是不可怕的,因为它容易被排除。而瞬时错误恰恰相反,由于是偶尔出现,难以掌握其规律,故很难将其排除。
(4)根据错误的严重程度进行分类:不同的错误所产生的后果是不一样的。较少的错误例如数据格式不对,并不会产生什么后果,而有些错误,例如飞机导航软件出错,可能导致机毁人忘的严重后果。一般来讲,根据错误的严重程度可以分为:较少错误、中等错误、较严重错误、严重错误、非常严重错误和最严重错误。这里的分类,是根据错误引起后果的程度来分的,而不是根据错误对应故障的复杂性来分类的,有时一个较少的故障,例如,程序语句漏掉一个标点符号等,都可能产生严重的后果。
(5)根据开发阶段进行分类:在软件生存期的每个阶段都可能存在错误,即计划错误、需求分析错误、设计错误、编码错误、测试错误、运行与维护错误。由于生存期的每一个阶段又是下一个阶段的先导,也就是说,前一个阶段正确的设计是保证下一个阶段设计正确的必要条件。因此,要求一旦发现某个阶段存在错误,就要尽快将其排除。否则,越往后,排除故障的代价就越大,从这种意义上讲,这种分类法是必要的。
4.软件错误的分类
虽然上述给出了软件错误的五类分类方法,但前四种的分类方法只能给人们一个感性的认识,对排除故障并没有很大的帮助。
(1)根据软件开发阶段的分类:根据软件开发阶段的分类方法针对性比较强,便于人们认识错误和纠正错误。表1.2给出了一种基于开发阶段的分类方法,表中给出的错误数据比例是根据含有6877000个语句的源程序的错误(共16029个错误)进行统计的结果。
表1.2:基于开发阶段的分类方法
错误类型 |
描述 |
错误个数 |
百分比 |
软件需求错误 |
包括软件需求制定得不合理或不正确;需求不完全;含有逻辑错误;需求分析的文档有误。 |
1317 |
8.2% |
功能和性能错误 |
包括功能和性能规定得有错误,或是遗漏了某些功能;为用户提供的信息有错误,或信息不确切;对意外的异常情况处理有误等。 |
2624 |
16.1% |
结构错误 |
包括程序控制流或控制顺序有误;处理过程有误等。 |
4082 |
25.2% |
数据错误 |
包括数据定义或数据结构有误;数据存储或数据操作有误等。 |
3638 |
22.4% |
实现和编码错误 |
包括编码错或按键错;违背编码风格或是编码标准错误;文档有误等。 |
1601 |
9.9% |
集成错误 |
包括软件内部和外部接口有误;各相关部分在时间配合、数据吞吐量等方面不协调等。 |
1455 |
9.0% |
系统结构错误 |
操作系统调用错或使用错、恢复错误、诊断错误、分割及覆盖错误、引用环境错误等。 |
282 |
1.7% |
测试定义与测试执行错误 |
包括测试设计错误、测试执行错误、测试文档错误、测试用例不充分等。 |
447 |
2.8% |
其它类型错误 |
|
763 |
4.7% |
(2)基于引起错误复杂度的分类:如表1.3所示。
表1.3:基于引起错误复杂度的分类
错误类型 |
描述 |
文档 |
注释、消息。 |
语法 |
拼写、标点符号、打字、指令格式。 |
联编打包 |
变更管理、库、版本控制。 |
赋值 |
说明、重名、作用域、限制。 |
接口 |
过程调用与引用、输入/输出、用户格式。 |
检查 |
出错信息、不合适的检查。 |
数据 |
结构、内容。 |
函数 |
逻辑、指针、循环、递归、计算、函数缺陷。 |
系统 |
配置、记时、内存。 |
环境 |
设计、编译、测试、其它系统支持问题。 |
5.软件错误的危害
(1)软件错误可能造成的危害:近年来,随着计算机应用领域的迅速扩大,计算机软、硬件新技术的不断涌现,人们对软件的质量提出了新的更高的要求。目前,计算机已广泛地应用于航天、航空、工业控制、交通、银行、金融、医疗等领域。在这样的应用领域中,软件质量往往关系到人民生命财产和生态环境的安危。一旦软件发生故障,就可能造成人的生命和财产的巨大损失和生态环境的破坏。例如:
· 国际上,计算机已普遍用于核电站的控制与安全保护,一旦软件发生故障,将会造成人员伤亡和环境污染。
· 在伦敦希思罗国际机场,平均每三分钟就有一架飞机起落,如果调度飞机场着陆次序的软件发生故障,将会造成飞机相撞的灾难。
· 波音747等大型客机都使用计算机自动导航系统,如果它发生故障,将会造成机毁人忘的事故。
· 在西方国家,铁路信号系统已计算机化。英国已计划在不久的将来实现铁路信号和扳道的全部自动化。铁路交通的安全性将进一步依赖计算机系统的正常运行。
· 在巴黎地铁系统中,由于使用计算机进行有效的调度和安全控制,火车的行驶速度得以加快,火车之间的间隔得以缩短。
· 现代通信技术和网络技术的发展,使得人们相互之间的信息交换达到完全自动化,如果主控计算机出现故障,则它所控制的用户对外的信息交流将被中断,所造成的损失是难以估量的。
· 一旦银行系统的计算机出现故障,将会造成混乱。这也是目前银行系统尚需人工备份资料的重要原因。
以上类似的例子很多,难以枚举。随着计算机科学、信息科学和其它自然科学的发展,我们有理由相信,人们将会越来越依靠计算机,计算机将是人类生活的重要组成部分,到那时,计算机的错误将不在仅仅是一个技术问题,而将完全变成一个普遍的社会问题。
(2)软件错误已经造成的危害:软件的错误给人类生活已经造成的危害的事例是很多的,这里仅举几个例子。
· 欧洲航空航天局发射的啊里亚那火箭,由于软件的错误而使发射失败,所携带的卫星报废,损失巨大。
· 中国的´´卫星,也是由于软件的错误,在运行不到一年后就失去作用。根据事后的分析表明,仅仅是由于一个非常简单的软件错误而使耗资巨大的卫星报废,多么可失!
· 由于控制放射性治疗设备的软件错误,在加拿大已经造成了多起癌症病人因受到过量放射性辐射而死亡的事故。
· 在英国,由于放射性治疗设备中计算辐射量的软件错误,发生了癌症病人因放射性辐射太低而得不到适当治疗的事故。
· 在伦敦,救护车调度软件刚刚投入使用几小时就发生故障,造成急诊病人延误达十几小时。
· 飞机自动控制软件的错误造成了飞机在特技飞行表演时坠毁。
· 自动行李处理系统的小小软件错误使丹佛国际机场飞机受阻,到达的行李空等九个月。
类似的例子也很多。当我们每天依靠计算机进行工作时,一旦计算机发生错误,给我们造成的危害是苦不堪言,可能我们几个月甚至几年的劳动会付诸东流。表1.4给出了部分计算机系统实效源的统计数据。
表1.4计算机系统实效源的统计数据
系统 |
数据发表年份 |
硬件(%) |
软件(%) |
维护(%) |
操作(%) |
环境(%) |
AT&T ESS |
1978 |
20 |
15 |
— |
65 |
— |
Tandem |
1985 |
18 |
26 |
25 |
17 |
14 |
Bellcore |
1986 |
26 |
30 |
— |
44 |
— |
Tandem |
1987 |
19 |
43 |
13 |
13 |
12 |
可见,软件故障正逐渐成为导致计算机系统失效的主要因素。
文章来源于领测软件测试网 https://www.ltesting.net/