【PlantUML】状態遷移図を作ってみた

この記事は現役ウェブディベロッパーがわかりやすさにこだわって作成しました

この記事はこちらのサイトから引用させていただきました

設計 | PlantUMLによる状態遷移図の書き方, 状態遷移表からのテスト抽出方法 - わくわくBank
システムを理解する方法の1つに「状態遷移図の作成」があります。ここでは、「PlantUMLを利用した状態遷移図の書き方」と「状態遷移表からテストケースを抽出する方法」について解説します。「電話の状態」を例にして説明します。

システムを理解する方法の1つに「状態遷移図の作成」があります。ここでは、「PlantUMLを利用した状態遷移図の書き方」と「状態遷移表からテストケースを抽出する方法」について解説します。「電話の状態」を例にして説明します。

状態とイベント

状態遷移とは?

状態遷移は 状態イベント によって作られます。

  • 状態
    • 処理の状態
    • 部位の状態
    • 全体の状態
  • イベント
    • 状態遷移のきっかけとなるアクションや条件

電話で考えると以下のようになります。

全体の状態とイベント

  • 状態
    • 電源オフ
    • 電源オン
  • イベント
    • 電源オフ
    • 電源オン

電話機能の状態とイベント

  • 状態
    • 待機中
    • 着信中
    • 発信中
    • 通話中
  • イベント
    • 着信
    • 応答
    • 発信
    • 接続
    • 切断

PlantUMLで状態遷移図を作成

文章による仕様だけだと理解しずらい場合、状態遷移図を書くことをお勧めします。
状態遷移図があると、仕様を直感的に理解しやすくすることができます。

状態を記述

PlantUMLで状態遷移図を作成していきます。まず、 状態 を記述します。

@startuml
state 電源オフ
state 電源オン {
  state 待機中
  state 着信中
  state 通話中
  state 発信中
}
@enduml

以下UMLが生成されます。

design_state_plantuml_state_only.png

イベントと遷移を記述

次に 開始状態イベント遷移先 を記述します。
開始状態 を記述することで、 最初の状態 が何になるのか判断できます。

@startuml
state 電源オフ
state 電源オン {
  state 待機中
  state 着信中
  state 通話中
  state 発信中

  [*] --> 待機中
  待機中 --> 着信中 : 着信
  着信中 --> 待機中 : 切断
  着信中 --> 通話中 : 応答
  待機中 --> 発信中 : 発信
  発信中 --> 待機中 : 切断
  発信中 --> 通話中 : 接続
  通話中 --> 待機中 : 切断
}

[*] --> 電源オフ
電源オフ --> 電源オン : 電源オン
電源オン --> 電源オフ : 電源オフ
@enduml

上記のように記述すると、以下UMLが生成されます。

design_state_plantuml.png

図から仕様不備がないか確認

状態遷移図を書き終わったら、以下のことを確認します。

  • どこからも遷移されない状態がないか
  • どこにも遷移しない状態がないか
  • 複数の状態に遷移しているイベントはないか

状態遷移表を作成

以下のように、状態遷移図から状態遷移表を作成してみました。
(電話機能のみの状態遷移表となります。)

イベント
着信応答発信接続切断
現在の状態待機中着信中発信中
着信中通話中待機中
発信中通話中待機中
通話中待機中

縦軸に 現在の状態 、横軸に イベント 、各マス目に 遷移先の状態 を記述しています。

- と記述された箇所は できないこと を表しています。
状態遷移表を作成することにより、 できないこと を判断することができます。

「できないこと」の仕様を深掘りする

できないことには、以下2パターン存在します。

  • イベントが発生しても遷移しないように実装
    • e.g. 通話中に着信が発生しても、通話中のままであるように実装する
  • イベントを発生できないように実装
    • e.g. 通話中に発信できないように実装する

この違いを意識して、仕様の段階で どちらのパターンで実装するのか 決めておきます。

テストケースの抽出

状態遷移表から「できることのテスト」「できないことのテスト」を抽出します。
時間の制約から、全てのテストを確認できない場合、「できることのテスト」を優先して行います。

できることのテスト

No現在の状態イベントイベント発生後の状態
1待機中着信着信中
2着信中応答通話中
3待機中発信発信中
4発信中接続通話中
5着信中切断待機中
6発信中切断待機中
7通話中切断待機中

できないことのテスト

No現在の状態イベントイベント発生後の状態
8着信中着信状態遷移しない or 発生できない
9発信中着信状態遷移しない or 発生できない
10通話中着信状態遷移しない or 発生できない
11待機中応答状態遷移しない or 発生できない
12発信中応答状態遷移しない or 発生できない
13通話中応答状態遷移しない or 発生できない
14着信中発信状態遷移しない or 発生できない
15発信中発信状態遷移しない or 発生できない
16通話中発信状態遷移しない or 発生できない
17待機中接続状態遷移しない or 発生できない
18着信中接続状態遷移しない or 発生できない
19通話中接続状態遷移しない or 発生できない
20待機中切断状態遷移しない or 発生できない

このように、状態遷移表を作成することで、網羅的にテストケースを抽出することができます。

PHP/Javascript/WORDPRESS案件全般承ります

この記事についてのご質問またはお困りのことがございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました