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

那么上图是否完全没问题呢?不是的,这张图来源于1996年的一本书《Applied Software Measurement》,这张图画成的时候,敏捷宣言还没诞生呢(敏捷宣言诞生于2001年)。在传统背景下,需求是明确且相对固定的,需求产生的缺陷可以忽略不计。同时,在需求阶段产生的问题可能会引起整体方案的返工,因此,需求产生的问题不太会以软件缺陷的形式来体现。
需求质量呼唤测试左移
随着软件生态的发展,软件需求越来越复杂多变,需求的有效性和传递效率也备受挑战。受大环境影响,需求阶段引入的缺陷就对软件的研发成本造成了影响。同时,软件的研发过程越来越成为一个需要高效协作的整体,各角色之间的界限也变得相对模糊。
为了让质量理念更早的介入软件研发过程,也为了降低缺陷修复的成本、减少不必要的返工,需求的质量变得尤为重要。测试左移因此而生,需求分析人员与测试人员需要协同工作,共同保证需求的质量。
加上需求阶段重画一下上面的图,理想情况下,我们容易得出以下结论:
- 缺陷的引入从需求阶段就开始持续,到研发阶段达到峰值,然后趋于平缓
- 缺陷从需求阶段就开始陆续被发现,到测试阶段达到峰值,然后趋于平缓
- 从需求阶段到研发初期,缺陷修复的成本极低
- 开发后期到上线,缺陷修复成本一路攀升至高点
- 缺陷发现的数量少于引入的数量,但在上线前后,缺陷发现数量大于引入数量

因此,为了获得更经济的资源投入产出比,我们认为应该在需求阶段和编码初期更多的发现缺陷,从而减少修复成本和返工,这也正是测试左移的价值所在。
那么,该如何保证需求的质量呢?我们在不同的时期面临的需求,其形态是有差异的,所以需要深刻理解这些差异,并有针对性的设计质量活动加以验证。
需求的几个层次
一个很现实的例子
一天,大老板说:“微信小程序不错,我们内部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中的一类特殊的定义函数的形式,使用它可以定义一个匿名函数。即当你需要一个函数,但又不想费神去命名一个函数,这时候…...
网络安全协议(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指针的特性一、类的…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
