软件缺陷是什么
简单的讲,缺陷是软件开发过程中出现的“瑕疵”,它使得软件实际运行的结果与预期结果不一致。Bug简单的说就是与顾客期望的不符之处,这种不符体现在规约中指定的需求未被实现或者需求根本没有写进规约。于是可以引出一个软件缺陷的一般定义是:程序与规格说明之间的不匹配。(但不要使用这个定义)
“当且仅当规格说明存在并正确,程序与规格之间的不匹配才是错误。”
完全遵循一个糟糕的规格说明的程序也是糟糕的,不会是完美的。下面是两个较好的定义:
l 当程序没有实现其最终用户合理预期的功能需求时,就再现为软件缺陷。
l 从来就没有对缺陷的绝对定义,也没有对其存在的绝对定义。程序存在缺陷的程度是由程序无 法实现有用功能的程度来测量的。这是基本的人为测量。
明确的将“人为因素缺陷”排除在他对软件缺陷的定义之外。我们将其视为另一组类型的错误,你也应该这样理解。说服程序员认识到用户界面错误是个错误,或者用户界面错误很重要,或者测试人员有权告诉他一切,可能会更困难。但是客户抱怨严重的人为因素缺陷就像抱怨交通事故一样多。
作为软件测试员,在不同环境下要用不同的术语描述软件失败时的现象,下面是一些例子:
缺点(defect) 偏差(variance)
故障(fault) 失败(failure)
问题(problem) 矛盾(inconsistency)
错误(error) 特殊(feature)
事件(incident) 缺陷(bug)
异常(anomaly)
上面所列举的只是众多问题术语的一部分,大家在阅读国外这类书籍的时候不要被这些名词搞得头晕目眩,其实从字典里得出它们的翻译几乎是相同的,在日常会话中它们还具有其它含义。针对软件测试人员来说,完全不需要花太多的时间和精力放在区分这些语汇个体差异的工作上面,“该怎么称呼就怎么称呼”。事实上对每一种软件问题的提及方式只是反映出产品/项目小组他们处理整个开发过程的一种模式。他们是谨慎、小心、直接,还是简单生硬……
这里我仅引用CSQA对“Defect”的定义让大家对国外测试理念来个第一次亲密接触,另外再简单的提一下国内常讨论的“软件失效分类”的方法及其相互关系。
(注)后面的章节会单独从应用测试技术的角度重新对软件错误进行分类并且讨论。
Defect:
From the producer's viewpoint, a defect is a product requirement that has not been met, or a product attribute possessed by a product or a function performed by a product that is not in the statement of requirements that define the product. From the customer's viewpoint, a defect is anything that causes customer dissatisfaction, whether in the statement of requirements or not.
软件失效分类:
l 软件错误(Software error):
软件生命周期内的不希望的或不可接受的人为错误,其结果是导致软件缺陷的产生。(可见,软件错误是一种人为过程,相对于软件本身,是一种外部形为。
l 软件缺陷(Software defect):
软件缺陷存是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,如少一逗点、多一语句等。其结果是软件运行于某一特定条件时出现软件故障,这时称软件缺陷被激活。
l 软件故障(Software fault):
软件故障是指软件运行过程中出现的一种不希望或不可以接受的内部状态。譬如,软件处于执行一个多余循环过程时,我们说软件出现故障。此时若无适当措施(容错)加以及时处理,便产生软件失效。显然,软件故障是一种动态行为。
l 软件失效(Software failure):
软件失效是指软件运行时产生的一种不希望或不可接受的外部行为结果。
综所上述,软件错误是一种人为错误。一个软件错误必定产生一个或多个软件缺陷。当一个软件缺陷被激活时,便产生一个软件故障;同时一个软件缺陷在不同条件下被激活,可能产生不同的软件故障。软件故障如果没有及时的容错措施施加以处理,便不可避免地导致软件失效;同一个软件故障在不同条件下可能产生不同的软件失效。
(注)Bug 的生命周期
软件缺陷的生命周期可以这样来说明,缺陷由软件开发的相关活动中人的错误而引起的,例如定义需求,设计程序或编写代码时人所犯的错误。错误被嵌入这个人的工作产品(需求文档,设计文档,或代码)中后就成了故障。
只要故障(fault也常被称为Bug 或defect)存在于工作产品中,它就有可能引起其它的缺陷。例如,如果在需求文档中存在一个未被发现觉的故障,这个故障很可能引起系统设计、程序设计、代码,甚至是用户文档中的一些缺陷。
缺陷可能直接失效(failure)发生时才被检测到。失效是用户或测试者所观察到的运行结果与预期的不符。在系统测试阶段,测试工程师的目标就是要通过测试引起系统失效,从而揭露和记录下有关的软件缺陷,进而在系统中消除这些缺陷。缺陷的理想生命周期终止于缺陷在静态或动态测试中被发现并修复。