前言
测试工作中,发现Bug, 报告Bug是工作日常,也免不了和开发因为某个问题是否Bug产生争论。
虽然在Bug认定上,不同的人因视角不同,产生分歧也正常。
但在对一个产品的测试过程中,确实也不能把所有发现和遇到的问题都看作Bug,Bug
其实是一个比较笼统的叫法,有的公司还会把 Bug report
称为 故障单
或者 问题单
,其实严格说来也不准确。 因为从概念上,Bug 还有不少和它作用和含义相近但实际又有区别的近亲们,本文我们就来梳理澄清一下 Bug 和它的这些近亲们的不同概念,以及和我们工作的关系。
故障(Fault)
故障
在日常工作中,常常被等同于 Bug,但严格来说,故障指的是软件代码或设计中的静态缺陷,比如不正确的步骤、处理过程或是数据定义。
也就是说,它更多是软件的 “内在” 问题,通常是开发者的人为错误在软件中的体现。
因为它更多是静态的,所以故障的发现,通常是在代码审查或静态分析时暴露。
案例
比如下面这段 java 代码,边界值处理时,i>=0
写成了 i>0
, 会导致遍历时,第一个元素的遗漏。这就属于一个故障。
|
|
又或者,对于用户年龄的计算,未考虑闰年2月29日的情况,会导致结果计算错误,这也属于故障。
错误(Error)
错误
是指在软件开发过程中,由开发者或其他参与者(如需求分析师、设计师)所犯的人为失误、判断失误或决策偏差。错误通常是后续其他问题的根源,它的发生,主要是人为因素导致的,如需求理解偏差、逻辑失误或是代码笔误造成的。
案例
虽然错误是“人为”的,但发生错误的类型,通常还是可以总结为有限的几种,对于测试人员早期参与来说,也能更好帮助产品识别风险。比如:
- 逻辑错误: 开发人员在编写代码时,算法或业务逻辑的实现与预期不符。比如算法公式的错误应用。
- 语法错误: 代码不符合编程语言的语法规则。虽然目前现代IDE都可以捕获大部分语法错误,但有时一些运行时才出现的语法或配置错误还是可能发生。
- 需求理解错误: 对需求的理解与真实需求存在偏差,导致实现的功能并非用户真正所需。例如,“按订单大小排序”这个需求,开发实现的是按订单金额排序,但用户实际希望按订单商品数量排序。
- 并发错误: 比如在多线程或分布式系统中,对共享资源的处理未正确同步,导致数据不一致或死锁。
缺陷(Defect)
缺陷
指的是软件产品偏离需求或预期行为的任何瑕疵或不完善之处。
它是一个广义的术语,通常指在软件中发现的任何不符合预期的行为或结果。通常情况下, 我们说的Bug
其实指的就是缺陷
缺陷也可以理解为故障
在外部行为上的体现。
案例
- 用户正确输入账号密码,但登录失败或未正确跳转。
- 登录页面未作安全防护,导致可以无限重试暴力破解账号密码
- 登录错误信息过于详细,泄露敏感信息
以上这些都属于典型的功能或安全缺陷
失效(Failure)
失效
指软件系统或组件无法执行其应具备的功能,运行时表现出与预期不符的外部行为,是用户可直接观测到的功能偏差。
它和缺陷
的区别在于,并非所有的缺陷或故障都会导致失效,只有在缺陷被"激活"时,才会表现为失效
案例
- 用户在进行特定操作(如上传大文件)时,应用程序突然退出或服务器无响应。这可能是由于内存泄漏这样的缺陷,在长时间运行或高负载下导致资源耗尽,最终引发系统失效。
- 用户成功提交表单后,数据未能正确保存到数据库,导致部分数据丢失。这可能是由于数据库操作逻辑缺陷导致的失效。
因果链
以上四种不同的问题,其实形成一个如下因果链
可总结为下表:
概念 | 定义 | 性质 | 发生阶段 | 示例 | 关联 |
---|---|---|---|---|---|
错误 (Error) | 开发过程中人为失误、判断失误或决策偏差 | 人为行为 | 需求、设计、编码阶段 | 错误的算法;对需求理解偏差;笔误 | 导致故障 |
故障 (Fault) | 由错误引入的、存在于代码或文档中的不正确步骤、过程或数据定义 | 静态代码问题 | 编码、测试阶段 | 闰年计算年龄的错误逻辑;未处理的空指针 | 被激活后导致失效 |
缺陷 (Defect) | 软件系统偏离其规格说明、需求或预期行为的任何瑕疵 | 行为偏差 | 测试、生产阶段 | 登录功能无法使用;报表数据不准确 | 是故障的外部体现,被发现后需修复 |
失效 (Failure) | 软件系统或组件无法执行其所需功能,或表现出可观察到的不正确行为 | 可观察后果 | 生产阶段(或测试阶段中发现) | 系统崩溃;数据丢失;关键业务流程中断 | 是缺陷/故障被激活的最终结果 |
异常(Exception)
异常
是程序运行时打断正常指令流的特殊事件。通常由代码逻辑错误、外部输入错误或系统资源问题引发。
异常
并不一定会导致故障
, 因为异常是可以利用 try ... catch...
在代码中进行捕获并处理的。是软件在面对各种非常规场景时的正常处理组成部分。
案例
如下代码,是python语言处理网络连接异常的示例,对于网络连接状态、超时等情况在代码中进行捕获并通过重试机制进行保护。
|
|
问题(Issue)
用过Jira
或经常逛github
应该都熟悉 Issue
, Issue其实是一个通用术语,它其实指的是任何需要关注、讨论、跟踪解决的事项或障碍。
很多时候,Issue其实是作为 工作项(workItem) 来使用的。所以这里的问题
,其含义远远超过了狭义的缺陷
或错误
等,问题并不是Bug,它是要跟踪并持续关注的事项。
案例
- 在性能测试中,我们发现随着用户量的增加,系统响应时间明显变长,并较多触发了用户的重连机制。这种现象,对用户体验有所影响,但表现其实在系统设计预期内,所以不能认为是缺陷,更适合记录为一个Issue,后续继续跟踪、观察。
- 需求评审时,对于有的需求,存在理解的二义性。比如一个报表统计需求,“统计一个月内的订单数量”。这里的时间表述其实就不够明确,一个月内的订单,是按订单创建时间统计还是按订单完成时间统计?这种待澄清的事项,其实也是
问题
而不是缺陷
.
风险(Risk)
风险
是可能发生并对项目目标(如质量、成本、进度、范围)产生负面影响的不确定事件。
相对前述各项主要面向产品而言,风险则更多面向项目。
它主要包括两个维度:风险的发生可能性(概率)+ 风险的影响(严重程度)
除了产品本身的质量风险外,也包括项目运作的管理风险。
案例
- 产品运行依赖第三方模块的集成,但在进入集成测试时,第三方模块尚未完成开发,因此造成本产品的进度风险
- 产品开发过程中,需求或设计方案发生重大调整,导致交付风险
- 开发或测试核心骨干离职,项目计划的风险
而除了上述的这些事项,还有一类针对软件本身持续演进过程中的一些新的idea和调整事项。这些也不能认为是Bug,但在产品发布时具备这些调整却是锦上添花。这些事项又分为两种情况,也就是优化
和 改进
优化(Improvement)
优化
是对现有功能或流程进行的提升,不涉及新功能或Bug修复。如提升性能、可维护性、用户体验等。
重点是在原有基础上的提升。也不一定局限在产品本身功能上,包括研发流程、工具应用都可以纳入进来
案例
- 积极引入自动化测试框架,提升回归测试效率。
- 优化当前系统的页面UI设计,实现视觉效果的提升
改进(Enhancement)
改进
则是为软件增加新功能或扩展现有功能的能力。通常由用户或业务需求驱动
改进是通过补充新的功能,是对原有需求的拓展和升华。
在测试中,对于一个问题是缺陷还是优化或改进,是经常容易产生争论的地方。
其实区分缺陷和改进的性质区别:
缺陷
的修复是纠正性的,意在使软件“正确”,降低质量风险改进
的实现是演进性的,意在使软件“变好”,提升软件价值
案例
- 一个电商系统,通过增加社交分享功能,提升用户粘性。
- 企业管理系统,增加报表功能,提供销售数据分析,辅助决策
总结
通过对故障、缺陷、问题、错误、异常、失效、风险、优化和改进这九个和Bug有所关联的核心概念剖析。
能帮助我们更准确地描述问题、更有效地与开发人员沟通、更清晰自己的工作产出在质量体系中的作用。