1.软件缺陷的描述
1.1 软件缺陷是什么?
软件缺陷指的是系统或系统部件中那些导致系统或部件不能实现其功能的缺陷。如果在执行中遇到一个缺陷,可能引起系统的失效。那么准确有效的定义和描述软件缺陷,可以使软件缺陷得以快速修复,节约了软件测试项目的成本和资源,提高产品质量。
1.2 软件缺陷的基本描述
软件缺陷的描述是软件缺陷报告中测试人员对问题的陈述的一部分并且是软件缺陷报告的基础部分。同时,软件缺陷的描述也是测试人员就一个软件问题与开发小组交流的最初且最好的机会。一个好的描述,需要使用简单的、准确的、专业的语言来抓住缺陷的本质。
以下是软件缺陷的有效描述规则:
- 单一准确
- 可以再现
- 完整统一
- 短小简练
- 特定条件
- 补充完善
- 不做评价
1.3 软件缺陷标识和类型
软件缺陷属性包括缺陷标识、缺陷类型、缺陷严重程度、缺陷产生可能性、缺陷优先级、缺陷状态、缺陷起源、缺陷来源、缺陷原因。
- 缺陷标识:是标记某个缺陷的唯一的表示,可以使用数字序号表示。
- 缺陷类型:是根据缺陷的自然属性划分缺陷种类。见软件缺陷类型列表:
1.3.1 软件缺陷缺陷严重程度
缺陷严重程度:是指因缺陷引起的故障对软件产品的影响程度,所谓“严重性”我指的是在测试条件下,一个错误在系统中的绝对影响。见软件缺陷严重等级列表:
1.3.2 软件缺陷缺陷产生的可能性和优先级
缺陷产生的可能性:指缺陷在产品中发生的可能性,通常可以用频率来表示。
缺陷优先级:指缺陷必须被修复的紧急程度。“优先级”的衡量抓住了在严重性中没有考虑的重要程度因素。
1.3.3 软件缺陷缺陷状态
缺陷状态:指缺陷通过一个跟踪修复过程的进展情况,也就是在软件生命周期中的状态基本定义,如软件缺陷状态列表所示:
1.3.4 软件缺陷缺陷起源和来源
缺陷起源:缺陷引起的故障或事件第一次被检测到的阶段,如软件缺陷起源列表所示。
缺陷来源:指缺陷所在的地方,如文档、代码等,如软件缺陷来源列表所示。
1.3.5 软件缺陷缺陷根源
缺陷根源:指造成上述错误的根本因素,以寻求软件开发流程的改进、管理水平的提高,如软件缺陷根源列表所示。
2.软件缺陷相关的信息
2.1 软件缺陷相关的信息
软件缺陷相关的信息包括软件缺陷的图片、记录信息和如何再现和分离软件缺陷;对于某一个软件缺陷报告,测试人员应该给予相关的信息,例如捕捉到软件缺陷日志文件和图片,保证开发人员和其他的测试人员可以分离和重现它。
软件缺陷的图片、记录信息
记录软件缺陷的相关图片
一些涉及用户界面(User Interface)的软件缺陷可能很难用文字清楚地描述,因此软件测试人员通过附上图片比较直观地表示缺陷发生在产品界面什么位置、有什么问题等。
使用Soft-ICE记录软件缺陷信息
Soft-ICE 是 Compuware公司的产品NuMega DriverStudio中一个代表性的工具,用于跟踪软件运行时的变量、内存等状态,而且可以捕捉系统崩溃时的状态。使用它可以记录产品发生缺陷的地方,同时生成日志文件。
2.1.1 如何使用Soft-ICE
当出现软件系统崩溃的缺陷时,测试人员需要在软件缺陷报告上附上日志文件,便于开发人员即时修复软件缺陷。
当遭遇软件崩溃时候,如何使用Soft-ICE?在开始测试之前,已经安装了Soft-ICE并启动了“faults on”的命令。当软件发生崩溃现象时,可以使用下面命令去捕捉必要的信息:
stack
u eip-80
如果数据窗口是开启的状态,可以输入”wd”来关闭该窗口,然后再输入 “dd esp-20”命令。stack 、dd esp-20是为了标注跟踪信息。
通过输入"x",退出 Soft-ICE的窗口;如果还是无法退出Soft-ICE,需要输入faults off",然后输入"x"。
打开Soft-ICE应用程序,立即保存日志文件。一旦再次打开Soft-ICE,请输入"faults on"
2.2 分离和再现软件缺陷
为了有效地再现软件缺陷,除了按照软件缺陷的有效描述规则来描述软件缺陷,还要遵循软件缺陷分离和再现的方法和具有较高的技巧性,虽然有时少数几个缺陷很难再现、或者根本无法再现。以下就介绍如何分离和再现缺陷的一些常用方法和技巧。
- 确保所有的步骤都被记录。
- 特定条件和时间。
- 压力和负荷、内存和数据溢出相关的边界条件。
- 考虑资源依赖性包括内存、网络和硬件共享的相互作用等。
- 不能忽视硬件。与软件不同,硬件不按预定方式工作。
2.3 分离和调试软件缺陷之间的区别
讨论分离和调试软件缺陷之间的区别,是为了划清测试人员与开发人员的责任,增加界限的清晰度与测试资源的控制能力。面对一个软件缺陷时,开发人员或测试人员为了修复它,会提出一系列分步骤地、处理缺陷的疑问:
- 再现软件缺陷现象所需的最少步骤有哪些?这些步骤成功再现的可能性多大?
- 软件缺陷是否成立存在?换句话说,测试结果是否可能起源于测试因素或者测试人员自身的错误,还是影响顾客需求的、系统真正的故障?
- 哪些外部因素产生软件缺陷?
- 哪些内部因素,是代码、网络、还是环境引起的软件缺陷?
- 怎样才能在不产生新的缺陷的条件下使这个软件缺陷得到修复?
- 这种修复是否经过调试,单元是否经过测试?
- 问题解决了吗?它是否通过了确认和回归测试,确定系统的其余部分仍工作正常?
3.软件缺陷的处理和跟踪
- 确保每个被发现的缺陷都能够被解决,“解决”的意思不一定是被修正,也可能是其他处理方式(例如,延迟到下一个版本中修正或者由于技术原因不能被修正),总之,对每个被发现的BUG的处理方式必须能够在开发组织中达到一致;
- 收集缺陷数据并根据缺陷趋势曲线识别测试处于测试过程中的哪个阶段;
- 决定测试过程是否结束,通过缺陷趋势曲线来确定测试过程是否结束是常用并且较为有效的一种方式。
- 收集缺陷数据并在其上进行数据分析,作为组织过程改进的财富。
3.2 简单、优化的软件缺陷生命周期
生命周期的概念是一个物种从诞生到消亡经历了不同的生命阶段,那么软件缺陷生命周期应该指的是一个软件缺陷被发现、报告到这个缺陷被修复、验证直至最后关闭的完整过程。在整个软件缺陷生命周期中,通常是以改变软件缺陷的状态来体现不同的生命阶段。因此,对于一个软件测试人员来讲,需要关注软件缺陷在生命周期中的状态的变化,来跟踪项目进度和软件质量。一个简单、优化的软件缺陷生命周期:
发现-打开:测试人员找到软件缺陷并将软件缺陷提交给开发人员。
打开-修复:开发人员再现、修复缺陷,然后提交给测试人员去验证。
修复-关闭:测试人员验证修复过的软件,关闭已不存在的缺陷。
3.3 复杂的软件缺陷生命周期
在实际工作中,软件缺陷的生命周期不可能像如上那么简单,需要考虑其它各种情况,给出了一个复杂的软件缺陷生命周期的例子,
如图所示:
3.4 软件缺陷生命周期综述
综上所述,软件缺陷在生命周期中经历了数次的审阅和状态变化,最终测试人员关闭软件缺陷来结束软件缺陷的生命周期。软件缺陷生命周期中的不同阶段是测试人员、开发人员和管理人员一起参与、协同测试的过程。软件缺陷一旦发现,便进入测试人员、开发人员、管理人员的严密监控之中,直至软件缺陷生命周期终结,这样即可保证在较短的时间内高效率地关闭所有的缺陷,缩短软件测试的进程,提高软件质量,同时减少开发、测试和维护成本。
3.5 软件缺陷处理技巧
管理员、测试人员和开发人员需要掌握在软件缺陷生命周期的不同阶段处理软件缺陷技巧,从而尽快处理软件缺陷,缩短软件缺陷生命周期。以下列出处理软件缺陷基本技巧:
- 审阅。当测试人员在缺陷跟踪数据库中输入了一个新的缺陷时,测试员应该提交它,以便在它能够起作用之前进行审阅。这种审阅可以由测试管理员、项目管理员或其他人来进行,主要审阅缺陷报告的质量水平;
- 拒绝。如果审阅者决定需要对一份缺陷报告进行重大修改,例如需要添加更多的信息或者需要改变缺陷的严重等级,应该和测试人员一起讨论,由测试人员纠正缺陷报告,然后再次提交;
- 完善。如果测试员已经完整地描述了问题的特征并将其分离,那么审查者就会肯定这个报告;
- 分配。当开发组接受完整描述特征并被分离的问题时,测试员会将它分配给适当的开发人员,如果不知道具体开发人员,应分配给项目开发组长,由开发组长再分配给对应的开发人员;
- 测试。一旦开发人员修复一个缺陷,它就将进入测试阶段。缺陷的修复需要得到测试人员的验证,同时还要进行回归测试,检查这个缺陷的修复是否会引入新的问题;
- 重新打开。如果这个修复没有通过确认测试,那么测试人员将重新打开这个缺陷报告。重新打开一个缺陷,需要加注释说明,否则会引起“打开-修复”多个来回,造成测试人员和开发人员不必要的矛盾
- 关闭。如果修复通过验证测试,那么测试人员将关闭这个缺陷。只有测试人员有关闭缺陷的权限,开发人员没有这个权限。
- 暂缓。如果每个人都同意将确实存在的缺陷移到以后处理,应该指定下一个版本号或修改的日期。一旦新的版本开始时,这些暂缓的缺陷应该重新被打开。
- 测试人员、开发人员和管理者只有紧密的合作,掌握软件缺陷处理技巧,在项目不同阶段,及时的审查、处理和跟踪每个软件缺陷,加速软件缺陷状态的变换,提高软件质量,促进项目的发展。
3.6 软件缺陷跟踪系统
到目前为止所讲述的一切表面上看起来很好,但是运用到实践中还需要软件缺陷跟踪系统,以便描述报告所发现的缺陷,处理软件缺陷属性,跟踪软件缺陷的整个生命周期和生成软件缺陷跟踪图表等。为什么需要建立一套软件缺陷跟踪系统呢?因为它会让我们受益无穷,概括起来有:
- 软件缺陷跟踪系统拥有软件缺陷跟踪数据库,它不仅有利于软件缺陷的清楚描述,还提供统一的、标准化报告,使所有人的理解一致;
- 缺陷跟踪数据库允许自动连续的软件缺陷编号,还提供了大量供分析和统计的选项,这是手工方法无法实现的;
- 基于缺陷跟踪数据库,可快速生成满足各种查询条件的、所必要的缺陷报表、曲线图等,开发小组乃至公司的每一个人都可以随时掌握软件产品质量的整体状况、或测试/开发的进度;
- 缺陷跟踪数据库提供了软件缺陷属性并允许开发小组根据对项目的相对和绝对重要性来修复缺陷;
- 可以在软件缺陷的生命期中管理缺陷,从最初的报告到最后的解决。确保了每一个缺陷不会被忽略,同时,它还可以使注意力保持在那些必须尽快修复的重要缺陷上;
- 当缺陷在它的生命周期中变化时,开发人员,测试人员以及管理人员将熟悉新的软件缺陷信息。一个设计良好的软件缺陷跟踪系统可以获取历史记录,并在检查缺陷的状态时参考历史记录;
- 在软件缺陷跟踪数据库中关闭每一份缺陷报告,它都可以被记录下来。当产品送出去时,每一份未关闭的缺陷报告都提供了预先警告的有效技术支持,并且证明测试人员找到特殊领域突然出现的事件中的软件缺陷。
任何一个缺陷跟踪系统的核心都是“软件缺陷报告”,一份软件缺陷报告详细信息如表:
软件缺陷项目列表
3.8 软件缺陷的详细描述
软件缺陷的详细描述,如上所述,由三部分组成:操作/重现步骤、期望结果、实际结果,有必要再做进一步的讨论:
- “步骤”提供了如何重复当前缺陷的准确描述,应简明而完备、清楚而准确。这些信息对开发人员是关键的,视为修复缺陷的向导,开发人员有时抱怨糟糕的缺陷报告,往往集中在这里;
- “期望结果”与测试用例标准或设计规格说明书或用户需求等一致,达到软件预期的功能。测试人员站在用户的角度要对它进行描述,它提供了验证缺陷的依据。
- “实际结果”测试人员收集的结果和信息,以确认缺陷确实是一个问题,并标识那些影响到缺陷表现的要素。
3.9 缺陷报告的示例
一份优秀的缺陷报告记录下最少的重复步骤,不仅包括了期望结果,实际结果和必要的附件,还提供必要的数据、测试环境或条件,以及简单的分析。
而一份含糊而不完整的缺陷报告,缺少重建步骤,并且没有期望结果、实际结果和必要的图片,如下描述。
一份散漫的缺陷报告(无关的重建步骤,以及对开发人员理解这个错误毫无帮助的结果信息)如下描述:
4.0 缺陷跟踪数据库信息
项目中使用Microsoft Excel 电子表格或Word 文档来记录和跟踪软件缺陷,但一般只限于最后的分析报告、文档的打印。为了灵活地存储、操作、搜索、分析以及报告大量数据,我们需要建一个数据库。
基于已经讨论过的内容,就比较容易建立一个软件缺陷跟踪数据库,可以使用Microsoft Access或SQL server,也可以使用Oracle、DB2 等关系数据库管理系统。一个缺陷跟踪数据库的基本表,将要包括多达几十项的数据项,如bug的ID号、标题(Title)、状态、严重程度、优先级、重现步骤、期望结果、实际结果、项目名称、模块、报告作者、日期等等。
所有缺陷的数据不仅要存储在共享数据库中,还要有相关的数据连接,如产品特性数据库、产品配置数据库、测试用例数据库等的集成。因为某个缺陷是和某个产品特性、某个软件版本、某个测试用例等相关联的,有必要建立起这些关联。同时为了提高缺陷处理的效率,还有和邮件服务器集成,通过邮件传递,测试和开发人员随时可以获得由系统自动发出有关缺陷状态变化的邮件。
4.1 软件缺陷为何发生:根本原因图表
分析软件缺陷根本原因不仅有助于测试人员决定哪些功能领域需要增强测试,而且可以使开发人员的注意力集中到那些引起最严重,最频繁的领域。如下图显示了软件缺陷产生的3个主要来源区域——用户界面显示,逻辑和规格说明书——占据发现软件缺陷总数的75%。如果从测试风险角度看,这些区域可能是隐藏缺陷比较多的地方,需要测试更细、更深些。从开发角度来说,这些是代码质量提高的主要区域,假定某个产品前后发现10000个Bug,代码在这三个区域减少10个百分点,则总Bug数能减少750(7.5%),代码质量改善效果就很显著。