分析Bug的维度

本文从测试人员的角度,尝试梳理出一些常见的Bug根本原因分析的维度,并列举每个维度中的根本原因的例子。

在软件开发交付过程中,难免会出现Bug。针对每一个已发现问题的Bug,完成修复工作后,我们可以对其进行全面的根本原因分析。本文从测试人员的角度,尝试梳理出一些常见的Bug根本原因分析的维度,并列举每个维度中的根本原因的例子。

一、Bug分析的维度

建议尽量用便于统计和维护的方式,记录分析的结果(比如使用Jira系统提供的label功能,下文中括号内的英文是可参考的label名称),以便周期性地进行全面的Bug分析。

每个Bug常见的可用于分析的根因维度如下:

1.Bug发现的环境 (Env)

(1) 维度定义:

描述该Bug是在什么环境中被测试人员/开发团队成员/客户/用户发现的。

(2) 分析目的:

正常来讲软件开发过程中,越早发现问题,修复问题所需要的成本也就越小。为此,需要关注开发过程中的问题是否可以在早期被发现。

分析此维度可以评估现在项目的Bug发现时机。制定针对性的改进措施,以保证Bug可以被尽早发现。

(3) 维度示例:

各个项目所拥有的测试环境并不相同,请根据实际情况来进行分类。

  • 开发环境/测试环境 (参考Label名:Env_QA / Env_DEV) 。项目人员最常接触的环境,也是链条最前端的环境。大部分的Bug应该在此被发现。
  • 集成环境(Env_Integration) 。常用于连接到外部或其他团队系统的环境,容易发现外部集成相关的Bug。
  • 用户验收环境 / 预发布环境(Env_UAT / Env_Pre-release / Env_Rehearsal) 。客户对交付的系统做验收测试或上线前演练/回归用的环境,数据和环境配置都会更贴近生产环境。
  • 生产环境 (Env_Production) 。真正提供给线上用户的环境,生产环境发现的Bug拥有较高的处理优先级。
2.Bug引入时机 (Timing)

(1) 维度定义: 

描述引发该Bug的代码/配置是在什么时机或者什么活动中被引入到产品中的。

(2) 分析目的:

通过分析Bug的引入时机,有机会识别出质量保证体系中薄弱的点,或团队在开发/测试流程中的问题。

(3) 维度示例:

常见的引入时机如下:

  • 开发新需求时产生的新功能的Bug(Timing_Developing_New_Requirement)。在开发新功能时,产生的新功能中的行为与需求不符的问题。
  • 开发新需求时破坏原有功能 (Timing_Developing_Other_Requirement) 。在开发新功能时,破坏了原有的已验收过的功能的正确行为。
  • 修复Bug破坏原有功能(Timing_Fix_Bug)。在修复其他Bug时,引入了新Bug。
  • 重构破坏原有功能(Timing_Refoctor)。在对代码进行重构的过程中,导致原有功能被破坏。虽然正常来讲重构活动是会在开发新卡时一起进行,理应分在开发新功能时机,但是考虑到重构行为的特殊性,以及为了后期分析重构时是否有足够的自动化测试保证原功能正常工作。可以视情况把重构单独作为一个引入时机进行分析。
  • 前人代码遗留的Bug(Timing_Legacy_Issue)。中途接手的项目,在团队入场前就存在的问题。或者超出目前项目预期范围的原有问题。一般PM会更加关注此类问题,以防团队为遗留问题花费太多effort,影响正常工作的展开和新需求的交付进度。
  • 部署环境或运行脚本(Timing_Env_Deployment_or_Script)。在部署/配置环境过程中引发的问题,或直接操作数据库数据引发的问题。
  • 不属于Bug(Timing_Not_Bug) 。有时会发现该问题不属于Bug,本文后面会详细叙述这种情况。
3.Bug所属的前后端/微服务/功能模块

(1) 维度定义:

描述该Bug的代码问题出现在前后端/微服务/功能模块。

(2) 分析目的:

统计前后端/微服务/功能模块的Bug比例分布,后续可以有针对性地进行补充自动化测试及分配测试资源。

(3) 维度示例:

各个项目所拥有的前后端并不相同,可以根据实际情况来进行分类。

4.Bug产生的直接代码原因 (Root Cause)

(1) 维度定义:

描述引发该Bug的代码的问题,可以与开发人员合作来分析。

(2) 分析目的:

结合下一个维度,评估团队人员上下文以及技术的掌握情况。通过进行session/文档同步上下文的方式进行查漏补缺。

(3) 维度示例:

  • 代码业务逻辑错误 (RC_wrong_bussiness_logic) 。代码实现时对业务的错误理解或者遗漏,导致了代码逻辑跟业务逻辑不一致。
  • 代码边界条件/Edge case未覆盖 (RC_uncovered_edge_case) 。代码实现时遗漏了某些业务场景/遗漏了对某些接口或函数的特殊返回值的处理。
  • 框架或依赖功能/接口的错误使用 (RC_wrongly_use_dependency)。代码实现时使用了现有的函数,或者其他微服务提供的接口。但是对其 业务含义/调用方法/返回处理 理解有误导致的问题。
  • 踩了使用的框架或依赖的原有的坑/技术债 (RC_dependency_original_issue) 。受到原有的代码或系统的设计问题影响,所产生的Bug。
  • 代码/脚本实现错误 (RC_wrong_coding) 。单纯的代码写错了,比如对于函数的误用,或者写代码时的手误。
  • 环境,设施,数据库配置问题 (RC_misconfiguration) 。环境/基础设施/数据库 的参数配置错误引发的问题。
  • 前后端接口协议不一致 (RC_FE&BE_protocol_not_match)
  • 前端排版显示问题 (RC_UI_display_issue)
  • 兼容性 (RC_compatibility) 。未覆盖不同操作系统/不同设备/不同客户端/不同窗体大小的差异,引发的问题。
  • 非功能性需求 - 性能问题 (RC_performance)
  • 非功能性需求 - 安全问题 (RC_security)
  • 非功能性需求 - 健壮性问题 (RC_robust) 。连续点击,并行,弱网等情况引发的问题。
  • 技术架构升级 (RC_tech_upgrade) 。依赖的包或框架升级版本引发的问题。
5.Bug产生的人员原因 (Reason)

(1) 维度定义:

描述写出Bug代码的原因。

(2) 分析目的:

结合上一个维度,评估团队人员上下文以及技术的掌握情况。通过进行session/文档同步上下文的方式进行查漏补缺。

当分析涉及具体人员的原因时,对应人员可能害怕被追责,会不自然地产生抵抗心理。所以在我们分析人维度的根因的时候,侧重点应该是团队对于上下文的掌握情况,而不是某个成员的个体原因,为团队成员建立有安全感的氛围,这样才能保证此维度的分析能持续进行下去。

(3) 维度示例:

  • 需求中业务需求不够明确 (Reason_uncovered_detail_in_requirement) 。需求的某些部分可能没有清晰地表述出期望的过程和结果,在开发的流程中,开发人员对于该部分内容团队各个成员也没有识别到该问题。导致最终验收时,实现的内容与客户/业务分析人员预先期望(或者说直觉性的期望,因为可能写需求的时候就没想到这部分内容)的内容不同。
  • 需求业务理解错误 (Reason_requirement_misunderstanding) 。开发人员对于需求的业务场景理解与实际业务有偏差导致的问题。
  • 未考虑到边缘用例 (Reason_unconsidered_case) 。开发时未考虑到处理某些边界值或者边缘场景导致的问题。
  • 业务上下文缺失 (Reason_not_familiar_with_business_context) 。团队成员对于需求相关的系统业务上下文的了解不够全面,导致的问题。比如对于接口的业务价值不了解,从而导致接口返回错误的结果。
  • 代码实现上下文缺失 (Reason_not_familiar_with_code_context) 。团队成员对于需求相关的现有系统代码结构的了解不够全面,导致的问题。比如更改现有代码时,漏掉了某个不熟悉的模块中的部分相关代码。
  • 对于依赖的接口/工具细节不了解 (Reason_not_familiar_with_dependency) 。对应Root cause中的“框架或依赖功能/接口的错误使用”。
  • 开发过程中的疏忽 (Reason_negligence) 。单纯的开发过程中的疏忽。

未考虑到系统健壮性或其他非功能性需求 (Reason_unconsidered_non_functional_requirements)

6.自动化测试覆盖情况 (Original Automation Test)

(1) 维度定义:

描述该Bug相关的代码的自动化测试情况,自动化测试代码为何没有发现该Bug。包括单元/接口/端到端测试。

(2) 分析目的:

适当的自动化测试覆盖与适当的运行频率可以极大地提高问题代码的反馈效率,所以此维度可以用于识别系统自动化覆盖的情况。识别出自动化测试薄弱的功能/微服务后可以单抽时间对其补充必要的自动化测试。

(3) 维度示例:

  • 功能没写测试(OT_none) 。因为effort或其他原因,单纯地没写测试。
  • 写了测试但是没有覆盖到边界情况(OT_not_cover_edge_case) 。写了功能对应的测试,但是未覆盖到某些边界情况。
  • 测试数据跟实际数据不符(OT_data_mismatch_reality) 。写了功能对应的测试,但是所构造的数据与业务的正常数据不同,导致没有发现问题。
  • 重构改动过大,原有测试无法继续使用(OT_remove_by_refactor) 。重构改动过大,导致原有功能已有的测试无法继续使用。同时重构后的新的测试代码覆盖不全。
  • 测试技术/框架所限无法覆盖(OT_none_tech_limited) 。因技术/框架原因,写自动化测试的effort过大,或者无法实现自动化测试。
  • 测试代码错误(OT_wrong_logic) 。单纯地测试代码错误导致未识别到Bug。
7.发现的问题不属于Bug的场景(Timing_not_bug)

有时我们最终发现看到的问题不属于系统的Bug,我们可以把这种情况单独分作一类进行分析其出现的原因(Root Cause维度)。

当某种原因出现频率过高的时候,我们也需要采取对应的行动去减少此类的问题的出现,以防在大量的调查处理工作中浪费QA及团队其他成员的时间。

示例:

  • 脏数据 (RC_dirty_data) 。存在于测试环境的脏数据导致的问题,常见的脏数据的来源可能是未完全开发完成的代码,团队成员对于数据库数据的手动更新或插入。一般发现是脏数据导致的问题时,需要追查脏数据的来源。如果来源是现有代码,则需要单独建Bug处理创造脏数据的代码问题。
  • 新需求 (RC_new_requirement) 。Bug所期望的系统行为并不属于任何的需求中所约定的开发内容,需要新建卡来进行交付。
  • 需求问题(需求错误、遗漏) (RC_requirement) 。Bug所提及的内容与需求中所约定的开发内容一致,但是与实际业务不符,需要新建卡来进行修正。
  • 无法重现 (RC_cant_reproduce) 。无法重现Bug所描述的问题,可能是瞬时的环境问题,或问题已经被无意中修复。
  • 基础设施问题 (RC_unstable_env) 。由于基础设施无法工作导致的问题,比如环境/数据库无法访问。
  • 外部系统不稳定 (RC_unstable_external_system) 。由于外部系统停止工作或者无法连接导致的问题。
  • 依赖的卡未完成开发 (RC_dependent_story_unfinished) 。Bug所描述功能的相关卡还未完全开发完成。需要开发完后再重新进行测试。
  • 设计如此 (RC_by_design) 。Bug创建者理解有误或不了解上下文,其实系统的设计与现有行为一致。

最后

虽然列出了这么多维度和原因,但是毕竟每个项目各有各的情况。所以在bug分析这件事上面,并没有适用于所有项目的模板。

但是不管分析的方式及维度如何,我们做Bug分析的目标是一致的:

  • 分析根因,防止未来出现类似Bug。
  • 分析流程和质量保障,提前未来Bug被发现的时机,减少修复成本。
  • 分析趋势,识别项目质量风险。

所以,只要满足上面的目标而且适合项目现状的分析方式就是好的方式。

以上是我对于Bug分析维度的一些思考和归纳,欢迎大家指正或提出自己的见解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/172369.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集群路径规划学习(一)之EGO-swarm仿真

代码调试与编译 源代码下载 https://github.com/ZJU-FAST-Lab/ego-planner-swarm/tree/master 按照代码要求配置安装环境 sudo apt-get install libarmadillo-dev 文件对应拷贝与调整 新建工作空间文件夹 XF_EGOworkspace 新建src 在src文件夹下开启终端,输…

JVM对象创建与内存分配

对象的创建 对象创建的主要流程: 类加载推荐博客:JVM类加载机制详解 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析…

海外IP代理科普——API代理是什么?怎么用?

随着互联网的不断发展,越来越多的企业开始使用API(应用程序接口)来实现数据的共享和交流。而在API使用中,海外代理IP也逐渐普及。那么,什么是API代理IP呢?它有什么作用?API接口有何用处&#xf…

Tomcat 9.0.54源码环境搭建

一. 问什么要学习tomcat tomcat是目前非常流行的web容器,其性能和稳定性也是非常出色的,学习其框架设计和底层的实现,不管是使用、性能调优,还是应用框架设计方面,肯定会有很大的帮助 二. 运行源码 1.下载源…

数据类型扩展02

1、字符串拓展 所有的字符本质还是数字。 char c1 a;char c2 中;System.out.println("c1:"c1);System.out.println("c1转换:"(int)c1);System.out.println("c2:"c2);System.out.println("c2转换:"(int)c2); 执行结果 c1:a c1转换:…

Linux:动静态库

目录 一、软硬链接 1、软链接 2、硬链接 二、动态库和静态库 编写一个库 ①静态库 使用静态库的方法 ②动态库 使用动态库的方法 库存在的意义 一、软硬链接 软硬链接的本质区别就是:有无独立的inode 软链接有独立的inode,也就意味着软链接是一…

redis高可用---持久化

redis高可用 在集群当中有一个非常重要的指标,提供正常服务的时间的百分比(365天) 99.9%,redis高可用含义更广泛,支持服务是指标之一,数据容量扩展,数局的安全性。(容量、安全性) redis中实现高…

【HCSD大咖直播】亲授大厂面试秘诀【云驻共创】

同学们,毕业季是否找到了自己心仪的工作呢?是否了解大厂面试流程、要求以及技巧呢?华为云IoT高级工程师,传授大厂面试秘诀,教大家如何轻松get大厂offer!提前为大厂面试做准备,赢在起跑线&#x…

新安装win11,搜索框无法输入的问题

正确的做法是如下: 1首先进入win11系统,在搜索框中输入“ 控制面板 ”将其打开2在控制面板中找到“时间和语言“ 标题 再选择“ 语言和区域”, 标题 在显示的语言上面,点击省略号,进入语言选项 标题 在键盘处,删除不需要的输入法…

C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)

一.纯虚函数的由来 在多态中&#xff0c;通常父类中虚函数的实现是毫无意义的&#xff0c;主要都是调用子类重写的内容。例如&#xff1a; #include<iostream>using namespace std;class AbstractCalculator { public:int m_Num1;int m_Num2;virtual int getResult(){r…

docker和docker-compose生产的容器,不在同一个网段,解决方式

在实际项目中&#xff0c;使用docker run xxXx 和docker-compose up -d 不在同一个网段&#xff0c;一个是默认是172.17.x.x, 另一个是172.19.x.x。为解决这个问题需要自定义一个网络&#xff0c;我命名为“my-bridge” 首先熟悉几条命令&#xff1a; docker network ls 或…

如何理解低代码开发工具?

目录 一、低代码平台是什么 1. 数据输入 2. 数据流转 3. 数据加工 4. 数据输出 &#xff08;1&#xff09;视图&#xff1a;单表的数据的简单展示 &#xff08;2&#xff09;看板&#xff1a;提供单表、多表数据的多种图表组合展示 二、低代码能力 ➪ 全栈可视化编程&#xff1…

你知道Linux操作系统的前世今生吗?Linux系统又该如何搭建呢?

文章目录 前言1. Linux 是什么1.1 Unix & Linux 发展历程图1.2 Linux 的发展1.3 Linux 的发行版 2. Linux 环境搭建2.1 环境搭建方式2.2 使用云服务器 3. 使用终端软件连接到 Linux3.1 什么是终端软件3.2 下载安装 XShell3.3 使用 XShell 登陆主机 总结 前言 可能很多人都…

labelImg

labelImg 在anaconda虚拟环境中安装labelImg 进入conda虚拟环境DL2中 输入命令&#xff1a; pip install PyQt5 pip install pyqt5-tools pip install lxml pip install labelimg PyQt5:是用于创建GUI应用程序的跨平台工具包&#xff0c;它将Python与Qt库融为一体 Lxml&#…

深信服技术认证“SCSA-S”划重点:渗透测试工具使用

为帮助大家更加系统化的学习网络安全知识&#xff0c;尽快通过深信服安全服务认证工程师认证&#xff0c;深信服推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师&#xff08;…

CVE-2023-0179提权利用

前言 在CVE-2023-0179-Nftables整型溢出中&#xff0c;分析了漏洞的成因&#xff0c;接下来分析漏洞的利用。 漏洞利用 根据漏洞成因可以知道&#xff0c;payload_eval_copy_vlan函数存在整型溢出&#xff0c;导致我们将vlan头部结构拷贝到寄存器&#xff08;NFT_REG32_00-N…

【SpringBoot】通过profiles设置环境

效果图&#xff0c;通过profiles设置环境 在父级pom.xml中添加配置 <profiles><profile><id>dev</id><properties><application.environment>dev</application.environment></properties><activation><activeByDefau…

OceanBase:OBServer节点管理

目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…

【原创】为MybatisPlus增加一个逻辑删除插件,让XML中的SQL也能自动增加逻辑删除功能

前言 看到这个标题有人就要说了&#xff0c;D哥啊&#xff0c;MybatisPlus不是本来就有逻辑删除的配置吗&#xff0c;比如TableLogic注解&#xff0c;配置文件里也能添加如下配置设置逻辑删除。 mybatis-plus:mapper-locations: classpath*:mapper/*.xmlconfiguration:mapUnd…

Java-认识String类

本章重点&#xff1a; 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 1.String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组…