状態遷移テスト(state transition testing)について
状態遷移テストとは
状態遷移テストとは
状態遷移テストとは、イベントの発生によって設計通りにソフトウェアの状態が遷移することを確認するテスト技法です。
仕様書から状態遷移モデル(状態遷移図や状態遷移表など)を作成して、そのモデルを網羅する遷移パスをテストケースとして作成していきます。
状態遷移テストは、ブラックボックステスト技法のひとつです。
この技法は、実行時の状態や過去の履歴によって、同じ入力データを用いても異なる振る舞いをするシステムに対して、適したテストを設計することができます。
状態遷移テストは、有限状態テスト(finite state testing)と呼ばれることもあります。
状態遷移図とは
状態遷移図とは、オブジェクトの状態や状態の遷移について表現する図です。
UMLにおけるステートマシン図(State machine diagram)として広く利用されています。
例えば、音楽プレーヤーの操作を状態遷移図で表すと以下の図で表現できます。
状態遷移表とは
状態遷移表とは、イベントと状態の組み合わせを表形式に記したものです。
ある状態でイベントが発生した時に、どの状態に遷移するかを表現しています。
上記の状態遷移図を例とすると、音楽プレーヤーの状態遷移は以下の表で表現できます。
状態/イベント | 再生ボタン押下 | 一時停止ボタン押下 | 停止ボタン押下 |
---|---|---|---|
停止中 | 再生中 | - | - |
再生中 | - | 一時停止中 | 停止中 |
一時停止中 | 再生中 | - | 停止中 |
状態遷移テストのカバレッジ
テストのカバレッジ(Coverage)とは
テストのカバレッジとは、テストがカバーしている割合=網羅率のことで、テストを実行する範囲を意味します。
状態遷移テストにおいてのカバレッジは、一般的にはNスイッチカバレッジという考え方でテストケースを作成していきます。
Nスイッチカバレッジ(N-switch coverage)とは
まず、スイッチとは「事前状態と事後状態の間にある状態」を意味します。
例えば、「状態A→状態B」に遷移する経路は、間にある状態が0個なので、「0スイッチ」といいます。
「状態A→状態B→状態C」に遷移する経路は、間にある状態が1個なので、「1スイッチ」といいます。
N個分のスイッチがあることを「Nスイッチ」といいます。
次に、スイッチカバレッジとは、状態遷移モデルの中から「事前状態」と「事後状態」、そして状態遷移させる「トリガー(イベント)」を抜き出してみたときに、少なくとも1回は全ての状態に遷移しているかどうかで測るカバレッジ基準のことです。
つまり、Nスイッチカバレッジとは、ある状態遷移が"N個先の状態遷移に影響を及ぼすか"を確認する方法のことを指します。
状態遷移テストにおいては、「0スイッチカバレッジ」と「1スイッチカバレッジ」の基準が一般的です。
0スイッチカバレッジ(リンク網羅)
0スイッチカバレッジとは、1回のイベントで遷移する経路を全て網羅するカバレッジのことです。
1つの状態遷移(間の状態が無い=0スイッチ)を網羅するので、事前状態Aからイベントが起きると事後状態Bになる、という形で表していきます。
0スイッチカバレッジは、仕様通りに実装できているか確認することができるテストです。
しかし、込み入った手順で想定外の欠陥を見つけるようなテストまでカバーできない点に注意が必要です。
上記音楽プレーヤーの状態遷移図を例とすると、0スイッチカバレッジは以下の通りです。
# | 事前状態 | イベント | 事後状態 |
---|---|---|---|
1 | 停止中 | 再生ボタン押下 | 再生中 |
2 | 停止中 | 一時停止ボタン押下 | N/A |
3 | 停止中 | 停止ボタン押下 | N/A |
4 | 再生中 | 停止ボタン押下 | 停止中 |
5 | 再生中 | 一時停止ボタン押下 | 一時停止中 |
6 | 再生中 | 停止ボタン押下 | 停止中 |
7 | 一時停止中 | 再生ボタン押下 | 再生中 |
8 | 一時停止中 | 一時停止ボタン押下 | N/A |
9 | 一時停止中 | 停止ボタン押下 | 停止中 |
1スイッチカバレッジ
1スイッチカバレッジとは、2回のイベントで遷移する経路をすべて網羅するカバレッジのことです。
つまり、2回のイベントで遷移する3つの状態を全て網羅するようにテストケースを作成します。
上記音楽プレーヤーの状態遷移図を例とすると、1スイッチカバレッジは以下の27通りのテストケースになります。
# | 事前状態 | イベント | 状態 | イベント | 事後状態 |
---|---|---|---|---|---|
1 | 停止中 | 再生ボタン押下 | 再生中 | 再生ボタン押下 | N/A(再生中) |
2 | 停止中 | 再生ボタン押下 | 再生中 | 一時停止ボタン押下 | 一時停止中 |
3 | 停止中 | 再生ボタン押下 | 再生中 | 停止ボタン押下 | 停止中 |
4 | 停止中 | 停止ボタン押下 | N/A | 再生ボタン押下 | 再生中 |
5 | 停止中 | 停止ボタン押下 | N/A | 一時停止ボタン押下 | N/A(停止中) |
6 | 停止中 | 停止ボタン押下 | N/A | 停止ボタン押下 | N/A(停止中) |
... | |||||
26 | 一時停止中 | 一時停止ボタン押下 | N/A | 一時停止ボタン押下 | N/A(一時停止中) |
27 | 一時停止中 | 一時停止ボタン押下 | N/A | 停止ボタン押下 | 停止中 |
2スイッチカバレッジ
2スイッチカバレッジとは、合計4つの状態を3回のイベントで遷移する経路をすべて網羅するカバレッジ基準となります。
テストケース数が膨大になるため、優先的に実施するテストを選択するなどの工夫が必要となります。
なお、2スイッチカバレッジよりも多くの遷移(例えば、3スイッチカバレッジや5スイッチカバレッジ)テストも作成可能です。
ただし、現実的な工数と見合わせて、重要な操作に限ったテストケースのみ実施するなどの工夫を行うと効率的であるといえます。
状態遷移テストの実施手順
1.状態遷移モデル
仕様書から状態遷移モデル(状態遷移図や状態遷移表など)を作成します。
2.テストケースの作成(Nスイッチカバレッジの決定)
Nスイッチカバレッジ(大抵0スイッチまたは1スイッチ)を決定して、状態遷移モデルを網羅する遷移パスのテストケースを作成します。
テストケースが膨大にならないように、優先度や影響度を考慮して、適切なテストケースを作成します。
3.テストの実施
テスト仕様書の通りにテストを実施します。
状態遷移テストの注意点
テスト作成に多大な労力が必要となる
状態遷移テストは、テストケースを作成するまでに多くの労力を必要とします。
状態遷移図や状態遷移表を作成する際にも、遷移漏れがないことを確認するエンジニアリングスキルを必要とします。
なので、テスト導入に際しては、費用対効果の面での十分な検討が必要となります。
状態の定義が必要となる
状態遷移テストは、状態の定義が曖昧だと、期待する効果が得られません。
イベント発生によってどのような状態にあるのか、イベントが発生した際にどのような状態に遷移するのか明確化できなければ適切なテストケースが作成できません。