当前位置: 首页 > news >正文

测试左移之需求质量

测试左移的由来

缺陷的修复成本逐步升高

下面是质量领域司空见惯的一张图,看图说话,容易得出:大部分缺陷都是早期引入的,同时大部分缺陷都是中晚期发现的,而缺陷发现的越晚,其修复成本就越高。因此,为了降低缺陷修复成本,我们期望在更早的时间发现缺陷。

那么上图是否完全没问题呢?不是的,这张图来源于1996年的一本书《Applied Software Measurement》,这张图画成的时候,敏捷宣言还没诞生呢(敏捷宣言诞生于2001年)。在传统背景下,需求是明确且相对固定的,需求产生的缺陷可以忽略不计。同时,在需求阶段产生的问题可能会引起整体方案的返工,因此,需求产生的问题不太会以软件缺陷的形式来体现。

需求质量呼唤测试左移

随着软件生态的发展,软件需求越来越复杂多变,需求的有效性和传递效率也备受挑战。受大环境影响,需求阶段引入的缺陷就对软件的研发成本造成了影响。同时,软件的研发过程越来越成为一个需要高效协作的整体,各角色之间的界限也变得相对模糊。

为了让质量理念更早的介入软件研发过程,也为了降低缺陷修复的成本、减少不必要的返工,需求的质量变得尤为重要。测试左移因此而生,需求分析人员与测试人员需要协同工作,共同保证需求的质量。

加上需求阶段重画一下上面的图,理想情况下,我们容易得出以下结论:

  1. 缺陷的引入从需求阶段就开始持续,到研发阶段达到峰值,然后趋于平缓
  2. 缺陷从需求阶段就开始陆续被发现,到测试阶段达到峰值,然后趋于平缓
  3. 从需求阶段到研发初期,缺陷修复的成本极低
  4. 开发后期到上线,缺陷修复成本一路攀升至高点
  5. 缺陷发现的数量少于引入的数量,但在上线前后,缺陷发现数量大于引入数量

因此,为了获得更经济的资源投入产出比,我们认为应该在需求阶段和编码初期更多的发现缺陷,从而减少修复成本和返工,这也正是测试左移的价值所在。

那么,该如何保证需求的质量呢?我们在不同的时期面临的需求,其形态是有差异的,所以需要深刻理解这些差异,并有针对性的设计质量活动加以验证。

需求的几个层次

一个很现实的例子

一天,大老板说:“微信小程序不错,我们内部OA流程得做一个,你们安排一下,年内发布就行。” 这就是一个来自大老板的一句话需求。

项目经理拿到这个需求,看到“年内发布”,需求管理看板上就可以多一张卡,只有几个字“OA小程序”,排期可能暂时安排在第三季度。

过了俩月,送走了一批艰难的需求,暂时松口气的项目经理扫到这张卡,瞬间头皮发麻,这还有一个老板亲生的大坑呢,得尽快填上。喊来产品经理,快出一版方案,再找技术经理大致估一下工作量。

只有一句话显然是没法出方案的,产品经理和技术经理各自焦头烂额的研究了两天,又花了半天暂时碰出了OA小程序的初版方案。一周后,方案通过评审。这时,根据既定方案,产品经理细化了一些需求:用户管理,组织管理,流程管理,表单配置,权限配置,审批配置,微信登录等。

即将进入研发阶段,需求又会被再次细化。以用户提交请假单的场景为例,需求可被细化如下图。进入研发后,开发以一定的优先级顺序来领取需求进行研发。

需求的三种粒度

在上面的故事中,为了服务产品规划和不同的管理诉求,需求呈现出以下三个粒度:

史诗故事 > 特性故事 > 用户故事

  • 史诗故事 Epic:粗粒度的描述需求,通常需要多个迭代才能完成,主要用于版本规划时记录和跟踪该功能
  • 特性故事 Feature:也叫主题故事,是一系列相同主题用户故事的集合,主要用于迭代规划、优先级排序和整体估算
  • 用户故事 Story:迭代开发的最小单元,是较细粒度的需求描述,主要用于迭代交付过程中的估算、跟踪和管理

不同粒度需求的质量保障

史诗故事:方案验证 & 测试设计

在产品演进过程中,当面临的需求还是一句话时,测试人员能做的事情并不多。当史诗故事即将进入迭代规划,进行方案设计时,测试人员就可以参与进来了。

方案成型初期,测试人员可以参与方案讨论和技术可行性研究,贡献既有业务流程或潜在业务逻辑,针对有较大质量风险的方案,测试人员有责任提出质疑,并给出建议。

方案确定后,测试人员就可以着手进行测试设计了,测试设计包括但不限于:针对该功能的质量预期,大致的测试规划,现有的测试资源评估,主要的质量风险及响应方式等。

特性故事:需求评审 & 测试计划

临近迭代,需求会以特性的形式体现,此时测试人员可以参与需求评审:

  • 针对功能需求,测试人员先验证需求是否有效,包括需求价值确认,需求涉及场景是否完备,与现有业务逻辑是否有冲突
  • 针对功能需求背后的支撑性需求进行澄清,确认支撑性需求的范围、验收标准、测试方式等;此外还需要考虑用户体验
  • 考虑需求的拆分是否合理,是否便于估算和迭代管理

质量活动方面,测试人员可以落实测试计划了,如各种测试活动的安排,测试效果的评价,测试的重点和难点,测试阶段的输入和输出等,在这个阶段都可以确认了。

用户故事:需求验收 & 测试执行

故事启动时,测试人员需要补充需求验收的用例,以及需求影响范围内的回归用例等。在这以后测试人员主要关注在需求验收和测试执行上,按照测试设计和计划进行测试,确保最终的实现质量。而在此阶段,测试人员尤其需要关注投入产出比,把有限的精力用在刀刃上。行之有效的做法是在测试计划阶段就明确好各功能的质量标准和资源投入,并在测试执行阶段时刻回顾。但计划是死的,人是活的,万一在测试过程中,我们发现计划赶不上变化,就需要随时跟团队沟通并进行灵活调整了。

当然,质量活动并不是以功能测完上线为结束,而是需要完成一个完整的闭环。测试阶段以后的质量活动不在本文讨论的范围内,在此就不做过多展开了。

小结

测试左移之所以重要,是因为我们要在缺陷引入的最初阶段就发现它,把缺陷扼杀在摇篮里,而不是等着它像雪球一样越滚越大。而这里的误区在于,测试左移要求的测试活动尽早介入,而不仅仅是把测试人员进行左移。因此,团队里的每个成员,都需要有测试左移的思想,都可以从一开始就绷紧质量这根弦,确保每个人的工件质量。

而在需求的质量保证活动中,测试人员也需要时不时换帽子,有时可能是终端用户,有时可能是产品经理,也有时可能是产品负责人。不管戴什么帽子,保证各个工件的质量,以及各工件的顺畅集成,都是测试人员可以关注的事。质量相关,我们责无旁贷。


文/Thoughtworks 于晓南
原文链接:https://insights.thoughtworks.cn/shift-left-testing/

相关文章:

测试左移之需求质量

测试左移的由来 缺陷的修复成本逐步升高 下面是质量领域司空见惯的一张图,看图说话,容易得出:大部分缺陷都是早期引入的,同时大部分缺陷都是中晚期发现的,而缺陷发现的越晚,其修复成本就越高。因此&#…...

【数据结构初阶】第三节.顺序表详讲

文章目录 前言 一、顺序表的概念 二、顺序表功能接口概览 三、顺序表基本功能的实现 四、四大功能 1、增加数据 1.1 头插法: 1.2 尾插法 1.3 指定下标插入 2、删除数据 2.1 头删 2.2 尾删 2.3 指定下标删除 2.4 删除首次出现的指定元素 3、查找数据…...

新手小白适合做跨境电商吗?

今天的跨境电商已经逐渐成熟,靠运气赚钱的时代早已过去,馅饼不可能从天上掉下来,尤其是你想做一个没有货源的小白劝你醒醒。做跨境电商真的不容易,要想做,首先要分析自己是否适合做。米贸搜整理了以下资料,…...

Python搭建自己[IP代理池]

IP代理是什么:ip就是访问网页数据服务器位置信息,每一个主机或者网络都有一个自己IP信息为什么要使用代理ip:因为在向互联网发送请求中,网页端会识别客户端是真实用户还是爬虫程序,在今天以互联网为主导的世界中&#…...

pandas——plot()方法可视化

pandas——plot()方法可视化 作者:AOAIYI 创作不易,如果觉得文章不错或能帮助到你学习,记得点赞收藏评论哦 在此,感谢你的阅读 文章目录pandas——plot()方法可视化一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤…...

【Three.js基础】坐标轴辅助器、requestAnimationFrame处理动画、Clock时钟、resize页面尺寸(二)

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…...

C++之完美转发、移动语义(forward、move函数)

完美转发1. 在函数模板中,可以将自己的参数“完美”地转发给其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。2. C11标准引入了右值引用和移动语义,所以,能否实现完美转发&…...

LeetCode刷题系列 -- 48. 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix [[1,2,3],[4,5,6],[7,8,9]]输出&#…...

在多线程环境下使用哈希表

一.HashTable和HashMapHashTable是JDK1.0时创建的,其在创建时考虑到了多线程情况下存在的线程安全问题,但是其解决线程安全问题的思路也相对简单:在其众多实现方法上加上synchronized关键字(效率较低),保证…...

【排序算法】堆排序(Heap Sort)

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序介绍学习堆排序之前,有必要了解堆!若…...

分类预测 | Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测

分类预测 |Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测 目录分类预测 |Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测分类效果基本介绍模型描述程序设计参考资料分类效果 基本介绍 Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机…...

Allegro如何添加ICT操作指导

Allegro如何添加ICT操作指导 当PCB板需要做飞针测试的时候,通常需要在PCB设计的时候给需要测试的网络添加上ICT。 如图: Allegro支持给网络添加ICT,具体操作如下 首先在库中创建一个阻焊开窗的过孔,比如via10-ict一般阻焊开窗的尺寸比盘单边大2mil 在PCB中选择Manufacture…...

软件架构设计(二)——领域架构、基于架构的软件开发方法

目录 一、架构描述语言 ADL 二、特定领域软件架构 DSSA 三、DSSA的三层次架构模型 . 四、基于架构的软件开发方法 (1)基于架构的软件设计(ABSD) (2)开发过程 一、架构描述语言 ADL ADL是一种形式化语言,它在底层语义模型的支持下,为软件系统概念体…...

数组常用方法(2)---数组遍历方法

1. forEach(cb) 回调函数中有三个参数,第一个是当前遍历项(必须),第二个是索引,第三个是遍历的数组本身。forEach() 对于空数组不会执行回调函数。forEach()不会使用回调函数的返回值,返回值为undefined。…...

卸载Node.js

0 写在前面 无论您是因为什么原因要卸载Node.js都必须要卸载干净。 请阅读: 1 卸载步骤 1.1通过控制面板卸载node.js winR—>control.exe—>卸载程序—>卸载Node.js 等待—>卸载成功 1.2 删除安装时的nodejs文件夹 通过记忆或者Everthing搜索找…...

发表计算机SCI论文,会经历哪些过程? - 易智编译EaseEditing

一、选期刊。 一定要先选期刊。每本期刊都有自己的特色和方向,如果你的稿子已经成型,再去考虑期刊选择的问题,恐怕后期不是退稿就是要大面积修改稿子。 选期刊的标准没有一定的,主要是各单位都有自己的要求,当然小编…...

python中lambda的用法

1. lambada简单介绍 lambda 在Python编程中使用的频率非常高,我们通常提及的lambda表达式其实是python中的一类特殊的定义函数的形式,使用它可以定义一个匿名函数。即当你需要一个函数,但又不想费神去命名一个函数,这时候&#xf…...

网络安全协议(3)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.当前流行操作系统的安全等级 1.Windows的安全等级 什么是EAL…...

102.第十九章 MySQL数据库 -- MySQL的备份和恢复(十二)

5.备份和恢复 5.1 备份恢复概述 5.1.1 为什么要备份 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景 参考链接: https://www.toutiao.com/a6939518201961251359/ 5.1.2 备份类型 完全备份,部分备份 完全备份:整个数据集 部分备份:只备份数…...

【C++】C++入门 类与对象(一)

类与对象(一)一、类的引入二、类的定义1、类的两种定义方式:2、成员变量命名规则的建议:三、类的访问限定符及封装1、访问限定符2、封装四、类的实例化1、类的实例化概念2、类对象的大小的计算五、this指针this指针的特性一、类的…...

笔记_js运算符

目录二进制相关运算符移位运算符<<>>&#xff5c;(位或运算)参考文档二进制相关运算符 移位运算符 移位运算就是对二进制进行有规律的移位。 tips:进制转换文档链接 << “<<”运算符执行左移位运算。在移位运算过程中&#xff0c;符号位始终保持不变…...

java面试题(十九) Mybatis

4.1 谈谈MyBatis和JPA的区别 参考答案 ORM映射不同&#xff1a; MyBatis是半自动的ORM框架&#xff0c;提供数据库与结果集的映射&#xff1b; JPA&#xff08;默认采用Hibernate实现&#xff09;是全自动的ORM框架&#xff0c;提供对象与数据库的映射。 可移植性不同&…...

Linux系统位运算函数以及相应CPU ISA实现收录

以32位数据的二进制表示为例&#xff0c;习惯的写法是LSB在左&#xff0c;MSB在右&#xff0c;注意BIT序和大小端的字节序没有关系。Linux和BIT操作有关的接口在定义在头文件bitops.h中&#xff0c;bitops.h定义有两层&#xff0c;通用层和架构层&#xff0c;对应两个bitops.h&…...

logback配置文件---logback.xml

目录常识操作logback-spring.xml 示例参考于 https://blog.csdn.net/white_ice/article/details/85065219 https://blog.csdn.net/weixin_42592282/article/details/122109703 https://www.dianjilingqu.com/629077.html 常识 https://www.dianjilingqu.com/629077.html nod…...

Web前端-设计网站公共header

设计网站公共headerheader元素是一个具有引导和导航作用的结构元素&#xff0c;很多企业网站中都有一个非常重要的header元素&#xff0c;一般位于网页的开头&#xff0c;用来显示企业名称、企业logo图片、整个网站的导航条&#xff0c;以及Flash形式的广告条等。在本网站中&am…...

引用和指针傻傻分不清

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 目录 &#x1f430;引用和指针的区别 &#x1f338;从现象上看 &#x1f338;从编译上看 &am…...

MySQL面试题:关系型数据库SQL和非关系型数据库NoSQL

文章目录一、四大非关系型数据库与关系型数据库的对比1. 关系型数据库2. 基于列的数据库3. 键值对存储4. 文档存储5. 图形数据库参考文章&#xff08;金文&#xff09;&#xff1a;四大非关系型数据库类型&#xff0c;你知道多少 参考文章&#xff1a;“行式存储”和“列式存储…...

1.Redis【介绍与安装】

1.常用数据库介绍 mysql的表类型[表引擎.存储引擎],memory表结构和表数据分开存储的,表结构保存在硬盘中,表数据保存在内存中memcache是一款软件,可以使用键值对的格式保存数据到内存中redis是意大利的工程师开发的开源免费的告诉缓存数据库,需要注意的是作者本身只开发了linu…...

DataStore快速上手1-preference

DataStore 概念 DataStore 可以存储两种类型的数据&#xff0c;一种是 preference&#xff0c;一种是 protobuf 每个进程在同一时间内仅能打开一个 DataStore 实例&#xff08;或者通过其他管理手段来实现多个 DataStore 交替使用&#xff09; 一个 DataStore 可以视为一张数…...

彻底掌握 MySQL InnoDB 的锁机制

本文是对沈剑大佬锁机制十多篇文章的概括总结&#xff0c;文末有全部链接&#xff0c;还参考了 10 多位其他网友的优秀分享。 1、概要 MySQL 中的锁可以按照粒度分为锁定整个表的表级锁(table-level locking)和锁定数据行的行级锁(row-level locking)&#xff1a; 表级锁具有开…...

微网站建设加盟/怎么优化网站排名才能起来

​一、用户#前言用户的身份在我们平时中就很常见&#xff0c;比如我们要登录百度网盘&#xff0c;qq都是以一个用户的身份进行登录,那么在Linux系统中也一样&#xff0c;我们也是需要一个用户来登录到服务器里面&#xff0c;然后再做相关的操作,一个进程也需要以一个用户的身份…...

网站聚合页面模板/简阳seo排名优化培训

早上起来看到一篇大哥哥写的博客&#xff0c;有一篇写的关于系统优化的文章&#xff0c;写的非常棒&#xff0c;由此我也想写一篇关于系统优化的文章。首先&#xff0c;我介绍一下我优化完的系统所能达到的效果&#xff0c;正如文章标题所示&#xff0c;XP系统可以在256内存的机…...

网站开发研究综述/app开发需要多少费用

1. 查询系统整体磁盘使用情况 基本语法 df -h 应用实例 查询系统整体磁盘使用情况 卸载挂载点&#xff1a;umount 挂载点的位置 例如&#xff1a;卸载原来的挂载点newdisk&#xff0c;命令如下&#xff1a; umount /home/newdisk 2. 查询指定目录的磁盘占用情况 基本语法 du…...

都匀市建设局网站/网页代码

1 create global link2 使用全局模式安装的包不能直接通过require使用&#xff0c;但是nmp提供了一个 nmp link &#xff0c;这个可以打破限制3 4 $ nmp link [express]5 ./node_modules/express->/usr/local/lib/node_modules/express //这样我们就可以把全局包当做本地包使…...

网站建设与维护合同范本/我想在百度上发布广告怎么发

异常 执行mlocate Code.class命令报错&#xff1a; -bash: mlocate: command not found原因 没有安装mlocate命令。 解决 执行如下命令进行安装&#xff1a; yum -y install mlocate然后使用locate Code.class查找报错&#xff1a;locate: can not stat () /var/lib/mloc…...

福田专业网站建设公司/合肥做网站哪家好

C中的四种运算符转化及不同点&#xff1a;&#xff08;1&#xff09;const_cast操作符&#xff1a;即工程设计师在特殊情况下将限制为const成员函数的const定义解除&#xff0c;使其可以更改特定属性。&#xff08;2&#xff09;dynamic_cast操作符&#xff1a;如果启动了支持运…...