用例建模是一种从使用者目标出发描述系统行为的建模方法:它把系统当作一个整体,围绕参与者通过系统完成某个可观察目标的过程,写出用例及其主流程、备选流程和前置后置条件,用来表达和确认需求中的功能范围与交互约定。本文围绕定义、组成要素、覆盖边界,以及它与用户故事、流程图、功能列表的区别展开,并用一个示例说明写法。
要点总览(TL;DR)
- 用例建模从使用者目标出发描述系统行为,围绕参与者通过系统达成的完整目标,写出用例及其主流程、备选流程和前置后置条件。
- 一个用例由参与者、目标式命名的用例、主流程、备选流程、触发事件与前后置条件共同构成,缺一项都会留下模糊地带。
- 用例建模覆盖功能目标、参与者、触发条件、正常与异常路径;系统架构、接口设计、界面布局、优先级取舍和非功能需求的完整表达不属于它。
- 与用户故事、流程图、功能列表相比,用例建模强调目标完整性与系统职责边界,适合功能范围需多方确认、交互约定较复杂的场景。
- 用例图只是视图,建模主体是文字描述;把界面操作当步骤、按按钮拆用例、以数量衡量完整性,都是常见误解。
用例建模的核心定义与关键术语
用例建模回答的是“谁在什么条件下要系统帮他达成什么目标”。它把系统视为一个黑盒,只描述外部可见的行为,不涉及内部如何实现。一个完整的用例建模产物,通常由参与者、用例、场景与流程、前置后置条件几类要素共同构成,这些要素合起来表达功能范围与交互约定。
理解用例建模,先要建立一套共同语言。下表列出最常用的术语及其含义。
| 术语 | 含义 | 在建模中的作用 |
|---|---|---|
| 参与者(Actor) | 位于系统外部、与系统交互的角色或外部系统,可以是人,也可以是另一个系统 | 界定“谁在使用系统”,确定系统边界之外的交互方 |
| 用例(Use Case) | 参与者与系统协作达成的一个完整目标 | 表达一项有始有终的功能目标,是建模的基本单元 |
| 场景(Scenario) | 一次具体执行路径,是主流程或某条备选流程的一次实例 | 把抽象流程落到具体情形,便于讨论和验证 |
| 主流程 | 顺利达成目标的标准步骤序列 | 描述“一切正常时”系统与参与者的交互 |
| 备选流程 | 主流程之外的分支、异常或替代路径 | 覆盖条件不满足、出错、取消等情形 |
| 前置条件 | 用例开始前必须成立的状态 | 说明触发该用例的前提 |
| 后置条件 | 用例结束后系统应处于的状态 | 说明目标达成后留下的结果 |
在需求表示中,用例建模处在“功能需求”这一层。它承接业务目标与用户诉求,向下为设计、开发和测试提供可讨论的功能范围。它既不是业务战略描述,也不是技术设计文档,而是把“系统该为谁做什么”写成可评审、可追踪的文本。参与者与用例的关系可以用用例图呈现,但建模的主体是文字描述,图只是辅助视图。
用例建模包括什么、不包括什么
用例建模的边界,决定了它适合承载什么、应当交给哪些环节。把它当成“画几张图”或“写全部需求”,都会导致产物失真。下面按覆盖与不覆盖两类分别说明。
用例建模覆盖的内容:
- 功能目标:系统为参与者提供哪些可观察的目标。
- 参与者:谁使用系统、谁被系统调用,以及外部系统的交互关系。
- 触发条件:什么事件或状态启动一个用例。
- 正常与异常路径:主流程以及各类备选流程、异常分支。
- 前置条件与后置条件:用例开始与结束时系统应处的状态。
用例建模不覆盖的内容:
- 系统架构与模块划分:这些属于设计决策,用例只描述外部行为。
- 数据库与接口设计:表结构、字段、接口协议不在用例描述范围内。
- 界面布局与视觉稿:按钮位置、页面跳转的视觉呈现不属于用例步骤。
- 需求价值判断与优先级取舍:判断某个需求值不值得做、先做哪个,属于需求分析与澄清的工作。
- 非功能性需求的完整表达:性能、安全、可用性等只能作为约束附在用例上,无法由用例结构完整承载。
这条边界有一个实际意义:用例写得好,说明功能范围与交互约定清楚了;但它不能替代架构评审、优先级决策和非功能需求的专项梳理。把这些内容硬塞进用例,会让用例变得臃肿,也会让真正该由其他环节处理的问题被掩盖。
用例建模怎么运作:从目标到用例的组成结构
用例建模的运作过程,可以理解为从“找参与者”到“写清一个完整目标”的逐步收敛。每个用例由若干要素配合表达,缺一项都会让需求留下模糊地带。下面按编写顺序说明各要素及其要点。
识别参与者
先问两个问题:谁直接使用系统完成工作?系统需要调用哪些外部系统?前者是主要参与者,后者是次要参与者。参与者是角色而非具体某个人,同一个人在不同场景下可能对应不同角色。识别参与者时,把系统边界画清楚,边界之外与系统交互的才是参与者。
确定目标并命名用例
每个参与者都有想达成的目标,一个完整目标对应一个用例。命名采用“动词+对象”的目标式写法,例如“提交报销单”“查询订单状态”,让读者一眼看出参与者要达成什么。避免用“报销单管理”这类笼统名词,它无法说明目标是否完成。
编写主流程
主流程是达成目标的标准步骤序列,按“参与者动作—系统响应”交替推进,写到目标达成为止。步骤应停留在业务动作层面,例如“参与者提交报销单,系统校验必填项并生成待审批记录”,而不是描述点击了哪个按钮。
补充备选流程与异常路径
主流程之外,把条件不满足、校验失败、取消操作、超时等情形写成备选流程,并标明它从主流程的哪一步分支、最终回到哪一步或如何结束。备选流程是需求完整性的关键,很多争议恰恰出现在异常路径上。
写明前置条件、后置条件与触发事件
前置条件说明用例开始前必须成立的状态,例如“参与者已登录且具备报销权限”;后置条件说明用例结束后系统应处的状态,例如“报销单已生成并进入待审批队列”。触发事件说明是什么启动了该用例,例如“参与者点击提交”。
处理用例之间的关系
当多个用例共享一段行为或存在特化关系时,可以用包含、扩展、泛化来表达。包含用于抽取多个用例共用的必经行为;扩展用于描述在特定条件下才插入的可选行为;泛化用于表达一般与特殊的关系。这三种关系应谨慎使用,关系过多会让用例结构难以阅读,能用文字说明清楚的,不必强行抽象。
用例建模与用户故事、流程图、功能列表的区别
这几种表达方式常被混用,但它们回答的问题不同。用同一口径对照,可以判断什么时候该用用例建模。
| 对比项 | 用例建模 | 用户故事 | 流程图 | 功能列表 |
|---|---|---|---|---|
| 核心关注 | 参与者目标与系统职责边界 | 用户价值与对话起点 | 步骤流转与判断分支 | 系统具备的能力清单 |
| 粒度 | 一个完整目标,含主流程与备选流程 | 较小,通常一句话加验收条件 | 可粗可细,按流程范围而定 | 按功能条目拆分 |
| 是否强调目标完整性 | 强调,目标达成才算用例结束 | 强调价值,完整性靠验收条件补充 | 不强调目标,强调路径 | 不强调目标,强调能力有无 |
| 验收方式 | 按主流程与备选流程逐条验证 | 按验收条件验证 | 按路径覆盖验证 | 按功能是否可用验证 |
| 适用场合 | 功能范围需与多方确认、交互约定较复杂时 | 迭代中快速拆分与沟通 | 梳理业务步骤与审批流转 | 盘点能力、做范围清单 |
还需要单独说明用例图。用例图是用例建模的一种视图,用参与者和用例的连线展示系统功能范围,但它不承载流程细节。建模的主体是用例描述文本,图只是索引。只画图不写描述,等于只给了目录而没有内容。
在实际项目中,这些表达方式常常配合使用:功能列表用于盘点范围,用例描述用于把关键功能写透,用户故事用于迭代拆分,流程图用于说明跨角色的步骤流转。判断是否该用用例建模,可以看这个功能是否有明确的参与者目标、是否存在多条路径需要约定、是否需要与业务方逐条确认交互边界。
一个具体例子与常见误解
下面以“在线提交报销单”为例,演示一个用例的完整写法。该示例为演示情景,用于说明结构,不代表真实项目。
示例用例:在线提交报销单
- 参与者:报销申请人(主要参与者),财务审批系统(次要参与者)。
- 前置条件:申请人已登录系统,且具备报销申请权限。
- 触发事件:申请人发起新建报销单。
- 主流程:申请人填写报销事由与金额;系统校验必填项与金额格式;申请人上传凭证;系统生成报销单并提交至审批队列;系统返回提交成功结果。
- 备选流程(凭证缺失):申请人在上传凭证步骤选择暂不上传;系统提示凭证为必填项并阻止提交;申请人补传凭证后回到主流程继续。
- 后置条件:报销单已生成,状态为待审批,并进入对应审批人的待办列表。
这个例子体现了用例描述的几个要点:步骤停留在业务动作,参与者与系统交替推进,备选流程标明分支位置与回归路径,前后置条件说明状态变化。
常见误解与纠正
- 误解一:把界面操作步骤当作用例步骤。“点击提交按钮”“打开下拉框选择部门”是界面细节,界面改版后这些描述就失效。用例步骤应写业务动作,例如“申请人提交报销单”。
- 误解二:把每个按钮或每个接口写成一个用例。用例对应参与者的完整目标,一个目标下的多个操作属于同一用例的步骤。按按钮拆用例,会让目标被切碎,流程关系难以看清。
- 误解三:用例数量越多表示需求越完整。完整性取决于每个用例是否覆盖了主流程与关键备选流程,以及边界是否清楚。数量多但每个都只有主流程,反而掩盖了异常路径上的需求缺口。
- 误解四:用例建模只画图不写文字。用例图只表达参与者与用例的对应关系,流程、条件、异常都在描述文本里。评审时真正被讨论和确认的是文本。
当用例描述需要多人协作编写、逐条评审并随需求变更保持版本一致时,承载方式会影响建模的实际效果。ONES 提供 Wiki 页面与工作项来承载需求文档和评审记录,用例描述可以作为文档内容组织,评审意见与变更在工作项中流转;ONES Assistant 智能助手可理解项目、工作项、迭代和 Wiki 页面等工作上下文,基于项目数据和团队知识回答问题,并可将自然语言指令转化为可追踪的工作,例如把 PRD 拆解为需求和任务并按模块分配负责人。这样,用例从编写、评审到后续跟踪可以留在同一条协作链路上。需要说明的是,用例建模的方法本身独立于工具,工具解决的是承载、评审与追踪的问题。
常见问题
用例建模适合在什么阶段做,需求已经写成用户故事了还需要补用例吗?
用例建模通常在功能范围需要与业务方、开发、测试逐条确认时价值最大,可以放在需求澄清之后、进入迭代拆分之前。已经写成用户故事的需求,如果目标单一、路径简单,用验收条件补充即可;如果存在多条备选流程、跨多个角色或外部系统交互,补一份用例描述能把异常路径和前后置条件写清楚,减少后续争议。判断标准是目标是否完整、路径是否复杂,而非团队习惯用哪种模板。
一个用例的主流程写多细比较合适,写到界面操作算不算过度?
主流程应停留在业务动作层面,按“参与者动作—系统响应”交替推进,写到目标达成为止。出现具体按钮名称、页面跳转、控件类型时,说明已经进入界面设计层面,界面改版后这些描述就会失效。一个实用的检验方法是:把这段描述读给业务方听,对方能确认“这就是我要办成的事”,而无需讨论页面长什么样,粒度基本合适。
用例之间的包含、扩展、泛化关系,什么时候值得用?
这三种关系用于处理多个用例共享行为或存在特化的情况。包含适合抽取多个用例都必须执行的公共行为;扩展适合描述只在特定条件下才插入的可选行为;泛化适合表达一般与特殊的关系。使用前提是抽象之后结构更易读。如果只有两三个用例、共享内容用一句话就能说明,直接用文字描述更清楚。关系层次过多会让评审者频繁跳转,反而降低可读性。
用例描述写完以后,怎么保证评审意见和后续变更不丢失?
用例描述通常需要多人协作编写、逐条评审,并随需求变更保持版本一致。可以把用例文本放在文档协作空间中组织,评审意见与变更记录放在工作项里流转,让编写、评审和后续跟踪留在同一条链路上。ONES 提供 Wiki 页面与工作项来承载需求文档和评审记录,ONES Assistant 智能助手可理解项目、工作项、迭代和 Wiki 页面等工作上下文,基于项目数据和团队知识回答问题,并可将自然语言指令转化为可追踪的工作,例如把 PRD 拆解为需求和任务并按模块分配负责人。工具解决的是承载与追踪问题,用例建模方法本身独立于工具。
非功能性需求能不能写进用例里?
性能、安全、可用性等非功能性需求无法由用例结构完整承载,通常作为约束附在相关用例上,例如在“提交报销单”用例旁注明响应时间要求或权限校验要求。这样处理的好处是约束与具体功能目标相邻,开发和测试容易找到对应场景;局限是覆盖面取决于是否有人逐条梳理,因此非功能性需求仍需专项梳理,不能指望用例建模一并解决。
