测试缺陷分析务实篇

测试缺陷分析务实篇

作者:罗耀秋 来源:网络

摘要:

测试活动作为IT项目和产品开发一个重要的环节,通过发现产品或组件的缺陷,并反馈给开发组修复验证这些缺陷,从而在一定程度上保证了外发产品的质量。对这些测试活动发现的缺陷进行深入的分析,可以有助于我们进行质量预测、进行过程改进、量化的衡量产品质量。

关键词:

测试分析、过程改进、质量预测、过程能力、缺陷

正文:

项目研发过程中,我们通过单元测试、集成测试、系统测试发现了大量的缺陷。我们把这些Bug输入到Excel或者其他测试管理系统中,跟踪其解决。一旦Bug fix完成后,大多数情况下我们就把这份bug list束之高阁,偶尔能想到的用途就是拿出来衡量测试组的绩效,或者用来评估开发组的质量表现。

一般来说质量分析有以下几中情况

  • 利用缺陷引入-发现矩阵分析

缺陷有发现阶段和引入阶段两个重要指标,发现阶段和引入阶段可以是软件生命周期的各个阶段,根据这两个阶段可以绘制出一个矩阵,从而分析出软件开发各个环节的开展质量,找到最需要改进的环节。

开始例子分析之前先解释一下缺陷引入-发现矩阵的一些概念。

矩阵的每行表示该阶段或活动发现的各阶段产生的缺陷数;矩阵的每列表示该阶段或活动引入的缺陷泄露到后续各环节的缺陷数。

缺陷移除率定义为:缺陷移除率=(本阶段发现的缺陷数/本阶段引入的缺陷数)*100%。如需求阶段一共引入了15个缺陷,需求评审时候只发现了2个,设 计过程中发现了10个,编码和单元测试阶段发现了两个,还有一个直到系统测试阶段才被发现。这样,需求阶段的缺陷移除率=2/15*100%=13%。它 反映的是该活动阶段的缺陷清除能力。

反过来还有一个概念,缺陷泄露率,就是有多少本阶段引入的缺陷没有在本阶段发现而是被泄露到后阶段环节才被发现。其计算公式为:缺陷泄漏率=(下游发现的 本阶段的缺陷数/本阶段注入的缺陷总数)*100%。显然,它等于[1-缺陷移除率]。它反映的是本阶段质量控制措施落实的成效。

下面是一个分析例子:

从上表可以看到,编码过程的缺陷大部分依赖系统测试发现。单元测试和集成测试活动开展不够深入。我们可以进一步分析这些系统测试出来的测试缺陷,是不是可以被更前端的评审/测试/设计讨论活动所替代。详细见“四、利用泄漏的下游缺陷回溯过程有效性”

另外,我们看到,需求阶段引入的缺陷绝大部分是在设计阶段发现的。这可能是我们大部分项目的一个现实,需求不 稳定、需求不明确,很多东西需要在设计过程中才能明确下来。也许从这个分析结果中给我们一个启示,我们在设计评审时候,也需要重新审视我们的需求规格说明 书,必要时候利用需求追踪矩阵这样的规矩方法来辅助我们发现上游需求的缺陷。把这样的机制固化起来,作为我们标准研发过程的一个要素或者过程指导书。

当然,实际规划“缺陷引入-发现矩阵”时,可以依据自己的管理要求,对缺陷的发现活动和引入阶段进行细分或初分,并且在Bug系统中提交时,需要准确的填写这些属性字段。

  • 利用缺陷的分布进行分析

可以选某个阶段的测试缺陷进行分析,按照这些缺陷对应的产品组成部分来汇总这些数据。利用这样的分布,可以找出我们产品/项目的高危模块来。这些模块导致了我们产品的主要缺陷。主要用到的分析手段是数据透视表和柏拉图。让我们看看下面的例子:

这是一个简单的OA系统,它只有5个子系统。我们把这些子系统各有多少缺陷列出来,找到了改善质量的关键模块是后台交易模块。

像上图,这是一个较为复杂的MIS系统,有近20个功能块。这个时候,可以利用柏拉图识别出占80%问题的那少数模块,针对其采取强于其它产品组成部分的质量控制措施。

需要指出的是:采用缺陷分布只是分析的第一步。它只不过提供了你分析影响产品质量的那些重点模块,其信息不足以给出更深层次的原因。需要针对这些高危模块进行进一步的分析,识别缺陷的产生根源。

当然,也有人认为绝对数去衡量缺陷的分布并不合适,所以有些人也会把缺陷按照严重程度对应一定的权重系数折算成分析意义上的标准故障。如上表,折算系数为,严重*10,关键*5,一般*3,次要*1,优化*0。

这种分析需要我们的bug系统建立产品组件的概念,使得缺陷填报人能够正确的填报每个缺陷的产品组件位置。

  • 利用缺陷的阶段分布模型进行质量预测

假设我们为bug管理系统建立了“一、利用缺陷引入-发现矩阵分析”中描述的缺陷引入-缺陷发现阶段信息,那么我们可以对相似的项目的缺陷阶段分布进行度量,形成该类型项目的缺陷分布的过程模型。它给予我们的信息是:只要是这种类型的项目,按照相似的过程方法进行研发,那么其质量表现也是相似的。

我们之所以作这样的假设,是有一个前提,就是我们研发过程是高度一致的,并且过程的表现也是稳定的。这样,我们得出的过程能力模型才具有可信度。

下面是一个如何运用测试分布模型进行质量预测的例子:

如果需求阶段发现了10个缺陷,就可以预计到设计阶段我大概要清除70个缺陷,依次可以估计到后阶段各个环节的缺陷数,作为我们该阶段工作的交付准则。并且,可以预测到产品发布后的使用表现会出现大约2个故障泄露到用户手中。

这种分析预测模型的建立,要求组织的测试/评审过程比较稳定。即组织整体达到CMMI三级成熟度,同时在VAL和VER(验证和确认)过程域的达到CMMI四级的成熟度级别,即量化管理级别。

  • 利用泄漏的下游缺陷回溯过程有效性

经验告诉我们,越到后端发现的缺陷,用于问题复现、问题定位和bug修复的时间就越多。那么我们是不是可以在项目研发的更前端发现这些缺陷呢?有什么方式让我们识别项目研发前端哪些活动没有充分投入、或者没有运用合适的工程/技术方法导致这些问题被泄露到下游呢?

其实,我们有很简便的方法可以达到这个目的。从团队的典型项目中运用一定的抽样原则抽样出某个阶段的若干个缺陷,从技术、流程、工程方法、费效比方面去分析其更适合、更经济的清除方法。然后把这些方法固化到我们日常的项目实施过程中,逐步就可以降低上游对后端的缺陷泄露。

下面以对一个项目的系统测试阶段发现的故障为例进行过程有效性回溯分析:

从上表可以看出,真正需要遗留到系统测试阶段才能发现的故障只有7%,大部分故障应该在集成测试和设计评审过程中就应该发现的。

导致在集成测试过程中未能充分发现这些缺陷的原因主要有:

1、测试环境不具备,导致部分测试项必须到系统测试阶段才具备测试条件;

2、测试设计中某些测试项的缺失,需要加强测试设计的评审工作;

3、回归测试过程中,开发部只是对测试故障进行验证,而对bug fix波及的范围缺乏分析和验证;

这样,针对这些分析结论,我们就可以制定针对性的整改措施。如:

  • 加强开发部的故障波及分析及波及分析验证工作;
  • 项目计划中加强对测试需求的关注,提前采购和协调必要的测试环境;
  • 每次回归对泄露的缺陷开发部都作相应的复盘,并根据复盘结果,完善单元测试和集成测试的测试设计;
     
  • 利用缺陷分类来进行缺陷的根源分析

对于测试出来的BUG进行缺陷分类,按照BUG的类型分布,找出那些关键的缺陷类型,进一步分析其产生的根源,从而针对性的制定改进措施。

下面以一个项目的系统测试故障为例进行分析:

从系统测试故障来看,有较多故障是由接口原因造成的,细分有以下几种原因:

1、跨项目间的接口,接口设计文档的更改没有建立互相通知的机制,导致接口问题到系统测试时候才暴露出来;

2、部门内部跨子系统的接口,由于本项目设计文档按功能规划编写的,而不是按照产品组件,一般由主要承接功能工作的组编写该文档,接口内容可能不为其他开发组理解并熟悉,导致因接口问题而出错;

3、系统设计基线化后,更改系统接口,没有走严格的变更流程,进行波及分析,导致该接口变更只在某个子系统中被修改,而使错误遗漏下来;

那么我们可以针对性的制定改进建议:

1、对接口文档的评审一定要识别受影响的相关干系人,使他们了解并参与接口设计的把关;

2、对基线化的接口设计文档的变更一定要提交变更单给CCB决策,并做好充分的波及影响分析,以便同步修改所有关联的下游代码;

3、概要设计文档按子系统规划,详细设计文档按模块规划,通过相关组参加评审协调接口设计;

以上例子的缺陷分类只是为了描述方便,本身描述并不尽合理。实际定义缺陷分类可能有很多个维度,如发现活动、引入活动、缺陷来源、缺陷类型、严重程度等。只要满足自己的缺陷管理、缺陷分析需求即可。

  • 缺陷收敛趋势分析

项目管理中一项非常重要但也十分困难的工作是衡量项目的进度、质量、成本等,统称为项目的状态,以确定项目是否能按期保质完成。这方面,测试提供了两个非常重要的参数,一个是缺陷数量的趋势,另一个是缺陷修复的趋势。(注:此节所说的测试均指代系统测试)

缺陷趋势就是将每月新生成的缺陷数、每月被解决的缺陷数和每月遗留的缺陷数标成一个趋势图表。一般在项目的开
始阶段发现缺陷数曲线会呈上升趋势,到项目中后期被修复缺陷数曲线会趋于上升;而发现缺陷数曲线应总体趋于下降;同时处于OPEN状态的缺陷也应该总体呈
下降趋势,到项目最后,三条曲线都趋向于零。如:

项目经理会持续观察这张图表,确保项目健康发展,同时通过分析预测项目测试缺陷趋于零的时间。在一定的历史经验的基础上分析使用这一图表会得到很多有价值
的信息,比如说,可分析开发和测试在人力资源的配比上是否恰当,可以分析出某个严重的缺陷所造成的项目质量的波动。对于异常的波动,如本来应该越测试越收
敛的,却到了某个点,发现的故障数反而呈上升趋势,那么,这些点往往有一些特殊事件的发生。如:

  • 在该时间段送测的回归版本增加了新的功能,导致缺陷引入;
  • 该回归版本开发部没有进行集成测试就直接送测?等等。

当然,这个统计周期也可以根据我们的项目实施情况进行。如按照回归版本的版本号进行统计、按周进行统计等。也有公司把缺陷收敛情况当作判断版本是否可以最终外发的一个标志。

小结:

通过对测试缺陷分析,能够给予我们很多改进研发和测试工作的信息。

当然,这种分析来源于一个前提,我们需要规划一个好的Bug管理系统,满足我们这些分析的信息需要。另外,我们的研发过程是稳定的,其质量表现大体是一致的,这样数据反映的趋势才具备可信度。

时间: 2024-10-13 17:57:39

测试缺陷分析务实篇的相关文章

MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)

依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook的本质就是拦截,就算到现在也是如此认为. 本篇文章是在x86下测试与分析跳转+offset类型的Hook,并且逆推测出热补丁的简单用法,MinHook它的中心就是覆盖重写并且可以复原.知道大概的思路后后让我们先来具体的实现MinHook再去做测试. 首先是堆的申请,这是必要也必须做的,对于微软函数HeapCreate()就不再赘述,以下是实现与卸载 1 NTSTATUS

数组转List-典型代码缺陷分析(三)

以上为开发过程中,部分程序猿数组转list的"笨"方法,为什么说笨呢,因为这样做代码很繁琐不简练容易出错可读性叫差,而且还比较耗时,因为我要一个一个遍历数组,然后把这个元素添加到list中(不过以上代码还有几点,最好给ArrayList<String>指定一个初始容量,注意和LinkedList的区别,以及split方法使用的效率和可能内存泄漏问题,此文不再详述,此处重点解读数组转list). 其实JDK特意为这种情况准备了一个方法,那就是java.util包中的Array

[原创]MinHook测试与分析(x64下 E9,EB,CALL指令测试,且逆推测试微软热补丁)

依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook很奇妙,有机会要学习到,正好近段日子找来了MiniHook,就一起分享一下. 本篇文章是在x64下测试与分析jmp+offset类型的Hook,并且逆推测出热补丁的简单用法,MinHook它的中心就是覆盖重写并且可以复原.知道大概的思路后后让我们先来具体的实现MinHook再去做测试. 首先是堆的申请(申请PAGE_SIZE大小自动生长的堆),以下是实现与卸载 1 NTS

源代码缺陷分析工具 Coverity Static Analysis

能够发现的C/C++缺陷(部分) C/C++安全性问题(部分) 并发 死锁 错误使用的阻塞调用 性能下降 内存泄漏 文件句柄泄漏 定制的内存和网络资源泄漏 数据库连接泄漏 导致崩溃的缺陷 空指针引用 释放后引用 多次释放 不正确的内存分配 不匹配的数组新建/删除 不正确的程序行为 逻辑错误导致的死代码 未初始化变量 负数的无效引用 不正确的APIs使用 STL使用错误 API错误处理 安全编码缺陷 缓冲区溢出 整形溢出 缺失的/不充分的恶意数据和字符串输入的验证 格式化字符串的不安全 SQL注入

【渗透技术】渗透测试技术分析_TomCat

[渗透技术]渗透测试技术分析_TomCat 本文转自:i春秋论坛 渗透测试-中间人攻击(原理)说起“中间人攻击”我想大多数对渗透测试又了解的朋友都多少有所了解,因为我们用到的次数真是非常的多.它可以将受害者发往服务器端的流量劫持到攻击者的计算机中,隐私得不到保证. 中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)中间人攻击很早就成为了黑客常用的一种古老的攻击手段,并且一直到今天还具有极大的扩展空间. 在网络安全方面,MITM攻击的使用是很广泛的,曾经猖獗一时的S

性能缺陷分析及定位方法

性能测试缺陷 一般有以下两种情况: 不能满足既定的性能指标,如:响应时间.资源耗用等: 并发错误.死锁.内存泄漏 性能缺陷分类 资源忙不来 资源怠工 性能缺陷分析 从下到上剥洋葱的方法,逆向请求分析. 从硬件--操作系统--数据库--中间件--后端应用程序--前端应用程序 实例1 银行应用系统:linux服务器,语言:java,应用服务器:weblogic,数据库:oracle,为了加强安全和稳定增加了流量控制功能(当请求量突然大量爆发,流量控制最大的并发流量,拦截其他流量). 测试策略: 基本

Google Test测试框架分析

Google Test测试框架分析 一.简介 Google Test是由Google主导的一个开源的C++自动化测试框架,简称GTest.GTest基于xUnit单元测试体系,和CppUint类似,可以看作是JUnit.PyUnit等对C++的移植. 下图是GTest测试框架的测试过程,表示的是GTest的两种测试方式. 下面将使用一个极其简单的例子表示xUnit测试的主要过程.如对Hummer的CTXString类的成员方法GetLength进行测试.详见下面GTest代码和注释说明. //

实验六:Bookstore项目测试缺陷报告

一.                 Bookstore项目测试缺陷报告 缺陷编号 01.01.0001 发现人 林臻 记录日期 2016-06-12 所属模块 购物车模块 确认人 林臻 确认日期 2016-06-12 当前状态 公开 严重度 3 优先级 3 问题概述 用户在加入购物车添加数量为0时,点击购买也能添加进购物车. 问 题 再 现 描 述 登录用户,选择图书分类,; 选择图书C++购买数量为1 ,查看购物车已添加; 选择图书Oracle购物数量为0,购买,查看购物车,书籍已添加; 图

Bookstore项目测试缺陷报告

Bookstore项目测试缺陷报告   缺陷编号:02.02.0028       发现人:林德     记录日期:2016.6.9 所属模块:购物车          确认人:林德     确认日期:2016.6.9 当前状态:公开                    严重度:2          优先级:2   问题概述:    购物车书籍数量没有变化.   问题再现描述: 1.进入购物车,增加书籍<C#实用教程>,数量为1: 2.再次购买该书籍2本,购物车该书籍数量不变(应该增加为3)