状態遷移テスト
魔法を駆使して魔王を倒すぞ！

目次•••••

状態遷移テストの説明
状態遷移図と状態遷移表の例
状態遷移テストのポイント
状態遷移テストのカバレッジワーク

状態遷移テストとは・・・• 状態遷移テストは、状態遷移モデル（状態遷移図など）をもとにして、そのモデルを網羅する遷移パスをテストします。
• 網羅する対象のことをカバレッジアイテム（coverage item）といい、状態、遷移、Nスイッチなどがあります。
• 有効遷移パスだけではなく、各状態でイベントのガードが働いている無効遷移をテストすることもあります。
3

状態遷移テストとは・・・• 4.2. ブラックボックステスト技法– 4.2.4. 状態遷移テスト• 状態遷移図は、ソフトウェアの取り得る状態、ソフトウェ••

アが開始および終了する方法、ソフトウェアが状態間で遷移する方法を示す。
状態遷移表は、状態間の有効な遷移と無効だと思われる遷移のすべてと、イベント、ガード条件、有効な遷移の際のアクションを示す。
状態の典型的な順序をカバーする、すべての状態をテストする、すべての遷移をテストする、遷移を特定の順序でテストする、無効な遷移をテストする、といったテストケースの設計が考えられる。

※JSTQBテスト技術者資格制度 FLシラバスVer 2018.J02
http://jstqb.jp/syllabus.html

4状態遷移図と状態遷移表の例


システムの動作を表現する状態遷移図
例

A状態

Yイベント

B状態

Zイベント
Xイベント

C状態

Xイベント

状態と入力の関係を示し、不正な可能性のある遷移を明確にする状態遷移表
状態
例

イベント

A状態

B状態

C状態

Xイベント

N/A

C状態

A状態

Yイベント

B状態

N/A

N/A

Zイベント

C状態

N/A

N/A

「N/A」は起こりえない遷移(Not Applicable)を表しています。

5

状態遷移図と状態遷移表の例Ⅱ

ストップウォッチを例に状態遷移図を考えてみましょう。
計測準備中

スタートボタン

リセットボタン計測中

スタートボタンスタートボタン

一時停止中

状態遷移表
計測準備中

計測中

一時停止中

スタートボタン

計測中

一時停止中

計測中

リセットボタンーー

計測準備中

ーは同じ状態への遷移（自己遷移）を表します。
6

状態遷移テストのポイント• 状態遷移図– 状態に着目して、システム全体を俯瞰できるようになります。
– コードのロジックのインプットにもなります。

• 状態遷移表– 仕様のモレ、抜けを発見することができます。
• カバレッジ– Nスイッチカバレッジという考え方でテストケースを作っていくことができます（詳細は次ページ）。

7

状態遷移テストのカバレッジ• ノード網羅– 1つの状態のみを全て網羅する※イベントは問わない• 0スイッチカバレッジ（リンク網羅）– 1回のイベントで遷移する経路を全て網羅する• 1スイッチカバレッジ– 前状態から後状態までにスイッチが1つある（状態を１つ経由する）状態遷移を網羅する• 状態遷移テストの場合は、ノード網羅よりもNスイッチカバレッジテストが一般的

8状態遷移テストのテストケース• 0スイッチカバレッジの場合のテストケース– ストップウォッチの例の場合
••
•
••
•

計測準備中→計測中

計測準備中→計測準備中
計測中→一時停止中
計測中→計測中
一時停止中→計測中
一時停止中→計測準備中

遷移前の状態

イベント

期待結果

計測準備中

スタートボタン押下

計測中になること

計測準備中

リセットボタン押下

計測準備中になること

計測中

スタートボタン押下

一時停止中になること

計測中

リセットボタン押下

計測中になること

一時停止中

スタートボタン押下

計測中になること

一時停止中

リセットボタン押下

計測準備中になること

9状態遷移テストのテストケース• 1スイッチカバレッジの場合のテストケース– ストップウォッチの例の場合
••
•
•
•
•
•
•
•
•
•
•

計測準備中→計測中→一時停止中
計測準備中→計測中→計測中

計測準備中→計測準備中→計測中
計測準備中→計測準備中→計測準備中
計測中→一時停止中→計測中
計測中→一時停止中→計測準備中
計測中→計測中→一時停止中
計測中→計測中→計測中
一時停止中→計測中→一時停止中
一時停止中→計測中→計測中
一時停止中→計測準備中→計測中
一時停止中→計測準備中→計測準備中
10

状態遷移テストのテストケース• 1スイッチカバレッジの場合のテストケース
遷移前の状態

イベント

期待結果

計測準備中

スタート→スタート

一時停止中になること

計測準備中

スタート→リセット

計測中になること

計測準備中

リセット→スタート

計測中になること

計測準備中

リセット→リセット

計測準備中になること

計測中

スタート→スタート

計測中になること

計測中

スタート→リセット

計測準備中になること

計測中

リセット→スタート

一時停止中になること

計測中リセット→リセット

計測中になること

一時停止中スタート→スタート

一時停止中になること

一時停止中スタート→リセット

計測中になること

一時停止中

リセット→スタート

計測中になること

一時停止中

リセット→リセット

計測準備中になること11

Nスイッチカバレッジの選び方• 0スイッチカバレッジの方がテストケース数は少なくなりますが、1スイッチカバレッジのテストでしか発見できないバグもあります– 例：一度計測を開始すると、２回目以降計測準備中からスタートボタンで計測開始できない• まず0スイッチカバレッジのテストを実施し、その結果をもとに1スイッチカバレッジのテストを実施するか判断するとよいでしょう
12

状態遷移テスト

ワーク

魔法を駆使して魔王を倒すぞ！
13

ワークショップの説明• 勇者テス政宗は魔王を倒すために魔法をおぼえました。
• 魔法を駆使して魔王を倒せるよう、魔法の効果を研究します。
• チーム分けについて– 作成内容を共有できるようチーム分けをします（4人チーム）
14

勇者の魔法• 勇者テス政宗が魔法を使うと、魔王に以下の効果を与えます。
– ドクドクを唱えると、魔王は毒にかかった状態になります。
– ネムネムを唱えると、魔王は眠った状態になります。

15

魔王の魔法• 魔王が魔法を使うと、魔王に以下の効果を与えます。
– ゲドークを唱えると、毒の効果がなくなります。
– メガパチを唱えると、魔王が眠りから覚めます。

16

魔法の仕様（１/２）• 毒と眠りは同時にかかることはなく、あとからかけた魔法効果で上書きされます。
• 初期状態は通常状態です。
• 魔王は眠った状態でも魔法を使用できます。
• 毒状態の魔王にドクドクを唱えようとしても「すでに毒にかかっている！」と表示され、唱えることはできません。

17

魔法の仕様（２/２）• 眠り状態の魔王にネムネムを唱えようとしても「すでに眠っている！」と表示され、唱えることはできません。
• 魔王はゲドークを毒状態のときのみ、メガパチを眠り状態のときのみ使用します。
• 上記以外のイベントは起こりえない（状態遷移図・表ではN/Aとして扱う）ものとします。
18

ワークショップ1• お題の内容から、魔王の状態遷移図を描いてみましょう。
• 考える時間は10分です。

19ワークショップ1• どのような状態遷移図になったか、周りの人と確認してみましょう（5分）• 抜けている状態、イベントはありませんか？
• 自分の図と周りの人の図と、どちらが分かりやすいか確認してください。
20

ワークショップ2• 状態遷移図から、状態遷移表、0スイッチカバレッジを満たすテストケースを作成してみましょう。
• 終わった人は、1スイッチカバレッジのテストケース作成に挑戦してみましょう。
• 考える時間は25分です。
21ワークショップ2• どのような状態遷移表、テストケースになったか、周りの人と確認してみましょう（10分）• 抜けている状態、イベントはありませんか？
• 自分の表と周りの人の表と、どちらが分かりやすいか確認してください。
22

解答例（状態遷移図）• 3つの状態と、4つのイベントがあります。
• 状態間をイベントでつなげていくことで全体を図にすることができます。
•使用ツール例
PlantUML Previewer

PlantUML Previewer : http://sujoyu.github.io/plantuml-previewer/23解答例（状態遷移表）• 縦軸にイベント、横軸に状態をとっています。

ドクドクネムネム
ゲドーク
メガパチ

通常
毒眠り
N/A
N/A

毒N/A
眠り
通常
N/A

眠り
毒N/A
N/A
通常24

解答例（テストケース）• 状態遷移表をもとに、以下のテストケースを作成することができます。

No

遷移前の状態

イベント

期待結果

1

通常

ドクドクをとなえる毒状態になること2

通常

ネムネムをとなえる眠り状態になること3

毒ネムネムをとなえる眠り状態になること

4

毒ゲドークをとなえる通常状態になること

5

眠り

ドクドクをとなえる

毒状態になること

6

眠り

メガパチをとなえる

通常状態になること

25

解答例（1スイッチカバレッジ）• 縦軸に前状態、横軸に後状態をとっています。
通常

毒眠り

通常

ドクドク→ゲドーク
ネムネム→メガパチ

ネムネム→ドクドク

ドクドク→ネムネム

毒ネムネム→メガパチ

ネムネム→ドクドクゲドーク→ドクドクゲドーク→ネムネム

眠りドクドク→ゲドーク

メガパチ→ドクドク

ドクドク→ネムネム
メガパチ→ネムネム

26

解答例（1スイッチカバレッジ テストケース）• １スイッチカバレッジの表をもとに、以下のテストケースを作成することができます。

No

遷移前の状態

イベント期待結果

1

通常

ドクドク→ゲドーク

通常状態へ遷移する

2

通常

ネムネム→メガパチ

通常状態へ遷移する

3

通常

ネムネム→ドクドク毒状態へ遷移する

4

通常

ドクドク→ネムネム

眠り状態へ遷移する

5

毒ネムネム→メガパチ

通常状態へ遷移する

6

毒ゲドーク→ドクドク

毒状態へ遷移する7

毒ネムネム→ドクドク毒状態へ遷移する

8

毒

ゲドーク→ネムネム

眠り状態へ遷移する

9

眠り

ドクドク→ゲドーク

通常状態へ遷移する

10

眠り

メガパチ→ドクドク

毒状態へ遷移する11

眠り

メガパチ→ネムネム

眠り状態へ遷移する

12

眠り

ドクドク→ネムネム

眠り状態へ遷移する
27