1947年9月9日,哈佛大学测试马克II型艾肯中继器计算机, *** 作员在电板编号为70的中继器触点旁发现了一只飞蛾。然后 *** 作员把飞蛾贴在计算机日志上了,并写下了“首个发现bug的实际案例”。他们提出了一个词,“debug(调试)”了机器,从而引入新术语“debugging a computer program(调试计算机程序)”。
In 1988, the log, with the moth still taped by the entry, was in the Naval Surface Warfare Center Computer Museum at Dahlgren, Virginia.
1988年,这个仍然贴着飞蛾的日志,保存于弗吉尼亚州达尔格伦的海军水面作战中心计算机博物馆。
以下的两句话明确了缺陷的产生。
软件缺陷的产生主要有软件产品的特点和开发过程决定的。比如需求不够清晰,频繁变更等;或者软件由于竞争非常激烈,技术日新月异,使用新技术也容易产生问题。大致有以下几种主要原因:
软件测试就是为了更早、更快的发现缺陷。换句话说,缺陷的发现可以看作是测试工作的主要成果之一。软件缺陷管理的实施,至少有如下三个基本目的:
软件缺陷(Defect),常常又被叫做Bug。 所谓软件缺陷,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。
bug 和 defect
飞蛾或者虫子爬进主机引起短路,造成计算机失效的事件中,我们可以看到bug就是虫子或者是虫子引发失效这样的事件。那么defect又是什么呢?
真正的Defect是计算机维护工程师提出来的那个问题:在主机的散热孔那里可以加装一层更加细密的金属网,即不影响散热,又可以防止虫子爬到主机里。这是计算机设计人员疏忽的地方,是产品真正的Defect。而虫子引发的那个故障只是这个Defect导致的故障的其中一种表现形式。也就是说,Bug是Defect的一种表现形式,而一个Defect是可以引起多种Bug的。
软件测试使用各种术语描述软件出现的问题,通用的术语如下:
在可以预见的时期内,软件仍将由人来开发。在整个软件生存期的各个阶段,都贯穿者人的直接或间接的干预。然而,人难免犯错误,这必然给软件留下不良的痕迹。软件错误是指在软件生存期内的不希望或不可接受的人为错误,其结果是导致软件缺陷的产生。可见,软件错误是一种人为过程,相对于软件本身,是一种外部行为。
软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,如少一个逗号、多一语句等。其结果是软件运行于某一特定条件时出现软件故障,这时称软件缺陷被激活。
软件故障是指软件运行过程中出现的一种不希望或不可接受的内部状态。譬如,软件处于执行一个多余循环过程时,我们说软件出现故障。此时若无时当的措施(容错)加以及时处理,便产生软件失效。显然,软件故障是一种动态行为。
软件失效是指软件运行时产生 的一种不希望或不可接受的外部行为结果。失效是指功能部件执行其规定功能的能力丧失。软件失效是指软件运行时产生的一种不希望或不可接受的外部行为。
软件错误是一种人为错误。一个软件错误必定产生一个或多个软件缺陷。当一个软件缺陷被激活时,便产生一个软件故障;同一个软件缺陷在不同条件下被激活,可能产生不同的软件故障。软件故障如果没有集市的容错措施加以处理,便不可避免地导致软件失效;同一个软件故障在不同条件下可能产生不同的软件失效。
测试执行过程中,发现软件失效后,提出书面的报告,提供给开发人员或者其他负责人员作为定位缺陷的依据,也作为日后缺陷度量的数据依据。
软件缺陷的描述是软件缺陷报告的基础部分,也是测试人员就一个软件问题与开发小组交流的最初并且最好的机会。一个好的描述,需要使用简单、准确、专业的语言来抓住缺陷的本质。否则,它就会使信息含糊不清,可能会误导开发人员。因此,准确的报告软件缺陷是非常重要的。
软件缺陷的属性从大的方面包括以下几部分:
综上所述,一个完整的缺陷报告需要包括以下内容。
| 缺陷的状态| 描述 |
| ---------------------------- | ----------------------- |
| 激活的或打开的(Active or Open) | 缺陷的起始状态,问题还没有解决,等待修复|
| 已修正的或已修复的(Fixed or Resolved) | 已被开发人员检查和修复,等待验证人员验证|
| 关闭的或非激活的(Close or Inactive) | 验证通过,确认缺陷已经可以关闭|
| 重新打开 (Reopen)| 验证不通过,需要|
| 推迟 (Deferred)| 缺陷不严重,在下一个版本中解决|
| 保留 (On hold)| 由于技术原因或者其他原因,暂时无法解决|
| 功能增强| 发现的缺陷符合当前说明书。是一个有待改进的问题 |
| 不是缺陷||
| 不能重现||
| 需要更多信息 ||
| 缺陷的严重级别 | 描述 |
| ------------ | -------------------------------- |
| 致命(Fatal)| 系统的主要功能完全失效,用户利益受到损失、系统崩溃、死机等|
| 严重(Critical) | 系统的主要功能部分失效,数据无法保存、提供的服务受到影响|
| 一般(Major)| 系统的次要功能没有完全实现,不影响用户的正常使用,如提示不准确等 |
| 较小(Minor)| 用户体验不好,不影响功能实现 |
| 缺陷的优先级 | 描述 |
| -------- | ----------------------- |
| 立即解决(P1) | 缺陷导致系统不可使用,无法测试或者测试无法继续 |
| 高优先级(P2) | 缺陷严重,影响测试,需要优先考虑|
| 正常排队(P3) | 缺陷需要正常排队等待修复|
| 低优先级(P4) | 缺陷可以在开发人员有时间的时候被修正 |
缺陷的严重性和优先级是含义不同但相互联系密切的两个概念。它们都从不同的侧面描述了软件缺陷对软件质量和最终用户的影响程度和处理方式。
一般地,严重性程度高的软件缺陷具有较高的优先级。严重性高说明缺陷对软件造成的质量危害性大,需要优先处理,而严重性低的缺陷可能只是软件不太尽善尽美,可以稍后处理。
但是,严重性和优先级并不总是一一对应。有时候严重性高的软件缺陷,优先级不一定高,甚至不需要处理,而一些严重性低的缺陷却需要及时处理,具有较高的优先级。
生命周期的概念是从诞生到消亡所经历的过程。软件缺陷经历了从被发现、报告、到其被修复、验证、直至最后关闭的过程。为了完整的描述这个过程,设定了不同阶段的缺陷状态来体现缺陷不同的生命阶段。对于测试人员来说,需要关注软件缺陷状态的变化,并和开发人员保持良好的沟通,使缺陷能够及时得到处理和修正。
缺陷状态的跟踪
缺陷趋势的分析
缺陷分布分析
累计缺陷趋势分析
本文首发于【 林子的空间 】
“这次发布之前怎么这么多的缺陷,是不是需要分析一下啊?”
答案是肯定的,可是这个时候才想起要分析已经有点晚了,有可能这些缺陷很难分析了。这是发生过的一个真实场景,所记录的缺陷包含信息很有限,很难有效的做好分析!本文就来聊聊如何有效的管理和分析缺陷。
缺陷是一项非常有价值的资产,软件缺陷的管理分为两个部分:缺陷信息收集和缺陷分析。
无效的缺陷记录
信息繁冗
有的项目团队要求详细记录缺陷的多个维度信息,而且大部分都是必填字段,比如详细的重现步骤,对于有些特别简单的缺陷来讲是没必要的,关键是信息能够说明缺陷即可,过分详细的要求会带来更大的浪费。
曾经有个项目是在QC(Quality Center)里记录缺陷,需要填写很多必填属性字段,没有办法灵活根据具体缺陷调整,加上QC服务器在国外,访问速度非常的慢,每次记录缺陷成为了大家极其痛苦的一件事情。
信息缺失
也有的项目对缺陷的格式和属性没有严格要求,记录的时候很简单也很自由,这样记录的缺陷由于很多必要信息的缺失,对后续的跟踪和分析也是极为不利。
比如前面提到的在QC里记录缺陷的那个项目,由于太痛了,很多时候,QA发现了缺陷也不愿意往QC里填,而是直接写个纸条简单记录下,验证完了它的生命周期就结束了,这样后面就没办法去很好的跟踪和分析了。(题外话:当时采用脚本往QC里记录缺陷,稍微减轻了点痛苦。)
无效信息
还有一种情况就是记录缺陷时同样有一些属性要求填写,但是这些属性值可能不是那么有意义,导致存储的信息不仅没用,反而添加混乱,也是不利于跟踪和分析的。
比如,其中的“根因(root cause)”属性的值如下表所示,这些值根本就不是根因,这是一个没有意义的捣乱属性。
缺陷信息收集的正确做法
缺陷信息收集应该做到尽量简单,且包含必要的信息。
- 标题:言简意赅,总结性的语句描述是什么缺陷
- 详情:包括重现步骤、实际行为、期望结果等,根据具体情况确定其详细程度,必要时可以添加截图、日志信息等附加说明。
- 重要属性:优先级、严重性、所属功能模块/产品、平台(OS、Web浏览器、移动设备的不同型号等)、环境、根因等,这些属性对应的值需要根据不同项目的情况自己定义,其中“根因”是相当关键的一个属性,后面有示例可以参考该属性对应的值有哪些。
- 其他:每个项目对应的还会有其他信息需要记录的,自行定义就好。
缺陷报告时机
在敏捷开发环境中,测试人员可能随时在测试、随时都会发现缺陷,包括还在开发手里没有完成的功能。什么时候发现的缺陷需要记录呢?通常情况下,有以下几种情况:
- 开发还没完成的用户故事(story),测试人员发现缺陷只需要告诉开发修了,在该故事验收的时候一起检查就好了,无需单独记录;
- 在开发已经完成,交到测试人员手里正式测试的故事,再发现缺陷就需要记录来跟踪了;
- 后续的所有阶段发现的缺陷都需要记录。
比较推荐的一种缺陷分析方法是鱼骨图分析法,可以将跟缺陷相关的各个因素填写到鱼骨图里,对缺陷进行分析,如下图2示:
缺陷相关的各属性拿到了,就可以用表格、曲线图、饼图等统计各个属性对应的缺陷数量,分析缺陷的趋势和原因。下面是我在项目上做过的分析报告图:
分析完得到统计的结果就要采取对应的措施,从而防范更多的缺陷产生。比如:
- 修缺陷(上面示例中的“bug fixing”)引入的新缺陷比较多,可以在修复缺陷后添加对应的自动化测试;
- 浏览器兼容性问题相关的缺陷较多的话,可以在开发完成验收的时候在各个主流浏览器上验收等等。
什么时候该进行缺陷的分析也是需要搞清楚的一个问题。通常,推荐每个迭代周期分析一次,并且跟以往各个迭代进行对比,进行趋势对比。当然,有时候可能一个迭代发现的缺陷非常少,分析的周期可以适当延长,两个迭代合并分析一次也是可以的。还可能某个迭代突发紧急缺陷,那就可能需要立马分析。
缺陷记录是为更好的跟踪和分析缺陷做准备的,而缺陷分析是软件质量保证的重要环节,对于软件过程的改进,软件产品的发布来说具有十分重要的参考价值,建议各项目都把缺陷分析作为常规实践开展起来。
缺陷记录是为更好的跟踪和分析缺陷做准备的,而缺陷分析是软件质量保证的重要环节,对于软件过程的改进,软件产品的发布来说具有十分重要的参考价值,建议各项目定期都要做做缺陷分析。
缺陷管理流程图
在 QC 中,缺陷的管理流程:
流程中的角色: 1、 测试人员:进行测试的人员,缺陷的发起者; 2、 开发人员:执行开发任务的人员,完成实际的设计和编码工作; 3、 评审委员会:对缺陷进行最终确认,在项目成员对缺陷达不成一致意见时,行使仲裁权力。
缺陷的状态 1、 New:缺陷的初始状态; 2、 Open:开发人员开始修改缺陷; 3、 Fixed:开发人员修改缺陷完毕; 4、 Closed:回归测试通过,关闭缺陷; 5、 Reopen:回归测试失败; 6、 postpone:推迟修改; 7、 Rejected:开发人员拒绝缺陷; 8、 Duplicate:已提交的Defect重复; 9、 Abandon:放弃
Bug****严重级别(Severity,Bug级别) :是指因缺陷引起的故障对软件产品的影响程度,由测试人员指定。
| A-Crash | 造成系统或应用程序崩溃、死机、系统挂起,或造成数据丢失 |
| B-Major | 系统的主要功能部分丧失、数据不能保存,单个功能失效导致多个相关功能均失效 |
| C-Minor | 次要功能没有完全实现但不影响使用 |
| D-Trivial | 使 *** 作者不方便或遇到麻烦,但它不影响功能的 *** 作和执行 |
| E-Nice to Have(建议) | 建设性的意见或建议 |
Bug的严重等级定义:
1)使用频率
2)影响程度
3)出现概率
****Bug的优先级定义:****
1)对其他模块的影响
2)对自身模块的影响
3)对当前功能点的影响
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)