システムを理解する方法の1つに「状態遷移図の作成」があります。ここでは、「PlantUMLを利用した状態遷移図の書き方」と「状態遷移表からテストケースを抽出する方法」について解説します。「電話の状態」を例にして説明します。
状態とイベント
状態遷移とは?
状態遷移は 状態
と イベント
によって作られます。
- 状態
- 処理の状態
- 部位の状態
- 全体の状態
- イベント
- 状態遷移のきっかけとなるアクションや条件
例
電話で考えると以下のようになります。
全体の状態とイベント
- 状態
- 電源オフ
- 電源オン
- イベント
- 電源オフ
- 電源オン
電話機能の状態とイベント
- 状態
- 待機中
- 着信中
- 発信中
- 通話中
- イベント
- 着信
- 応答
- 発信
- 接続
- 切断
PlantUMLで状態遷移図を作成
文章による仕様だけだと理解しずらい場合、状態遷移図を書くことをお勧めします。
状態遷移図があると、仕様を直感的に理解しやすくすることができます。
状態を記述
PlantUMLで状態遷移図を作成していきます。まず、 状態
を記述します。
@startuml
state 電源オフ
state 電源オン {
state 待機中
state 着信中
state 通話中
state 発信中
}
@enduml
以下UMLが生成されます。
イベントと遷移を記述
次に開始状態
とイベント
と遷移先
を記述します。開始状態
を記述することで、 最初の状態
が何になるのか判断できます。
@startuml
state 電源オフ
state 電源オン {
state 待機中
state 着信中
state 通話中
state 発信中
[*] --> 待機中
待機中 --> 着信中 : 着信
着信中 --> 待機中 : 切断
着信中 --> 通話中 : 応答
待機中 --> 発信中 : 発信
発信中 --> 待機中 : 切断
発信中 --> 通話中 : 接続
通話中 --> 待機中 : 切断
}
[*] --> 電源オフ
電源オフ --> 電源オン : 電源オン
電源オン --> 電源オフ : 電源オフ
@enduml
上記のように記述すると、以下UMLが生成されます。
図から仕様不備がないか確認
状態遷移図を書き終わったら、以下のことを確認します。
- どこからも遷移されない状態がないか
- どこにも遷移しない状態がないか
- 複数の状態に遷移しているイベントはないか
この確認作業を通じて、仕様の不備を発見することができます。
状態遷移表を作成
以下のように、状態遷移図から状態遷移表を作成してみました。
(電話機能のみの状態遷移表となります。)
イベント | ||||||
---|---|---|---|---|---|---|
着信 | 応答 | 発信 | 接続 | 切断 | ||
現在の状態 | 待機中 | 着信中 | – | 発信中 | – | – |
着信中 | – | 通話中 | – | – | 待機中 | |
発信中 | – | – | – | 通話中 | 待機中 | |
通話中 | – | – | – | – | 待機中 |
縦軸に 現在の状態
、横軸に イベント
、各マス目に 遷移先の状態
を記述しています。
-
と記述された箇所は できないこと
を表しています。
状態遷移表を作成することにより、 できないこと
を判断することができます。
「できないこと」の仕様を深掘りする
できないことには、以下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 発生できない |
このように、状態遷移表を作成することで、網羅的にテストケースを抽出することができます。