软件质量管理实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 软件缺陷定义

软件缺陷(Defect或Bug)是软件开发过程中的“副产品”,缺陷通常会导致软件产品在某种程度上不能满足用户的需要。

美国的Ron Patton在其著作《软件测试》中把符合下列5条规则的问题称为缺陷(Software Bug)。

(1)软件未达到产品说明书表明的功能;

(2)软件出现了产品说明书指明不会出现的错误;

(3)软件实现了产品说明书中未提及的功能,即超出了说明书指明的范围;

(4)软件未达到产品说明书虽未指出但应达到的目标;

(5)软件测试员认为软件难于理解、不易使用、运行速度缓慢,或者最终用户认为不好。

为便于理解,我们使用目前几乎人手一部的手机作为例子。

手机的产品说明书会声明可以接听、拨打电话。如果使用手机时,按下一个数字键“1”,结果什么反应也没有,按照第一条规则,这就是一个缺陷。如果,这次有了反应,但是…死机了,这也是一个缺陷。

产品说明书也可能会声称手机不会锁死或者停止反应。但如果您是一个执着的人,不断按动键盘,手机停止接受数据了,按照第二条规则,这是一个缺陷。

如果拿着手机进行测试,发现它除了接听电话、收发短信、上网、拍照以外,还可以充当扫描仪,而这一点没有在说明书中陈述,只是开发人员觉得它是一项很有用甚至了不起的功能而添加上的。这个也不叫功能,根据第三条规则,它也是缺陷。软件实现了产品说明书中没有提到的功能,这些预料不到的操作,会增加测试的工作,甚至可能带来更多的缺陷。

第四条规则是捕获那些产品说明书中的遗漏,有时候和第三条规则容易引起矛盾。如某款手机电池电量低时,会发生拨号错误等问题,这也是不对的。需要考虑能让手机持续工作到电池完全没电,或者至少用到电力不足告警时。电力不足时无法正常工作,但是产品说明书中没有指出这个问题。这也是个缺陷。

第五条规则是全面的要求,测试人员作为第一个真正使用软件的人,如果发现什么地方不对,无论什么原因,都要认定为缺陷。如相对屏幕来说,显示的数字过小,或许拨号键位置相对正常人操作而言过于不方便,这些仍然是缺陷。

类似这些简单的例子,如何把它们用到软件工作中去呢?软件中,哪些功能是需要的,哪些是不需要的,哪些已经说明,哪些被遗忘了,什么原因使得用户不喜欢某个产品等,这些都属于软件缺陷的范围。

在R.B.Grady的著作“Practical Software Metrics for Project Management and Process Improvement”中,缺陷(Defect)被定义为“在说明、设计或者实施产品过程中的任何不足”(Any flaw in the specification, design, or implementation of a product)。

而ISO 9000对缺陷的定义“未满足与预期或者规定用途有关的要求”,表明缺陷是软件中已经存在的一个部分,可以通过修改软件而消除。

与缺陷相关的一个重要的概念是失效(Failure),当系统或者软件运行时,出现不正确的输出,则称为失效。严格地说,失效可能由软件缺陷引起,还可能由其他诸如人为因素、硬件故障等原因引起。缺陷是系统任一方面(包括需求、设计或者代码等)的缺点,该缺点会促成或者潜在地促成一个或者多个失效发生,一般地,在本阶段发生表现为错误(Error),在其他阶段发生为Defect。

由此看来,软件缺陷不只是通常所说的程序中存在的错误或疏忽(即俗称的Bug),而是指软件产品与预期属性发生的偏离现象。除面向通常意义上的程序外,还包括了相关的工作产品,例如需求规格说明、设计文档、测试用例、用户手册等中存在的错误和问题。需要强调的是,在软件工程整个生命周期中,任何背离需求、无法正确完成用户所要求的功能的问题,包括存在于组件、设备或系统软件中因异常条件不支持而导致系统的失败等都属于缺陷的范畴。

每个软件组织都知道必须妥善处理软件中的缺陷。这是关系到软件组织生存、发展的质量根本。在软件开发过程中,软件质量保证的任务就是预防这些缺陷的发生,如果不能避免,就尽早发现并解决之。要发现潜在的软件缺陷,可以通过设计审查、代码阅读和其他复审等测试方法进行检查。

与软件缺陷既有联系又有区别的类似说法还有软件错误、软件故障和软件失效等,这里放在一起说明。

(1)软件错误(Software Error)

软件错误是指在软件生命周期内的不希望或不可接受的人为错误,其结果将导致软件缺陷的产生。“错误”还可广义定义为:“不正确的事务和行为”。软件错误是一种人为的过程,对软件本身是一种外部行为。

(2)软件缺陷(Software Defect)

软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,其结果是软件运行于某一特定条件时将出现软件故障,这时称软件缺陷被激活。

“缺陷”被认为是“欠缺和不够完备的地方”。软件的欠缺和不完备主要是针对产品说明书而言的,它是静态的,如果不将其消除,它将永远存在。在业界,人们常用另外一个词“Bug”指代缺陷,这是从早期美国海军在调试软件时一个臭虫(bug)引发了系统不能正常工作的典故所流传下来的。将缺陷俗称为“Bug”,易使人对缺陷轻描淡写,忽视了缺陷的严重性,这是值得注意的问题。缺陷是造成软件故障乃至失效的内在原因。

(3)软件故障(Software Fault)

软件故障是指在软件运行过程中出现的一种不希望或不可接受的内部状态。软件故障是一种状态行为,是指一个实体发生障碍和毛病。软件故障在ISO 14598软件产品评价标准中的定义是:计算机程序中不正确的步骤、过程和数据定义。

“故障”指软件运行时丧失了在规定的限度内执行所需功能的能力,它是动态的,可能导致失效。故障不一定导致软件失效,软件运行可以出现故障但不出现失效,如在容错(Fault Tolerance)软件运行中容许有规定数量的故障出现而不导致失效。对无容错的软件,故障即失效。故障是软件缺陷的外在表现。

(4)软件失效(Software Failure)

软件失效是指在软件运行时产生的一种不希望或不可接受的外部行为结果。软件失效是系统行为对用户要求的偏离,是一种面向用户的概念。这就是说,失效意味着系统是在运行,而且只有在执行程序过程中才会发生软件失效。

“失效”指软件运行时不能完成规定功能,它是动态的,由故障所导致。失效是软件缺陷的外在表现。

综上所述,我们可以得出:软件错误是一种人为的错误,一个软件错误必定产生一个或多个软件缺陷。当一个软件缺陷被激活时,便产生一个软件故障;同一个软件缺陷在不同条件下被激活,可能产生不同的软件故障。软件故障若没有及时地使用容错措施加以处理,便不可避免地导致软件失效;同一个软件故障在不同条件下可能产生不同的软件失效。这就是软件失效的现象和机理。

以上描述的软件失效机制,如图1-1所示。

图1-1 软件失效机制示意图