概述
PlantUML 最擅长制作的就是时序图啦!
在本文中,我们将讲解如何使用 PlantUML 来演示时序图的制作。
简单示例
在时序图中,可以使用 -> 来绘制参与者之间传递的消息,而不必显示的声明具体的参与者。
一个简单的示例如下:
用户 -> 认证中心: 登录操作
认证中心 -> 缓存: 存放(key=token+ip,value=token)token
用户 <- 认证中心 : 认证成功返回token
用户 -> 认证中心: 下次访问头部携带token认证
认证中心 <- 缓存: key=token+ip获取token
其他服务 <- 认证中心: 存在且校验成功则跳转到用户请求的其他服务
其他服务 -> 用户: 信息
此外,我们可以使用 —> 来表示一个虚线剪头,此外,还可以是使用 <- 和 <— 来表示消息传递。
声明参与者
虽然在时序图中,我们可以直接使用 -> 来进行参与者之间的消息传递,无需一定要对参与者进行声明。
但是,实际上,PlantUML 中其实也可以对参与者进行显示声明并进行更多的控制。
在 PlantUML 中可以使用以下这些关键词来对参与者进行声明,不同的参与者显示的形状不同:
- actor: 角色
- boundary: 边界
- control: 控制
- entity: 实体
- database: 数据库
- collections: 集合
- queue: 队列
- participant: 普通参与者
我们来看一段示例代码:
participant A as Foo
actor B as Foo1
boundary C as Foo2
control D as Foo3 order 1
entity E as Foo4 order 2
database F as Foo5 order 4
collections G as Foo6 order 3 #red
queue H as Foo7 #99FF99
Foo -> Foo1: To Actor
Foo -> Foo2: To boundary
Foo -> Foo3: To control
Foo -> Foo4: To entity
Foo -> Foo5: To database
Foo -> Foo6: To collections
Foo -> Foo7: To queue
可以看到:
- 我们使用了 as 为 UML 显示中的实体设置别名,并在后续的消息传递中通过别名进行设置。
- 同时,我们可以通过 order 来自定义参与者打印的顺序,即 order 顺序由小至大从左向右依次显示。
此外,我们还可以对参与者通过 RGB 值或者颜色名称来声明实体的颜色。
参与者中使用非字母符号
在参与者中,如果包含一些特殊符号时,可以用 “” 进行包围,示例如下:
Alice -> "Bob()" : Hello
"Bob()" -> "This is very\nlong" as Long
Long --> "Bob()" : ok
给自己发消息
在时序图中,参与者也可以给自己发送消息,示例如下:
Alice->Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
文本对齐
默认情况下,消息都会在连接线的上方显示,当然,我们也可以通过一些方式来控制其行为,例如我们可以让响应信息显示在剪头的下方:
skinparam responseMessageBelowArrow true
Bob -> Alice : hello
Alice -> Bob : ok
消息样式
在 PlantUML 中,我们对剪头的样式进行配置,具体来说,有如下几种不同的消息样式:
-> :普通的消息样式
- —> :虚线消息样式
- ->x:丢失的消息
- ->o:箭头末尾加圈
- -\,-/:剪头只有上半部分或者下半部分
- ->>:细箭头
- <->:双向箭头
示例代码如下:
Bob ->x Alice
Bob --> Alice
Bob -> Alice
Bob ->> Alice
Bob -\ Alice
Bob \\- Alice
Bob //-- Alice
Bob ->o Alice
Bob o\\-- Alice
Bob <-> Alice
Bob <->o Alice
箭头颜色调整
在 PlantUML 中可以对箭头的颜色进行调整:
Bob -[#red]> Alice : hello
Alice -[#0000FF]->Bob : ok
消息序号编号
关键词 autonumber 可以自动在消息上增加编号:
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
标题、页眉和页脚
在 PlantUML 中,可以对 UML 图配置标题、页眉和页脚,示例如下:
header Page Header1
footer Page %page% of %lastpage%
title Example Title1
Alice -> Bob : message 1
Alice -> Bob : message 2
时序图分页
在 PlantUML 中可以使用关键词 newpage 用于把一张图分成多张,即将多张图在同一个文件中进行管理。
在 newpage 之后添加文字可以作为新的示例图的标题,这样就可以方便的进行长图打印。
Alice -> Bob : message 1
Alice -> Bob : message 2
newpage
Alice -> Bob : message 3
Alice -> Bob : message 4
newpage A title for the\nlast page
Alice -> Bob : message 5
Alice -> Bob : message 6
组合消息
在 PlantUML 中,可以通过如下关键词来组合消息:
- alt/else:条件控制
- opt
- loop:循环
- par
- break
- critical
- group:自定义分组,可以在其中通过 [] 的方式来增加次级标签
- end:结束分组
Ps:分组可以嵌套使用。
我们先来看一个示例:
Alice -> Bob: 认证请求
alt 成功情况
Bob -> Alice: 认证接受
else 某种失败情况
Bob -> Alice: 认证失败
group 我自己的标签
Alice -> Log : 开始记录攻击日志
loop 1000次
Alice -> Bob: DNS 攻击
end
Alice -> Log : 结束记录攻击日志
end
else 另一种失败
Bob -> Alice: 请重复
end
消息、节点注释
我们可以通过在消息后面添加 note left 或者 note right 关键词来给消息添加注释,也可以通过使用 end note 来添加多行注释。
Alice->Bob : hello
note left: this is a first note
Bob->Alice : ok
note right#aqua: this is another note
Bob->Bob : I am thinking
note left
a note
can also be defined
on several lines
end note
此外,我们还可以使用 note left of,note right of 或 note over 在节点 (participant) 的相对位置放置注释,还可以通过修改背景色来高亮显示注释。
participant Alice
participant Bob
note left of Alice #aqua
This is displayed
left of Alice.
end note
note right of Alice: This is displayed right of Alice.
note over Alice: This is displayed over Alice.
note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.
note over Bob, Alice
This is yet another
example of
a long note.
end note
此外,还可以使用 hnote 和 rnote 这两个关键字来修改备注框的形状:
- hnote 代表六边形(hexagonal)的备注框;
- rnote 代表正方形(rectangle)的备注框。
示例代码:
caller -> server : conReq
hnote over caller : 空闲
caller <- server : conConf
rnote over server
"r"是正方形
"h"是六边形
endrnote
note over server
多
行
文本
end note
hnote over caller
多
行
文本
endhnote
此外,我们再增加备注消息注释时,还可以直接作用在全部的参与者上,示例如下:
Alice->Bob:m1
Bob->Charlie:m2
note over Alice, Charlie: 创建跨越所有参与者的备注的旧方法:\n ""note over //FirstPart, LastPart//"".
note across: 新方法:\n""note across""
Bob->Alice
hnote across: 跨越所有参与者的备注。
需要注意的是,在 UML 时序图中添加多个注释时,注释之间默认不是对齐的。
当然,我们可以通过 / 来在同一级对齐多个备注:
note over Alice : Alice的初始状态
/ note over Bob : Bob的初始状态
Bob -> Alice : hello
Creole 和 HTML 格式
在 UML 图中,我们可以使用 Creole 格式:
participant Alice
participant "The **Famous** Bob" as Bob
Alice -> Bob : hello --there--
... Some ~~long delay~~ ...
Bob -> Alice : ok
note left
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked--
This is __underlined__
This is ~~waved~~
end note
Alice -> Bob : A //well formatted// message
note right of Alice
This is <back:cadetblue><size:18>displayed</size></back>
__left of__ Alice.
end note
note left of Bob
<u:red>This</u> is <color #118888>displayed</color>
**<color purple>left of</color> <s:red>Alice</strike> Bob**.
end note
note over Alice, Bob
<w:#FF33FF>This is hosted</w> by sourceforge.jpg
end note
分隔符
在 UML 图中,可以通过 == 关键词来将时序图分割成为多个逻辑步骤:
== 初始化 ==
Alice -> Bob: 认证请求
Bob --> Alice: 认证响应
== 重复 ==
Alice -> Bob: 认证请求
Alice <-- Bob: 认证响应
引用
可以在图中通过使用 ref over 关键词来实现引用:
participant Alice
actor Bob
ref over Alice, Bob : init
Alice -> Bob : hello
ref over Bob
This can be on
several lines
end ref
延迟
在 UML 时序图中可以使用… 来表示延迟,并且还可以给延迟添加注释。
Alice -> Bob: 认证请求
...
Bob --> Alice: 认证响应
...5分钟后...
Bob --> Alice: 再见!
空间控制
在 UML 时序图中,我们可以通过 ||| 来增加调用链之间的空间,还可以使用数字指定增加空白空间的大小。
Alice -> Bob: message 1
Bob --> Alice: ok
|||
Alice -> Bob: message 2
Bob --> Alice: ok
||100||
Alice -> Bob: message 3
Bob --> Alice: ok
生命周期控制
关键字 activate 和 deactivate 用来表示参与者的生命周期。一旦参与者被激活,它的生命线就会显示出来。同时,destroy 表示一个参与者的生命线的终结。
participant User
User -> A: DoWork
activate A
A -> B: << createRequest >>
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: RequestCreated
deactivate B
A -> User: Done
deactivate A
此外,还可以使用嵌套的生命线,并且运行给生命线添加颜色。
participant User
User -> A: DoWork
activate A #FFBBBB
A -> A: Internal call
activate A #DarkSalmon
A -> B: << createRequest >>
activate B
B --> A: RequestCreated
deactivate B
deactivate A
A -> User: Done
deactivate A
此外,也可以使用自动激活关键字(autoactivate),这需要与 return 关键字配合:
autoactivate on
alice -> bob : hello
bob -> bob : self call
bill -> bob #005500 : hello from thread 2
bob -> george ** : create
return done in thread 2
return rc
bob -> george !! : delete
return success
其中,新命令 return 可以用于生成一个带有本文标签的返回信息,返回的点是当前最近的生命周期线。
创建参与者
我们可以把关键词 create 放在第一次接收消息之前,来强调本次消息实际上是在创建新的对象。
Bob -> Alice : hello
create Other
Alice -> Other : new
create control String
Alice -> String
note right : You can also put notes!
Alice --> Bob : ok
激活、撤销和创建的快捷语法
在指定目标参与者之后,可以使用如下语法:
- ++ 激活目标(可选择在后面增加 #color)
- — 撤销激活源
- ** 创建目标实例
- !! 摧毁目标实例
alice -> bob ++ : hello
bob -> bob ++ : self call
bob -> bib ++ #005500 : hello
bob -> george ** : create
return done
return rc
bob -> george !! : delete
return success
此外,我们还可以在同一行同时进行激活和撤销:
alice -> bob ++ : hello1
bob -> charlie --++ : hello2
charlie --> alice -- : ok
进入和发出消息
如果只想关注部分图示,你可以使用进入和发出箭头。
使用方括号 [和] 表示图示的左、右两侧。[-> A: DoWork
activate A
A -> A: Internal call
activate A
A ->] : << createRequest >>
A<--] : RequestCreated
deactivate A
[<- A: Done
deactivate A
锚定和持续时间
使用 teoz 可以在 UML 图表中添加锚定,从而指定持续时间。!pragma teoz true
{start} Alice -> Bob : start doing things during duration
Bob -> Max : something
Max -> Bob : something else
{end} Bob -> Alice : finish
{start} <-> {end} : some time
包裹参与者
在 UML 流程图中,可以使用 box 和 end box 画一个框将相关的参与者包裹起来,此外,还可以针对 box 添加标题以及背景颜色。box "Internal Service" #LightBlue
participant Bob
participant Alice
end box
participant Other
Bob -> Alice : hello
Alice -> Other : hello
移除参与者下方显示
在 UML 图中,我们可以使用 hide footbox 关键词移除参与者在底部显示对应的信息:hide footbox
box "Internal Service" #LightBlue
participant Bob
participant Alice
end box
participant Other
Bob -> Alice : hello
Alice -> Other : hello
外观参数
在 UML 图中,可以使用 skinparam 改变字体和颜色,示例如下:skinparam sequenceArrowThickness 2
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequence {
ArrowColor DeepSkyBlue
ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF
ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor DodgerBlue
ParticipantFontName Impact
ParticipantFontSize 17
ParticipantFontColor #A9DCDF
Participant underline
ActorBackgroundColor aqua
ActorFontColor DeepSkyBlue
ActorFontSize 17
ActorFontName Aapex
}
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: Request Created
deactivate B
A --> User: Done
deactivate Askinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequenceParticipant underline
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: Request Created
deactivate B
A --> User: Done
deactivate A
完整示例
``` skinparam sequenceArrowThickness 2 skinparam backgroundColor #EEEBDE skinparam handwritten false skinparam roundcorner 20 skinparam maxmessagesize 60 skinparam sequence { ArrowColor DeepSkyBlue ActorBorderColor DeepSkyBlue LifeLineBorderColor blue LifeLineBackgroundColor #A9DCDF ParticipantBorderColor DeepSkyBlue ParticipantBackgroundColor DodgerBlue ParticipantFontName Impact ParticipantFontSize 17 ParticipantFontColor #A9DCDF Participant underline ActorBackgroundColor aqua ActorFontColor DeepSkyBlue ActorFontSize 17 ActorFontName Aapex }
actor 研发 as RD participant “使用入口” as Entry participant “接入层” as Web participant “底层测试能力服务\n用例执行平台” as Engine
== 测试能力选择 == RD -> Entry: 查询QA测试能力列表 activate Entry Entry -> Web: 查询QA测试能力列表 activate Web return 测试能力列表 return 测试能力列表
RD -> RD: 选择对应测试能力
RD -> Entry: 查询测试能力参数可选项 activate Entry Entry -> Web: 查询测试能力参数可选项 activate Web Web -> Engine: 查询测试能力参数可选项 activate Engine return 参数可选项 return 参数可选项 return 参数可选项
RD -> RD: 填写对应的测试任务执行参数
== 测试能力执行 == RD -> Entry: 发起测试任务 activate Entry Entry -> Web —: 发起测试任务 activate Web
group 执行测试任务 loop Web -> Engine: 发起任务并训轮查询测试任务结果 activate Engine return 任务结果
Web -> Engine: 发起任务并训轮查询测试任务结果
activate Engine
return 任务结果
end
end deactivate Web
RD -> Entry: 查询测试任务结果 activate Entry Entry -> Web: 查询测试任务结果 activate Web return 测试任务结果及详情链接 return 测试任务结果及详情链接
RD -> Engine: 查询测试过程详情日志与部分报告等
return
```