用例

科技工作者之家 2020-11-17

用例(英语:use case),或译使用案例用况,是软件工程或系统工程中对系统如何反应外界请求的描述,是一种通过用户的使用场景来获取需求的技术。每个用例提供了一个或多个场景,该场景说明了系统是如何和最终用户或其它系统互动,也就是谁可以用系统做什么,从而获得一个明确的业务目标。编写用例时要避免使用技术术语,而应该用最终用户或者领域专家的语言。用例一般是由软件开发者和最终用户共同创作的。

在1986年,Ivar Jacobson,UML和瑞理统一过程的重要贡献者,提出了用例的概念。Jacobson的思想很有影响力,也很有发展力。之后在这个科目上又有很多贡献,在定义用例是什么和怎么有效的书写用例方面最重要,最有影响力也最全面的,是Alistair Cockburn,他写的书籍是《编写有效用例》。

用例迅速成为获取功能需求最常用的手段。用例最初是和面向对象一同提出的。但是它不止局限于面向对象系统,因为用例实质上不是面向对象。

由于不少测试工程师将测试用例简称为用例,为便于区分两者,将原来的Use case用例称为需求用例。

测试用例(对应英文Test case)已经广为人知,没有歧义,但就文字表面而言,测试用例类似是属于用例,就像红富士苹果属于苹果一样,所以为了更容易区分,需求用例是个更清晰的称呼。

程序设计·用例概念那么,到底什么是Use Case呢?在UML的文档中,Use Case的定义是:在不展现一个系统或子系统内部结构的情况下,对系统或子系统的某个连贯的功能单元的定义和描述。有点拗口,对吧?其实Use Case就是对系统功能的描述而已,不过一个Use Case描述的是整个系统功能的一部分,这一部分一定要是在逻辑上相对完整的功能流程。在使用UML的开发过程中,需求是用Use Case来表达的,界面是在Use Case的辅助下设计的,很多类是根据Use Case来发现的,测试实例是根据Use Case来生成的,包括整个开发的管理和任务分配,也是依据Use Case来组织的。

对不同的Actor来说,他要使用系统的某项功能也不同。所以,在识别和分析Use Case时,我们要对每个Actor逐一进行。对于ToDo User,我们可以轻易的识别出两个Use Case:Add Task 和 Remove Task。ToDo User主动使用这两个Use Case所描述的系统功能,所以在我们的Use Case图上,ToDo User和这两个Use Case的关系是用从ToDo User发出的箭来表示的。对于FileSystem,我们识别出的也是同样的两个Use Case,不过这次箭头从Use Case指向FileSystem,表示FileSystem是被动的。

Use Case可以用很多方式来描述,我们可以用自然语言(英语,汉语,随您的便),可以用形式化语言(哇!太酷了吧!),也可以用各种图示。在UML中,通常用两种图来描述Use Case,它们就是顺序图(Sequence Diagram)和协作图(Collaboration Diagram)。1

Use Case 由以下元素组成:

名称

简单描述

事件流

关系

活动图和状态图

Use Case 图

特殊需求

前条件

后条件

如何理解用例1.1 参与者和用例从用户的角度来看,他们对于系统的内部结构和设计的了解受到了限制,他们能够接触到的是系统所能提供的服务,也就是被开发出来的系统将是如何被使用的,这就用例方法的基本思想。用例模型主要由以下模型元素构成: 参与者(Actor)参与者是指存在于被定义系统外部并与该系统发生交互的人或其他系统,他们代表的是系统的使用者或使用环境。 用例(Use Case)用例用于表示系统所提供的服务,它定义了系统是如何被参与者所使用的,它描述的是参与者为了使用系统所提供的某一完整功能而与系统之间发生的一段对话。 通讯关联(Communication Association)通讯关联用于表示参与者和用例之间的对应关系,它表示参与者使用了系统中的哪些服务(用例),或者说系统所提供的服务(用例)是被哪些参与者所使用的。 以银行自动提款机(ATM)为例,它的主要功能可以由下面的用例图来表示。ATM的主要使用者是银行客户,客户主要使用自动提款机来进行银行帐户的查询、提款和转帐交易。 通讯关联表示的是参与者和用例之间的关系,箭头表示在这一关系中哪一方是对话的主动发起者,箭头所指方是对话的被动接受者;如果你不想强调对话中的主动与被动关系,可以使用不带箭头的关联实线。在参与者和用例之间的信息流不是由通讯关联来表示的,该信息流是缺省存在的(用例本身描述的就是参与者和系统之间的对话),并且信息流向是双向的,它与通讯关联箭头所指的方向亳无关系。

1.2 用例的内容用例图使我们对系统的功能有了一个整体的认知,我们可以知道有哪些参与者会与系统发生交互,每一个参与者需要系统为它提供什么样的服务。用例描述的是参与者与系统之间的对话,但是这个对话的细节并没有在用例图中表述出来,针对每一个用例我们可以用事件流来描述这一对话的细节内容。如在ATM系统中的"提款"用例可以用事件流表述如下:

1. 用户插入银行卡 2. 输入密码 3. 输入提款金额 4. 提取现金 5. 退出系统,取回银行卡 但是这只描述了提款用例中最顺利的一种情况,作为一个实用的系统,我们还必须考虑可能发生的各种其他情况,如银行卡无效、输入密码错、用户帐号中的现金余额不够等,所有这些可能发生的各种情况(包括正常的和异常的)被称之为用例的场景(Scenario),场景也被称作是用例的实例(Instance)。在用例的各种场景中,最常见的场景是用基本流(Basic Flow)来描述的,其他的场景则是用备选流(Alternative Flow)来描述。对于ATM系统中的"提款"用例,我们可以得到如下一些备选流:

备选流一:用户可以在基本流中的任何一步选择退出,转至基本流步骤5。

备选流二:在基本流步骤1中,用户插入无效银行卡,系统显示错误并退出银行卡,用例结束。

备选流三:在基本流步骤2中,用户输入错误密码,系统显示错误并提示用户重新输入密码,重新回到基本流步骤2;三次输入密码错误后,信用卡被系统没收,用例结束。 … 通过基本流与备选流的组合,就可以将用例所有可能发生的各种场景全部描述清楚。我们在描述用例的事件流的时候,就是要尽可能地将所有可能的场景都描述出来,以保证需求的完备性。

1.3 用例方法的优点用例方法完全是站在用户的角度上(从系统的外部)来描述系统的功能的。在用例方法中,我们把被定义系统看作是一个黑箱,我们并不关心系统内部是如何完成它所提供的功能的。用例方法首先描述了被定义系统有哪些外部使用者(抽象成为Actor),这些使用者与被定义系统发生交互;针对每一参与者,用例方法又描述了系统为这些参与者提供了什么样的服务(抽象成为Use Case),或者说系统是如何被这些参与者使用的。所以从用例图中,我们可以得到对于被定义系统的一个总体印象。 与传统的功能分解方式相比,用例方法完全是从外部来定义系统的功能,它把需求与设计完全分离开来。在面向对象的分析设计方法中,用例模型主要用于表述系统的功能性需求,系统的设计主要由对象模型来记录表述。另外,用例定义了系统功能的使用环境与上下文,每一个用例描述的是一个完整的系统服务。用例方法比传统的SRS更易于被用户所理解,它可以作为开发人员和用户之间针对系统需求进行沟通的一个有效手段。 在RUP中,用例被作为整个软件开发流程的基础,很多类型的开发活动都把用例作为一个主要的输入工件(Artifact),如项目管理、分析设计、测试等。根据用例来对目标系统进行测试,可以根据用例中所描述的环境和上下文来完整地测试一个系统服务,可以根据用例的各个场景(Scenario)来设计测试用例,完全地测试用例的各种场景可以保证测试的完备性。2

USE CASE的来历Ivar Jacobson在1967年定义爱立信AXE系统的构架时开始书写使用场境usage scenarios。

二十世纪八十年代中期Jacobson花了很多精力来思考过去十多年的工作方法。他造了一个术语anvendningsfall,大意是“使用情况”(situation of usage)或用况(usage case)。但当用英文出版的时候,他发现“useage case”在英语里说不通,所以写作用例“use case”。

创建USE CASE的原则用例是短文。

用例可以是一个场景,包括动作和互交。

用例可以是一组场景,描述不同场景下的行为。这种书写格式可以在任何时候描述有变体的行为,例如黑盒需求,业务流程,系统设计说明。

用例里不要有系统设计。

用例里不要有界面设计。

用例里不要有特性列表。

用例里不要有测试。

用例应该描述行为需求。

用例的主场景不要超过九步。可以在适当的层次上得到子目标和移除设计说明。

用例的最大价值不在于主场景,而是在于备选行为。主场景可能只占用例长度的四分之一到十分之一。

Use Case 事件流Use Case具有一个基本事件流(可称为"理想路径")、多个例外流,包括:

基本变化

特殊情况

处理错误情况的异常事件流

Use Case 说明书Use Case 说明书应包括以下内容:

功能描述

可用性

可靠性

性能

可支持性

设计约束

Use Cases将做成多大试图决定Use Case的大小是一个很有趣的话题,处理这件事的一个方法是将Use Case的大小跟它的意图和范围关联起来,对于一个真正大的范围来说,一个Use Case并不要在一个系统中处理那么多,但这些系统都用于同一商业领域,称为Business Use Case,它把整个公司看作一个黑盒和Actor关于公司目标的说明。这些Business Use Case的场景不允许假定任何公司内部的结构,一个客户将向公司下一个定单而不是客户服务部门。

对于系统发展而言,Use Case的范围限制一个单一的系统,这是Use Cases最通常的形式,我们称之为System Use Case,它把整个系统看作是一个黑盒,它不指定任何内部结构并且仅受限于问题域的语言描述。

Use Cases的另一范围是设计子系统和系统内部组件的,称为Implementation Use Cases,它把组件看作一个黑盒,并且这些Actors是区分它的成员。例如:可能会用Implementation Use Cases去说明应用系统中email组件的需求。

给出了这些分类,关于Use Case的大小话题变得容易了,设计这些项的范围来调整整个大小。帮助系统设计者,每个Use Case只描述没有大的分支的行为的单个线索。违背这个规定,Use Case看起来通常是不准确的或含糊的,作为测试说明的资源和参考,它也是很难使用的。

Use Cases的说明Use Cases的好处是一些情节能用不同程度的正规化的文字说明。每个情节涉及Use Cases中单一的途径,细节是条件组。

不正规的文本描述也能使用,不过当条件较多和可能失败的情况下它们很难跟随下去。开始试图理解需求时,不正规的叙述风格也是非常有用的,然而随着Use Cases的进展,使用更加正规的机制去说明Use Cases才是有用的。

下面是客户对Use Case“下定单”的粗略概略:

“确定客户,找出需要的并且仓库里还有的物品并检查客户信用额是否够用”

结构化叙述的格式已经被证明是非常有效的。这个格式所做的事是描述每一个情节的行为者:目标语句对顺序的叙述。在这个顺序中,每一个行为者:目标的语句对都假设前一个的目标是成功的,右面是一个简单的范例:

Use Cases认为我们正在设计的系统是一个单一的黑盒,根本没有任何内部结构被记录下来,并且它被认为是一个情节产生的目的及对应单一的行为者(Actor)。这些Use Cases没有表示任何关于系统内部的东东,只是表示系统将达到什么样的目标及由什么(人或其它系统)操作和负责。

使需求有利于回顾Use Cases已经得到越来越广泛的应用,它与其它需求捕获技术相比,它成功的原因在于:

1 Use Cases把系统当作一个黑盒

2 Use Case 使在需求中看到实现的决定变得更加容易

最后一点源于第一点的补充,一个Use Case没有指定任何这些需求相关的系统的内部结构,所以说,如果这个Use Case中陈述了"提交改变到定单数据库"、"显示结果到Web页面"等的话,那么内部结构是显而易见的,并造成对设计的潜在约束。

为什么这些需求不指定内部结构的原因是,说明的内部结构给设计者带来了额外的约束,没有这些约束设计者们能更自由地建立一个正确实现客观可见行为的系统,并存在出现突破方案的可能性。

Use Cases的图形符号这里是Use Cases的图形符号描述,UML中一个单一的"Stick-Man"符号标示角色(Actor),用椭圆标示Use Cases,如这些图对于你想看到Use Cases之间如何关联的"大图"和获得系统上下文的大体描述来说是非常重要的。

Use Cases图没有显示不同的场景,它们的意图是显示角色和Use Cases之间的关系。所以Use Cases图需求用结构化叙述文本来补充。UML提供一些可供选择的图来显示不同的场景,这些常规的图形有交互图、活动图、顺序图、状态图等。使用这些图的主要缺点是它们不象文本一样是紧密的,但它们能用于给出Use Case的整体感觉。

Use Case 的评价标准是否每个Use Case 都包括至少一个actor?

是否每个Use Case 都独立于其他Use Case?

是否每个Use Case 都有一个简单的行为或事件流?

是否每个Use Case 都有一个唯一的、直观的、可扩展的名称,使它不至于在后期被混淆。

用户是否容易理解Use Case 的名称和描述。

Use Case 模型评价标准Use Case模型显示系统中的Use Case与Actor 及其相互关系。其评价标准有:

Use Case 模型是可理解的吗?

通过对Use Case 模型的研究是否能对系统功能有一个清晰的概念。

所有的actor都定义了吗?所有的功能需求都满足了吗?

Use Case 模型是否存在多余的行为。

从模型到Use Case包的划分是否是恰当的。3

使用Use Case 的误区由于具有简单的图形符号、易理解的自然语言说明书,Use Case在文档系统和软件需求领域成为一 项越来越受欢迎的技术。Use Case对开发小组极具吸引力,即使小组成员对正式的需求文档没有经验,但这些简单性却具有欺骗性,即使项目小组在开始使用Use Case 时没有任何麻烦,当他们将其应用于大项目时常常会遇到许多同样的问题。

使用 use case 十大误区

系统的boundary 没有定义或经常改变;

从系统观点而不是actor观点来定义Use Case;

Actor的名称不一致;

Use Case 定义过多;

Use Case 和actor之间的关系象蜘蛛网一样错综复杂;

Use Case的说明太长;

Use Case的说明不清楚;

Use Case没有正确的描述功能需求;

用户无法理解Use Case;

Use Case 无法正常结束。

2 如何避免以上问题

清楚的确定系统的boundary.

简单来说,系统的boundary就像一个加了标签的盒子,actor在盒子外,而Use Case在盒子内。我们称之为系统的这个盒子究竟是什么呢?一个计算机系统?一个应用系统?或一个完整的企业?…Use Case 可以用来合理地描述任意系统。但一次只能用来描述一个系统,在一个系统中恰当定义的actor和Use Case用于另一个不同的系统中就会出现错误。

使用标准模板书写Use Case 说明书

Use Case 图形符号已经被标准化并作为对象管理小组UML的一部分,但自然语言的Use Case 说明书还没有被标准化。为了成功书写Use Case 说明书,我们需要一个标准模板来保证Use Case 的一致性。

关注actor的真正目的,从actor的观点而不是系统观点来命名Use Case

面向Use Case 的需求与传统的功能性系统需求之间最显著的区别在于actor ,以面向Use Case的观点,系统存在是由于actors 要通过该系统实现某些目标,actor与系统进行交互来实现其目标,我们将这些交互行为定义为Use Case 。

不要将Use Case 说明书与用户接口设计相混淆

有一种很流行的观点:由于Use Case 是actors 与系统之间的交互,所以将所有的用户接口设计图放在Use Case说明书中是一个好办法。初看时,这的确很有用,因为它将在说明书中描述的actor/系统之间的交互行为以图的形式表示出来,非常直观。但是这样做的负面影响却远远大于其好处,用户接口设计可能会随着时间而改变,我们不应该让系统需求依赖于用户接口设计,相反地,用户接口设计应该满足Use Case 需求。如果我们将用户接口设计置于Use Case 说明书中,当需求需要被认可和定为基线时,很自然地,这些设计元素可能仍然在改变,这就使得用户接口设计成为不完整的、不正确的和/或不一致的。

将用户接口设计置于Use Case 说明书还会出现另一个问题,为了在Use Case 之间和接口之间建立一对一的通信,我们会选择反映用户接口的Use Case块而不是反映用户目标的Use Case 块,这样,为了表达一个完整的用户目标,我们使用交互Use Case 关系,将不同的、基于用户接口的Use Case 联接起来,结果在Use Case 模型中,我们得到了一幅类似蜘蛛网的关系图。实际上,这副图是用户接口说明图,虽然它在系统文档中是很重要的一部分,但他属于用户接口设计文档,而不是Use Case 需求文档。

实现用户接口和Use Case 交互之间的松散耦合

松散耦合是比较合适的,低逼真度的用户接口图有助于理解Use Case ,但要注意不要过度的将基本交互与用户界面机制相连,用户界面很有可能会改变。在功能说明书中,要注意actor做些什么(如"提交请求")而不是交互是怎样完成的(如"双击提交按钮")。

不要在Use Case 和用户接口之间建立通信

试图在Use Case 和用户接口之间建立通信可能会存在潜在的、不正确的功能操作。Use Case 不仅与只能访问某个接口的actor相联,而且与那些能够更新该接口的actors相连(这可能是例外流),结果就造成了不正确的功能操作。我们应该在基于实际用户目标和功能操作的基础上拆分Use Case ,而不是在基于用户接口的基础上组合Use Case ,只有这样才能得到正确的Use Case 模型。

回顾Use Case 模型和Use Case 说明书,如果你不能防止所有的误区,你应该尽早认识问题并确定问题

这个观点并不是什么新东西,有关代码检查的经典算法已有大约25年历史了,但怎样将其应用于Use Case 呢? 首先,回顾Use Case 模型,回顾一下Use Case 的简单说明(Use Case 名称、目标、简单描述)。这项工作应在绘制草图时尽早执行,并在写详细的Use Case 说明书之前完成。接着是回顾Use Case 草图,保证图是正确的,并且详细的Use Case说明书是完整的。最后是正式回顾最终的Use Case 图和Use Case 说明书。

我们发现这种三阶段式回顾比单一的"宇宙大爆炸"式回顾有效,在我们花大量的时间写说明书之前,Use Case图中存在的许多实质性问题可以被发现,这种方法减少了当需求改变时需要做的重复工作。4

应用的复杂性和危险主要行为者(Actor)和Use Case之间没有连结

一些情况下,从Use Case中取值的行为者(Actor)和积极参与这个Use Case的行为者(Actor)之间没有清晰的连结。如:财务主管能成为“发票确认”的行为者(Actor),但他未必是创建发票的人。这不是什么问题,这个Use Case仍然是正确的,它正说明行为者取值和设计的系统的范围外的Use Case发生的初始化之间的关系。主要行为者是有用的,因为这个人扮演的角色是当你说明Use Case时需要跟他说的人。

情节步骤不需要连续

情节中步骤顺序的情况是没问题的,这里有一些机制去突出可能的并行步骤。在UML中活动图是首选的机制,通过非正式地看Use Case的情节你可以注意到可能的平行步骤;可以看Use Case内一些邻近的步骤;也可以有相同的行为者(Actor)对步骤负责。之前我们举过的例子里,确认数量和确认信用额可能是平行的。有时候在Use Case的说明文档中标记这些可能的平行步骤是有用的。

Use Cases的大小

当开始做Use Cases的时候有个很显然的危险就是它要么有很多步骤要么就很少步骤。如果在Use Case中有超过15个步骤,它可能包含一些实现明细。如果它只有非常少的步骤则检查它的目标是否是达到一个没有很多分支的活动的单一线索。

较少的人类行为者(Actor)

如果Use Case有较少的人类行为者,而大多数行为者是其它系统,通常的做法是修改这个Use Case。寻找系统必须做出反映或公认的事件胜过会见这些行为者。

需求捕获和系统复杂性

总而言之,这些情节捕获到系统复杂度的同时行为者:目标语句对容许大的系统以相对压缩的格式说明。Use Case的格式的作用是用户和开发者能标志出行为者,然后确认这些行为者工作职责对应(或不对应)的目标,代替一个大的很难读的功能规格说明书。

仅仅这样,用户和开发者就有足够的兴趣进而研究那些情节的细节。

系统不仅仅有应得的功能性需求

一些Use Cases并没有捕获所有的客观需求,仅仅是捕获了系统怎么用的那些功能性需求。然而还有许多方面的需求需要去捕获的。其中有的非功能性需求使用关联以至于也能隶属于个别的Use Case,如性能需求和系统容量的需求。另外的一些不是关联的而是要单独地去捕获,它们是以下的需求:

·系统范围

系统用户的目标

用户界面原型

一般规则

约束

算法

运行时期和建立时期的需求比较

一个重要的因数要记住,就是系统的赞助者是大过用户团体的。系统中有许多的风险承担者,Use Cases仅仅捕获其中一些风险承担者的需要,具体说,Use Cases仅仅捕获系统运行时期的需求而忽略做为系统开发组织的风险承担者的需求,开发组织最有兴趣的是对建立时期需求的描述。

运行时期需求包括:系统范围、用户组织对产品的期望和目标、Use Cases、其它非功能性需求。

建立时期需求包括:减少开发成本、较少的变更处理、现存组件的重用。

建立时期的需求可以部分的由Use Cases把握。但许多方面是需要由开发组织的处理的。

项目范围和目标:项目必须提交什么。(和系统范围的区别是它提交的是所有项目的东西)

增长性和变更请求:这些可以在捕获为常规Use Cases格式中的“Change Cases”

开发负责人的约束:包括标准、习惯、工具、品质度量标准、品质保证原则、及品质保证的习惯。5

Use Cases的适用性Use Cases首先用于需要响应客观事件的系统。它们能用于提供了一个有很容易理解的目标的清楚的行为者的环境。当结果不可定义或不清晰时不能用Use Cases。意思是如果目标成功或目标失败不能有一个明确的定义,那么Use Cases不能用来捕获需求。

然而说到这,大部分对象方法都使用Use Cases。因为Use Cases被证明是捕获需求的非常有效的机制。

Use Case的描述用例将系统的功能范围分解成许多小的系统功能陈述。

一个用例代表了系统的一个单一的目标。

用例是一个行为上相关的步骤序列。

小结Use Case 是系统提供的功能块,换句话来说Use Case演示了人们如何使用系统。通过Use Case观察系统,能够将系统实现与系统目标分开,有助于了解最重要的部分――满足用户要求和期望,而不会沉浸于实现细节。通过Use Case 用户可以看到系统提供的功能,先确定系统范围再深入开展项目工作。6

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。