📄 一句话概括
活动图=节点+箭头+判定——实测一个报销流程 7 个节点、8 条箭头、2 个判定点,走到终点共 3 条路径;判定点每多一个,要测的条数就涨。
📝 本节和前面几节的关系
8.11 的用例只说了【做什么】,这一节说做的时候按什么顺序走。
一、三个要素
节点:一个动作(填单、审核、打款),画成圆角矩形。 箭头:先后关系,一个节点出多条箭头就是判定或并行。 起点与终点:实心圆和带圈的实心圆。
二、实测:7 节点 8 箭头 3 条路径
节点:开始、填单、主管审、财务审、退回、打款、结束——7 个。 箭头 8 条,判定点 2 个(主管审、财务审各出两条)。 从开始到结束的路径 3 条:正常过两级、主管退回、财务退回。
三、判定点与测试条数
每多一个判定点,路径就可能翻倍——2 个判定点已经 3 条路径,这是测试用例的下限。 活动图的最大用处就在这里:画出来才看得见【要测多少条】。 没画图的时候,人往往只测一条【一切顺利】的路径。
四、环怎么处理
退回直接连回填单,就成了回环——路径数变无穷,图的表达力也变差。 常见处理:把退回画成终点(本次流程结束,重填算下一轮),或加一条【最多退几次】的约束。 有环的流程一定要标清出口,否则这张图读不出【怎么结束】。
五、动手 Demo:使用活动图表示工作流程
用一张邻接表描述报销流程:节点 → 出边。 数节点、箭头、判定点,并递归数出从开始到结束的路径条数。
edges = {"开始": ["填单"], "填单": ["主管审"],
"主管审": ["财务审", "退回"], "财务审": ["打款", "退回"],
"退回": ["结束"], "打款": ["结束"], "结束": []}
def paths(n, memo=None):
memo = {} if memo is None else memo
if not edges[n]:
return 1
if n not in memo:
memo[n] = sum(paths(m, memo) for m in edges[n])
return memo[n]
print(len(edges), sum(len(v) for v in edges.values()), paths("开始"))
# 7 8 3
实跑输出:
--------------------------------------------------------------------
使用活动图表示工作流程
--------------------------------------------------------------------
活动图=节点+箭头+判定。实测一个报销流程,顺便把**路径条数**数出来:
节点 出边
------------------------
开始 填单
填单 主管审
主管审 财务审/退回
财务审 打款/退回
退回 结束
打款 结束
结束 —(终点)
节点 7 个
箭头 8 条
判定点 2 个(主管审/财务审)
从开始到结束的路径 3 条
**判定点每多一个,路径就可能翻倍**——2 个判定点已经是 3 条路径。
**这就是活动图的价值**:画出来才看得见【要测多少条】。
**注意【退回】这条支路**:本次流程到此结束,重新填单算下一轮——
**真要画成回环(退回直接连回填单),路径就成了无限条,得另加【最多退几次】的约束。**
实测:7 个节点、8 条箭头、2 个判定点、3 条路径。 路径数就是测试用例的下限——这条数是活动图最实用的产出。 退回如果画成回环,路径就无穷了,必须另加约束或改成终点。
30 秒实验
- 把你公司的一个审批流程画成活动图,数出判定点与路径条数。
- 对照你们的测试用例,看看有没有漏掉的路径。
常见误区
- 以为活动图就是流程图,不必细想。数出路径条数才叫画完。
- 把回环画上却不标出口。这张图就读不出怎么结束。
自测三问(点开对答案)
1. 活动图三要素是什么? —— 节点(动作)、箭头(先后)、起点与终点;一个节点出多条箭头就是判定或并行。 2. 实测数字是多少? —— 7 个节点、8 条箭头、2 个判定点、3 条路径。 3. 路径条数有什么用? —— 它是测试用例的下限;不画图时人往往只测一切顺利的那条。- ☐ 8.13 使用状态机图表示状态的变化
相关笔记
- 使用用例图表示交给计算机的工作 — 用例展开成流程
- 使用状态机图表示状态的变化 — 相邻但不同:一生 vs 一件事
- UML的使用方法之三:表示非面向对象的信息 — 过程式代码的天然图
- 🧩 面向对象是怎样工作的 · 索引