划分用户故事(user-story)的原则

在敏捷开发过程中是通过用户故事来将需求具体化成可以进行迭代开发的一个个现实的可见的开发任务。因此在敏捷软件的开发过程中,用户故事的划分对于迭代和开发起着举足轻重的作用。

用户故事从其名字来看是站在用户的角度所描述的故事,同时也是用户所能看懂的故事,开发人员最容易犯下的一个错误就是站在自己的角度去思考和划分故事,这样就背离了用户故事的初衷。

 

那什么是用户故事?首先来说用户故事是对需求的细化和切分,既然是细化,就得有一个度,需求的颗粒度需要多少才能称之为用户故事?这就牵扯出和用户故事一起出现的另外一个关键的单词叫史诗故事epic,通俗来说就是大型的故事。Epic有一些自身的特点:如是由许许多多的较大的不确定的需求(large fuzzy  requirements)组成;另外epics本身具有更低的优先级,因为你不能直接通过其完成迭代和开发,而是首先需要划分成较小的真正的user-story;除了这两点,epics因为包含了太多的模糊性需求,所以常常混杂了很多不同的特性,而一个特性就是一组可以归为一类的需求,同时对某一特定的用户存在着交互的价值。

 

在用户故事的划分中有三要素,分别为card,conversation和confirmation。

card 故事描述:通过将故事写在note card上面,除了故事本身的描述之外,还应该包括故事的时间点估计及对应的测试行为等等。

 

conversation 通过交谈丰富内容:用户故事的具体细节不是某一个开发人员或者PO自己拍着脑袋定义出来的,而需要项目组中的成员与PO或者客户之间沟通得出的。

 

confirmation 验收测试能够确认故事已经完成:用户故事划分以后是由开发人员通过编码实现,但是不能仅靠开发人员自测确认故事完成,需要的是一系列的验收测试用以保证故事功能的完成及软件按照我们的预期运行。

 

关于用户的编写原则,有一个通用的模板用以站在用户的角度描述用户所期望得到的功能:

As a role, I want to do something or a piece of functionality, so that achieve some business value or statement of intent. 

作为一个角色,通过某项操作,以便能够完成特定的目标。

在这个模板中有三个不同的点,分别为用户角色--who,某项操作--what,完成的目标--why(reason)。

如:作为一个国米的球迷,通过点击官网的最新新闻栏,以便能够实时了解最新的国米动态。

 

一个良好的User-story的编写应该遵循INVEST原则:

Independent:独立性

用户故事之间应该具有独立性(有点类似于UT中的test case),不应该依赖于其他的用户故事。如果用户故事存在依赖性那么就会导致用户故事之间存在着不同的优先级,只有被依赖的用户故事完成才能继续开发依赖的用户故事。一般可以通过组合用户故事或者分割用户故事来减少用户故事间的相互依赖性。

Negotiable:可协商

用户故事不是签订的商业合同contracts,它是由客户或者PO同开发小组的成员共同协商制定的,如果最开始像商业合同一样设定了太多的条条框框和限制就无法更好的沟通及协商,也就不可能划分出既让客户满意,也能让开发认同的好的用户故事。

Valuable:有价值

用户故事必须对于最终的用户是有价值的,因此应该站在用户的角度去编写,描述的是一个一个的feature,而非一个一个的task。

Estimable:可评估

对于一个用户故事的划分需要足够的领域知识,使得在划分i故事之时就能大致了解故事开发的周期,为了减少估算的不确定性,故事本身不能太大。

Small:短小

故事应该尽量的短小,当然也不是说越小越好。短小的故事可以减少划分过程中估算的误差,最好的故事是能够在一个迭代周期之内完成的。如果太大就应该考虑将其拆分为多个粒度更小的用户故事。

Testable:可测试

个人认为这一点在所有的特性中对于用户故事的重要程度最高。首先,如果一个用户故事无法进行测试,那么也就无法判断该故事是否完成。除此之外,对应的验收测试也最好是自动运行的,这样在任何时候都能触发该用户故事的检验。最后,必须在定义了验收测试通过的标准后才能认为故事划分完毕。

关于Testable,有一个较为经典的例子:

As  a user, I want to be able to cancel a reservation so that I can get a refund for the trip not taken.

关于此用户故事前面所提到的几个要素who,what,why都满足,那么验收测试应该如何去做?模拟的应该是实际的真正场景,如:退款是全退还是部分退还;提前多久cancel才是有效的;退还款项如何与用户之间进行确认等等。

按照刚才的假设,做一个真实场景的验收测试用例,通过Given-When-Then的方式来设定:

Given:“我”付款1000RMB预定了一个3周后从成都飞往三亚的航班。

When:在航班起飞前一周“我”取消了该行程。

Then:“我”应该得到预定机票半价的退款(500RMB)

在对用户故事设定验收测试的条件时候,分别对应:starting state---》event---》final state

任何的user story,在验收测试的时候都必须至少设定一个defaule scenario。

 

https://blog.csdn.net/rxr1st/article/details/7479472

 

转载于:https://www.cnblogs.com/softidea/p/9609996.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【git】----- clone 及上传文件

在GitHub上创建一个项目首先点击新存储库进入创建的步骤创建完成后跳转到下一个页面复制路径然后在自己的新建的文件夹里面(例如:git)右键,点击Git Bash Here进入命令行输入 git clone 输入刚刚拷贝的路径(https://github.com/nam…

数据结构与算法总结

文章目录线性数据结构1. 数组2. 链表2.1. 链表简介2.2. 链表分类2.2.1. 单链表2.2.2. 循环链表2.2.3. 双向链表2.2.4. 双向循环链表2.3. 应用场景2.4. 数组 vs 链表3. 栈3.1. 栈简介3.2. 栈的常见应用常见应用场景3.2.1. 实现浏览器的回退和前进功能3.2.2. 检查符号是否成对出现…

使用 Spring Data JPA 简化 JPA 开发

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线&am…

JS 取整、取余

一、取整 1. 取整 // 丢弃小数部分,保留整数部分 parseInt(7/2)  // 3 2. 向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(7/2)  // 4 3. 向下取整 // 向下取整,丢弃小数部分 Math.floor(7/2)  // 3 4. 四舍五入 // 四舍五入 Math.round(7/2)  // 3 二、取余 // …

中国历史朝代及皇帝简介

一 、原始社会(约170万年前到约公元前21世纪)  [详细]约170万年前 元谋人生活在云南元谋一带       查看元谋人>>约70-20万年前北京人生活在北京周口店一带      查看北京人>>约1.8万年前山顶洞人开始氏族公社的生活      …

Hadoop基础-Hdfs各个组件的运行原理介绍

Hadoop基础-Hdfs各个组件的运行原理介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.NameNode工作原理(默认端口号:50070) 1>.什么是NameNode NameNode管理文件系统的…

JPA入门例子(采用JPA的hibernate实现版本)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 (1)、JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范…

IDEA详细配置与使用

文章目录一、IntelliJ IDEA 介绍二、查看安装目录结构三、查看设置目录结构3.1 config目录3.2 system目录四、设置显示常见的视图1.工程界面展示2.如何删除模块3.查看项目配置五、常用配置1.Appearance & Behavior2. Editor - General3. Editor – Font4. Editor – Color …

M1905

11.09 11:00------102万                          11.09 14:00---103万 11.12 16:00------103万                          11.19 16:00---94万 11.20 16:00----94.9万          …

前端又要失失失失失失失失失业了!

1. 祸起 看到标题,切图仔们又是菊花一紧。前几天微软刚刚开源Sketch2Code,让UI草图转化成HTML代码。切图仔瑟瑟发抖。 还没等切图仔调整好心情,号称H5代码生成工具的H5DS也开源了最新的代码。 尼玛,H5代码都可以一键生成了&#x…

我是如何对研发和测试人员进行量化的绩效考核的

我把硬件开发、软件开发和测试人员的绩效考核分成3部分,即重点工作、绩效改进和绩效浮动。下面分别进行说明它们的量化方法。1. 重点工作的绩效量化方法重点工作的量化标准应从数量(包括文档)、时间、质量和难度系数等多个维度来评定。…

常见cmd命令,开发人员必备

运行程序 notepad--------打开记事本calc-----------启动计算器regedit.exe-------注册表write----------写字板mmc------------打开控制台iexpress-------木马捆绑工具,系统自带fsmgmt.msc-----共享文件夹管理器osk------------打开屏幕键盘certmgr.msc----证书管理…

IDEA常用快捷键【win-mac对比】

文章目录Mac 键盘符号说明CtrlAltShiftCtrl AltCtrl ShiftAlt ShiftCtrl Shift Alt其他Mac 键盘符号说明 ⌘ Command⇧ Shift⇪ Caps Lock⌥ Option⌃ Control↩ Return/Enter⌫ Delete⌦ 向前删除键(FnDelete)↑ 上箭头↓ 下箭头← 左…

SpringBoot 之环境搭建

见: http://bbs.itmayiedu.com/article/1491835651684 1. 什么是**SpringBoot?** Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人…

十五、类与封装的概念

1、类的封装 C中类的封装: 成员变量:C中用于表示类属性的变量成员函数:C中用于表示类行为的函数 C中可以给成员变量和成员函数定义访问级别 public:成员变量和成员函数可以在类的內部和外界访问和调用 private:成员变量…

哪些人不能要 哪些人不能留

以下所有的论断都是基于中小型实业公司而言,因为我任职过的公司都是这个类型的。招聘时这些人不能要:1)频繁跳槽的人。这些人要么对工作不用心,要么对环境的适应能力差,要么不愿去分析公司的长处和短处,要么…

vue项目中axios的封装

1.安装 1 npm install axios --save 2.新建http.js,封装拦截器以及多种请求方式 1 import axios from axios;2 import { Message } from element-ui;3 4 // 请求拦截器5 axios.interceptors.request.use( 6 config > {7 //发送请求前需要做什么&#xff0c…

【2022】Java基础面试真题

文章目录1. Java基础1.1 为什么Java代码可以实现一次编写、到处运行?1.2 一个Java文件里可以有多个类吗(不含内部类)?1.3 说一说你对Java访问权限的了解1.4 介绍一下Java的数据类型1.5 int类型的数据范围是多少?1.6 请…

关于 Virtual SAN/VSAN 的常见问题解答

问:VSAN需要使用 SSD,它有什么用途呢? 答:SSD 用于读取缓存 (70%) 和写入缓冲 (30%)。每次写入都会先转到 SSD,稍后再取消暂存到 HDD。 • 问:创建 VSAN 虚拟机存储策略时,何时应使用“允许的故…

IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我是在别人问我的时候,才发现还可以有这个问题,主要是他新项目直接打开,什么都没配置,就打…