一 软件缺陷的定义:
软件缺陷(Defect),常常又被叫做Bug。所谓软件缺陷,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。IEEE729-1983对缺陷有一个标准的定义:从产品内部看,缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷是系统所需要实现的某种功能的失效或违背。
二 软件缺陷的级别:
一旦发现软件缺陷,就要设法找到引起这个缺陷的原因,分析对产品质量的影响,然后确定软件缺陷的严重性和处理这个缺陷的优先级。各种缺陷所造成的后果是不一样的,有的仅仅是不方便,有的可能是灾难性的。一般问题越严重,其处理优先级就越高,可以概括为以下四种级别:
(1)微小的(Minor)。一些小问题如有个别错别字、文字排版不整齐等,对功能几乎没有影响,软件产品仍可使用。
(2)一般的(Major)。不太严重的错误,如次要功能模块丧失、提示信息不够准确、用户界面差和操作时间长等。
(3)严重的(Critical)。严重错误,指功能模块或特性没有实现,主要功能部分丧失,次要功能全部丧失,或致命的错误声明。
(4)致命的(Fatal)。致命的错误,造成系统崩溃、死机,或造成数据丢失、主要功能完全丧失等。
除了严重性之外,还存在反映软件缺陷处于一种什么样的状态,以便于及时跟踪和管理,下面是不同的缺陷状态。
·激活状态(Open):问题没有解决,测试人员新 告的缺陷或者验证后缺陷仍旧存在。
·已修正状态(Fixed):开发人员针对缺陷,修正软件后已解决问题或通过单元测试。
·关闭状态(Close):测试人员经过验证后,确认缺陷不存在之后的状态。
三 软件缺陷产生的原因:
在软件开发的过程中,软件缺陷的产生是不可避免的。那么造成软件缺陷的主要原因有哪些软件本身、团队工作和技术问题等角度分析,就可以了解造成软件缺陷的主要因素。 软件缺陷的产生主要是由软件产品的特点和开发过程决定的。
1)软件本身
①需求不清晰,导致设计目标偏离客户的需求,从而引起功能或产品特征上的缺陷。
②系统结构非常复杂,而又无法设计成一个很好的层次结构或组件结构,结果导致意想不到的问题或系统维护、扩充上的困难;即使设计成良好的面向对象的系统,由于对象、类太多,很难完成对各种对象、类相互作用的组合测试,而隐藏着一些参数传递、方法调用、对象状态变化等方面问题。
③对程序逻辑路径或数据范围的边界考虑不够周全,漏掉某些边界条件,造成容量或边界错误。
④对一些实时应用,要进行精心设计和技术处理,保证精确的时间同步,否则容易引起时间上不协调,不一致性带来的问题。
⑤没有考虑系统崩溃后的自我恢复或数据的异地备份、灾难性恢复等问题,从而存在系统安全性、可靠性的隐患。
⑥系统运行环境的复杂,不仅用户使用的计算机环境千变万化,包括用户的各种操作方式或各种不同的输入数据,容易引起一些特定用户环境下的问题;在系统实际应用中,数据量很大。从而会引起强度或负载问题。
⑦由于通信端口多、存取和加密手段的矛盾性等,会造成系统的安全性或适用性等问题。
⑧新技术的采用,可能涉及技术或系统兼容的问题,事先没有考虑到。
2)团队工作
☆系统需求分析时对客户的需求理解不清楚,或者和用户的沟通存在一些困难。
☆不同阶段的开发人员相互理解不一致。例如,软件设计人员对需求分析的理解有偏差,编程人员对系统设计规格说明书某些内容重视不够,或存在误解。
☆对于设计或编程上的一些假定或依赖性,相关人员没有充分沟通。
☆项目组成员技术水平参差不齐,新员工较多,或培训不够等原因也容易引起问题。
3)技术问题
○算法错误:在给定条件下没能给出正确或准确的结果。
○语法错误:对于编译性语言程序,编译器可以发现这类问题;但对于解释性语言程序,只能在测试运行时发现。
○计算和精度问题:计算的结果没有满足所需要的精度。
○系统结构不合理、算法选择不科学,造成系统性能低下。
○接口参数传递不匹配,导致模块集成出现问题。
4) 项目管理的问题
· 缺乏质量文化,不重视质量计划,对质量、资源、任务、成本等的平衡性把握不好,容易挤掉需求分析、评审、测试、等时间,遗留的缺陷会比较多。
· 系统分析时对客户的需求不是十分清楚,或者和用户的沟通存在一些困难。
· 开发周期短,需求分析、设计、编程、测试等各项工作不能完全按照定义好的流程来进行,工作不够充分,结果也就不完整、不准确,错误较多;周期短,还给各类开发人员造成太大的压力,引起一些人为的错误。
· 开发流程不够完善,存在太多的随机性和缺乏严谨的内审或评审机制,容易产生问题。
· 文档不完善,风险估计不足等。
四 修复软件缺陷的代价
在讨论软件测试原则时,一开始就强调测试人员要在软件开发的早期,如需求分析阶段就应介入,问题发现的越早越好。发现缺陷后,要尽快修复缺陷。其原因在于错误并不只是在编程阶段产生,需求和设计阶段同样会产生错误。也许一开始,只是一个很小范围内的错误,但随着产品开发工作的进行,小错误会扩散成大错误,为了修改后期的错误所做的工作要大得多,即越到后来往前返工也越远。如果错误不能及早发现,那只可能造成越来越严重的后果。缺陷发现或解决的越迟,成本就越高。
平均而言,如果在需求阶段修正一个错误的代价是1,那么,在设计阶段就是它的3~6倍,在编程阶段是它的10倍,在内部测试阶段是它的20~40倍,在外部测试阶段是它的30~70倍,而到了产品发布出去时,这个数字就是40~1000倍,修正错误的代价不是随时间线性增长,而几乎是呈指数增长的。
软件未达到产品说明书表明的功能。
软件出现了产品说明书指名不会出现的错误。
软件功能超出产品说明书指名范围。
软件未达到产品说明书虽未指出但应达到的目标。
软件测试人员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。
一般我们都认为测出一个问题就是一个bug,其实这是不对的,假设测试10个问题就10个bug,而修改一出就全解决了,程序员肯定认为冤枉自己。
所有软件是文档,代码等组成的,最初的错误是来自于这些软件错误(software error),如代码中加法写成减法。软件错误导致软件缺陷(software defect),如设计缺陷,代码缺陷等,可用静态测试,如走查,静态检查,测试床(军事软件用的技术)等,软件的缺陷导致一个或多个软件故障 (software fault),故障有内部故障,外部故障,也就是我们所说的bug,软件故障导致了软件在功能操作等方面的失效(software failure)。
我们平时测的bug实际上是软件故障于失效的体现。一旦软件错误得到修改,相应的故障与失效也就解除了。这样分有助于我们定位问题,找到问题。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!