「状態遷移図の書き方」と「状態遷移表からのテスト抽出方法」

システムを理解する方法の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 発生できない

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

わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。