什么是软件缺陷

什么是软件缺陷?

作者:bailuyuan

关键词: 软件测试, 软件缺陷

 

 

1.与“bug”、“缺陷”相关词语的解释

 

    首先,我们看看上面提到的几个与软件缺陷有关的词在英语中的解释。翻译如下:

n         bug(小错误,缺陷,不足,过失 …)

一个计算机bug指在计算机程序中存在的一个错误(error、缺陷(flaw)、疏忽(mistake)或者故障(fault,这些bug使程序无法正确的运行。Bug产生于程序的源代码或者程序设计阶段的疏忽或者错误。我们知道所有应用的程序中都存在bug,只是设计良好的程序包含的bug相对少一些,并且这些bugs不会妨碍程序正常完成它的任务。包含很多bug的程序(常常指的是含有缺陷的软件),是指那些包含有大量bug并且这些bug严重的妨碍了程序正常功能的完成。

n         Defect(缺陷)

在软件工程(Software Engineering)中,软件与它的需求(requirements)不一致,常常指软件无法正确完成需求所要求的功能,也称之为bug

n         Fault(故障)

    在ISO/CD 10303226的文档中,fault被定义为存在于组件、设备或者子系统中异常的条件或者缺陷,常常会导致系统的失败。

    依照联邦1037C标准(Federal Standard 1037C)Fault有以下的含义:
1.
一个导致某一功能单元无法完成它预期功能的异常条件。
2.
一个导致重复出现的或者灾难性的功能失常的过错。一个可重复出现的功能失常被认为是指该现象在同样的环境下可再现。
3.在电力系统中,两个带电导体之间或者一带电导体与零电势体之间的意外的、局部的短路。

n         Failure(失效)

    ISO/CD 10303226Failure定义为一个组件,设备,子系统或者系统无法(不具备相应的能力)去完成它设计的任务。Failure常常源自于一个或许多的错误。

n         Error(错误)

    Error在不同的领域有不同的含义,在拉丁语中它表示:徘徊的(wandering)或者迷路的(straying)。那么它在编程(programming,直译:规划,设计)方面含义如下:

一个error是指编写错误的代码,通常是无意中造成的。一般有两类主要的错误,一是语法错误(syntax error),该类错误易于检测,因为代码在编译阶段无法解析而不能正常编译通过。另一个是逻辑错误(logical error),因为它与代码的实际执行密切相关所以不易发现。两类错误都会导致错误“雪崩”(error avalanche,一个小的错误最终演变为一个非常大的错误),因为当前的错误代码将影响后续部分代码。比如一段程序的输出是另一段程序的输入。

从上面的解释中我们可以看到这些词语的解释与我们日常的使用习惯密切相关,或许因为人们在偏袒小虫,所以bug的含义延伸的最广,它的意思几乎涵盖了其它几个与“缺陷”有关的词语。而其它的词语之间有细微的差别,适用于不同的环境。当我们的软件功能与需求不一致时,我们可以说这是一个defect;当程序的某部分代码存在错误导致程序执行失败时,我们可以说这是一个fault;当程序因为错误太多而导致无法完成预定功能时,我们说这是一个failure;当代码中存在因为疏忽而造成的错误时,我们说这是一个error

历史上许多“灾难”或者重大事件的失败都是与bug有关的。如美国国家航空航天局(NASA)的阿波罗11(Apollo 11)着陆时出现故障(1996.6.4),还有NASA的火星气候轨道探测器,无法将长度单位码(yard)转换为米(meter),等等在宇宙空间探索方面的bug导致了重大的损失,当然这种bug还发生在诸如:医学,计算,通讯等其它领域。

2.缺陷的分类

在了解了与“缺陷”一词有关的解释之后,探讨一下在实际的软件开发中应该如何对缺陷进行分类。

现在已有的对缺陷的分类大都针对编码阶段,主要是因为该阶段是产生bug最多的阶段。看看当前各种缺陷管理软件你就可以得到众多对缺陷类型的划分,以及相应的优先级,这些划分有很多共性,这不仅因为它们都是对软件缺陷进行划分,同时在于它们存在类似的不足。下面作为举例给出了某个缺陷管理软件对缺陷的简单分类:

 

语法错误

SQL语句错误

数据库连接错误

接口定义错误

不符合编码规范

程序功能错误

文档错误

创建_打包

分配声明

检查

数据

系统

环境

    这里有些缺陷类型定义需查阅相关的帮助文档,否则你无法知道它的确切含义,基于这个简单的分类,下面给出了一个bug严重等级的定义列表:

1-1.缺陷的严重等级分类编号及说明

            缺陷类别          标识/权值            说明

A               A1/5.6               由程序执行引起的死机、非法退出 

                              A2/5.5               死循环

                              A3/5.4               数据库发生死锁

A4/5.3               数据库设计未达到第三范式的要求或

需求规格说明的水平

                              A5/5.2               数据功能实现错误

                              A6/5.1               与数据库连接错误

                              A7/5.0               数据通讯错误

            B               B1/4.3               程序语法错误

                              B2/4.2               因错误操作迫使程序中断

                              B3/4.1               程序接口错误

B4/4.0               数据库的表、业务规则、缺省值未加完整性

等约束条件

            C               C1/3.4               操作界面错误(包括数据窗口内列名定义、含

义是否一致)

                              C2/3.3               打印内容、格式错误

                              C3/3.2               简单的输入限制未放在前台进行控制

                              C4/3.1               删除操作未给出提示

                              C5/3.0               数据库表中有过多的空字段

            D               D1/2.5               界面不规范

                              D2/2.4               辅助说明描述不清楚

                              D3/2.3               输入输出不规范

                              D4/2.2               长操作未给用户提示

                              D5/2.1               提示窗口文字未采用行业术语

D6/2.0               可输入区域和只读区域没有明显的区分标志

             E               E1/6.1               遗漏部分功能

E2/6.1               实现功能与需求不相吻合

规定的缺陷优先级如下:

P1 ---- urgent,         必须立即修改

P2 ---- important     立即修改

P3 ---- less important,可延期修改

P4 ---- not important, 可以不修改

P5 ---- neglect       可忽略

 

这里优先级由P1P5逐渐降低,依次代表了该缺陷需要修改的紧迫程度。此处缺陷严重等级是以该缺陷对系统整体造成的影响,或与需求说明不相符合的程度作为划分依据,下面的优先级表示该缺陷需要修改的紧迫程度,它与缺陷严重等级有一对多的关系。总体上优先级从类型A开始逐渐降低,例如A1B1都属于优先级为1的级别。总之,缺陷严重等级和缺陷优先级定义的出发点不同,前者是对缺陷的划分,后者是给缺陷一个定位,以提醒相关的修改人员及时修改。我这里只是举个例子,关于具体的缺陷类型的划分细节有待进一步商榷。

 

因为只要是错误我们都可以将它称为缺陷,然而你无法预知你会在软件开发的那个阶段出错,所以缺陷涵盖的范围就延伸到软件开发的整个生命周期,甚至超越了这个范围。那么我们是否可以按照软件开发的不同阶段作为不同类别缺陷的界限,然后再在每个阶段的内部进行细分。


1-1.软件开发流程与可能产生的缺陷示意图

这种分法虽然能够明确缺陷所属的阶段,但是无法清晰的描述缺陷的本质,需要在每个所属阶段对缺陷类型进行细化。而我们更加关心这个缺陷会对系统的开发乃至将来的使用产生什么影响,所以我们有必要按照具体缺陷的产生原因更加直观的划分缺陷的类型和优先级,而不必过多的关注它到底是属于那个阶段的缺陷。从这个角度出发,我们可以将实际发现的缺陷按照实际产生的原因进行分类,作为缺陷类型的标准。以上是一点我个人的想法,希望能起到抛砖引玉的作用,有关缺陷的划分以及相关的处理流程有必要进行更加细致的讨论。

3.小结

以上从概念的角度对缺陷做了一个解释,还对缺陷类型的划分进行了简单的探讨。我们可以简单的将缺陷称作bug。它不仅仅是代码级别的错误,而且可以是在设计和测试阶段发现的缺陷。无论什么时候,任何有助于改善产品质量的提议、任何需要引起注意、值得跟踪的问题、任何可能潜在的错误,都可以而且应该作为一个Bug。我们可以将软件整个生命周期中存在的或者发现的各种问题都列入缺陷的范围,因此我们可以在缺陷和bug之间划上一个等号。
    从管理这个层次上讲,一旦bug被发现后,最困难的并不是如何去记录,分派人员去解决,并予以追踪。最困难的是决定对某些bug推迟解决,甚至不予解决。这样的bug往往是在产品开发的中后期发现的,而且是由于最初架构设计的缺陷所造成的,解决这样的bug需要大量的人力和时间,影响面大,可能会引入新的bug。对于这样的bug,PM要与客户端的其他部门和人员联系,比如市场部门,技术支持部门,甚至于早期介入的客户。如果从他们的反馈中,确认这种bug对决大多数客户和决大多数的使用者没有影响,就要果断决定推迟,或不予解决。对于这些已决定推迟,或不予解决的bug,还有一些后续工作非常重要。首先要详细的记录,以便在下一个版本中解决;其次要让有关技术支持人员深刻理解,准备应对方案。这也从另外一个角度向我们提出问题,到底应该如何划分缺陷类型,并确定相应的优先级?它们二者之间有什么关系?
限于本人水平,有翻译不准确的地方大家可参考下面附录中的英文原文进行更加准确的理解,同时欢迎您更正我的错误。


附录:引用的相关英文资料

n         Bug

A computer bug is an error, flaw, mistake or fault in a computer program which prevents it from working correctly. Bugs arise from mistakes and errors in either a program's source code or its design. It is said that there are bugs in all useful computer programs, but well-written programs contain relatively few bugs, and these bugs typically do not prevent the program from performing its task. Buggy programs (sometimes referred to as defective software), are those applications which contain a large number of bugs, and/or bugs which seriously interfere with the program's functionality.

n         Defect

in software engineering, the non-conformance of software to its requirements, often, but incorrectly, called bug.

n         Fault

In document ISO/CD 10303-226 fault is defined as an abnormal condition or defect at the component, equipment, or sub-system level which may lead to a failure.

According to Federal Standard 1037C, the term fault has the following meanings:

  1. An accidental condition that causes a functional unit to fail to perform its required function.

  A defect that causes a reproducible or catastrophic malfunction. A malfunction is considered reproducible if it occurs consistently under the same circumstances.

  In power systems, an unintentional short-circuit, or partial short-circuit, between energized conductors or between an energized conductor and ground.   

n         Failure

Failure is defined in ISO/CD 10303-226 as the lack of ability of a component, equipment, sub system, or system to perform its intended function as designed. Failure may be the result of one or many faults

n         Error

An error has different meanings in different domains. Current meanings in some of those domains are described below. The Latin word error meant "wandering" or "straying".

An error is incorrectly written code, usually not intentional. There are two major types of error. The syntax error is easiest to detect since the code will not compile properly and cannot be parsed. The logical error is more difficult to solve since it involves the working of the actual code. Both types of error can create an error avalanche, which is caused by the now broken code continuing to affect subsequent code.

----------------------------------------------------------------------------------------

[作者简介]

    名:张瑞,在读硕士.  

研究方向:软件工程与理论.  

业余爱好:体育,音乐,爬山.

Email[email protected]

你可能感兴趣的:(测试员杂志第二期)