Featured image of post 谈谈Bug和它的九大近亲

谈谈Bug和它的九大近亲

测试工作,并不是所有的问题都是Bug,本文我们谈谈Bug和它那些近亲们的概念区分和处理原则

前言

测试工作中,发现Bug, 报告Bug是工作日常,也免不了和开发因为某个问题是否Bug产生争论。

虽然在Bug认定上,不同的人因视角不同,产生分歧也正常。

但在对一个产品的测试过程中,确实也不能把所有发现和遇到的问题都看作Bug,Bug 其实是一个比较笼统的叫法,有的公司还会把 Bug report 称为 故障单 或者 问题单 ,其实严格说来也不准确。 因为从概念上,Bug 还有不少和它作用和含义相近但实际又有区别的近亲们,本文我们就来梳理澄清一下 Bug 和它的这些近亲们的不同概念,以及和我们工作的关系。

故障(Fault)

故障 在日常工作中,常常被等同于 Bug,但严格来说,故障指的是软件代码或设计中的静态缺陷,比如不正确的步骤、处理过程或是数据定义。

也就是说,它更多是软件的 “内在” 问题,通常是开发者的人为错误在软件中的体现。

因为它更多是静态的,所以故障的发现,通常是在代码审查或静态分析时暴露。

案例

比如下面这段 java 代码,边界值处理时,i>=0 写成了 i>0, 会导致遍历时,第一个元素的遗漏。这就属于一个故障。

1
2
3
for (int i = arr.length - 1; i > 0; i--) {
	if (arr[i] == target) return i;
}

又或者,对于用户年龄的计算,未考虑闰年2月29日的情况,会导致结果计算错误,这也属于故障。

错误(Error)

错误是指在软件开发过程中,由开发者或其他参与者(如需求分析师、设计师)所犯的人为失误、判断失误或决策偏差。错误通常是后续其他问题的根源,它的发生,主要是人为因素导致的,如需求理解偏差、逻辑失误或是代码笔误造成的。

案例

虽然错误是“人为”的,但发生错误的类型,通常还是可以总结为有限的几种,对于测试人员早期参与来说,也能更好帮助产品识别风险。比如:

  • 逻辑错误: 开发人员在编写代码时,算法或业务逻辑的实现与预期不符。比如算法公式的错误应用。
  • 语法错误: 代码不符合编程语言的语法规则。虽然目前现代IDE都可以捕获大部分语法错误,但有时一些运行时才出现的语法或配置错误还是可能发生。
  • 需求理解错误: 对需求的理解与真实需求存在偏差,导致实现的功能并非用户真正所需。例如,“按订单大小排序”这个需求,开发实现的是按订单金额排序,但用户实际希望按订单商品数量排序。
  • 并发错误: 比如在多线程或分布式系统中,对共享资源的处理未正确同步,导致数据不一致或死锁。

缺陷(Defect)

缺陷指的是软件产品偏离需求或预期行为的任何瑕疵或不完善之处

它是一个广义的术语,通常指在软件中发现的任何不符合预期的行为或结果。通常情况下, 我们说的Bug 其实指的就是缺陷

缺陷也可以理解为故障在外部行为上的体现。

案例

  1. 用户正确输入账号密码,但登录失败或未正确跳转。
  2. 登录页面未作安全防护,导致可以无限重试暴力破解账号密码
  3. 登录错误信息过于详细,泄露敏感信息

以上这些都属于典型的功能或安全缺陷

失效(Failure)

失效软件系统或组件无法执行其应具备的功能,运行时表现出与预期不符的外部行为,是用户可直接观测到的功能偏差

它和缺陷的区别在于,并非所有的缺陷或故障都会导致失效,只有在缺陷被"激活"时,才会表现为失效

案例
  1. 用户在进行特定操作(如上传大文件)时,应用程序突然退出或服务器无响应。这可能是由于内存泄漏这样的缺陷,在长时间运行或高负载下导致资源耗尽,最终引发系统失效。
  2. 用户成功提交表单后,数据未能正确保存到数据库,导致部分数据丢失。这可能是由于数据库操作逻辑缺陷导致的失效。

因果链

以上四种不同的问题,其实形成一个如下因果链

可总结为下表:

概念定义性质发生阶段示例关联
错误 (Error)开发过程中人为失误、判断失误或决策偏差人为行为需求、设计、编码阶段错误的算法;对需求理解偏差;笔误导致故障
故障 (Fault)由错误引入的、存在于代码或文档中的不正确步骤、过程或数据定义静态代码问题编码、测试阶段闰年计算年龄的错误逻辑;未处理的空指针被激活后导致失效
缺陷 (Defect)软件系统偏离其规格说明、需求或预期行为的任何瑕疵行为偏差测试、生产阶段登录功能无法使用;报表数据不准确是故障的外部体现,被发现后需修复
失效 (Failure)软件系统或组件无法执行其所需功能,或表现出可观察到的不正确行为可观察后果生产阶段(或测试阶段中发现)系统崩溃;数据丢失;关键业务流程中断是缺陷/故障被激活的最终结果

异常(Exception)

异常程序运行时打断正常指令流的特殊事件。通常由代码逻辑错误、外部输入错误或系统资源问题引发。

异常 并不一定会导致故障, 因为异常是可以利用 try ... catch... 在代码中进行捕获并处理的。是软件在面对各种非常规场景时的正常处理组成部分。

案例

如下代码,是python语言处理网络连接异常的示例,对于网络连接状态、超时等情况在代码中进行捕获并通过重试机制进行保护。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
try:
	response = requests.get(url, timeout=5)  # 设置超时时间
	response.raise_for_status()  # 检查HTTP状态码(非2xx会抛出HTTPError)
	return response.text
except ConnectionError as e:
	print(f"连接错误: {e} (尝试 {attempt + 1}/{max_retries})")
except Timeout as e:
	print(f"请求超时: {e} (尝试 {attempt + 1}/{max_retries})")
except HTTPError as e:
	print(f"HTTP错误: {e} (状态码: {response.status_code})")
	return None  # HTTP错误通常不需要重试
except RequestException as e:
	print(f"请求异常: {e} (尝试 {attempt + 1}/{max_retries})")

问题(Issue)

用过Jira或经常逛github 应该都熟悉 Issue, Issue其实是一个通用术语,它其实指的是任何需要关注、讨论、跟踪解决的事项或障碍

很多时候,Issue其实是作为 工作项(workItem) 来使用的。所以这里的问题,其含义远远超过了狭义的缺陷错误等,问题并不是Bug,它是要跟踪并持续关注的事项。

案例

  1. 在性能测试中,我们发现随着用户量的增加,系统响应时间明显变长,并较多触发了用户的重连机制。这种现象,对用户体验有所影响,但表现其实在系统设计预期内,所以不能认为是缺陷,更适合记录为一个Issue,后续继续跟踪、观察。
  2. 需求评审时,对于有的需求,存在理解的二义性。比如一个报表统计需求,“统计一个月内的订单数量”。这里的时间表述其实就不够明确,一个月内的订单,是按订单创建时间统计还是按订单完成时间统计?这种待澄清的事项,其实也是问题 而不是缺陷.

风险(Risk)

风险可能发生并对项目目标(如质量、成本、进度、范围)产生负面影响的不确定事件

相对前述各项主要面向产品而言,风险则更多面向项目。

它主要包括两个维度:风险的发生可能性(概率)+ 风险的影响(严重程度)

除了产品本身的质量风险外,也包括项目运作的管理风险

案例

  1. 产品运行依赖第三方模块的集成,但在进入集成测试时,第三方模块尚未完成开发,因此造成本产品的进度风险
  2. 产品开发过程中,需求或设计方案发生重大调整,导致交付风险
  3. 开发或测试核心骨干离职,项目计划的风险

而除了上述的这些事项,还有一类针对软件本身持续演进过程中的一些新的idea和调整事项。这些也不能认为是Bug,但在产品发布时具备这些调整却是锦上添花。这些事项又分为两种情况,也就是优化改进

优化(Improvement)

优化对现有功能或流程进行的提升,不涉及新功能或Bug修复。如提升性能、可维护性、用户体验等。

重点是在原有基础上的提升。也不一定局限在产品本身功能上,包括研发流程、工具应用都可以纳入进来

案例

  1. 积极引入自动化测试框架,提升回归测试效率。
  2. 优化当前系统的页面UI设计,实现视觉效果的提升

改进(Enhancement)

改进则是为软件增加新功能或扩展现有功能的能力。通常由用户或业务需求驱动

改进是通过补充新的功能,是对原有需求的拓展和升华。

在测试中,对于一个问题是缺陷还是优化或改进,是经常容易产生争论的地方。

其实区分缺陷和改进的性质区别:

  • 缺陷的修复是纠正性的,意在使软件“正确”,降低质量风险
  • 改进的实现是演进性的,意在使软件“变好”,提升软件价值

案例

  1. 一个电商系统,通过增加社交分享功能,提升用户粘性。
  2. 企业管理系统,增加报表功能,提供销售数据分析,辅助决策

总结

通过对故障、缺陷、问题、错误、异常、失效、风险、优化和改进这九个和Bug有所关联的核心概念剖析。

能帮助我们更准确地描述问题、更有效地与开发人员沟通、更清晰自己的工作产出在质量体系中的作用。

使用 Hugo 构建
主题 StackJimmy 设计