Skip to content

問題19

保険会社の請求ライフサイクルを管理するシステムコンポーネントの状態ベーステストを設計します。以下の仕様が与えられています。

変数 x は請求のクローズ方法を保持し、acc(Accepted からクローズ)または act(Activated からクローズ)の値を取ります。

状態遷移図の画像

ID遷移トリガー / アクション
T1Applied → Acceptedaccept
T2Accepted → Activatedactivate
T3Activated → AcceptedgoBack
T4Activated → Closedclose / x := act
T5Accepted → Closedclose / x := acc
T6Closed → AcceptedgoBack [x == acc]
T7Closed → ActivatedgoBack [x == act]
T8Closed → Archivedarchive

T4 は Activated からクローズする際に x を act にセットし、T5 は Accepted からクローズする際に x を acc にセットします。T6/T7 はその x の値に基づいてどちらに戻るかをガード条件で決定します。

100% 1-スイッチカバレッジ を達成するために実行すべき1-スイッチは何通りか?

  • a) 16
  • b) 14
  • c) 8
  • d) 15

ガード条件とアクションの読み方

Section titled “ガード条件とアクションの読み方”

この問題の遷移ラベルには ガード条件アクション の2種類が含まれます。

イベント [ガード条件] / アクション
要素記法役割
イベントラベルの主部(例:closegoBack遷移を引き起こすきっかけ
ガード条件[...] で囲まれた条件式遷移が実行される前提条件。偽のときは遷移しない
アクション/ の後に続く処理遷移時に実行される処理(変数への代入など)

アクション:変数 x への代入(T4・T5)

Section titled “アクション:変数 x への代入(T4・T5)”
遷移ラベル意味
T4: Activated → Closedclose / x := actclose イベントで遷移。同時に変数 x に act を代入する
T5: Accepted → Closedclose / x := accclose イベントで遷移。同時に変数 x に acc を代入する

クローズ操作を行ったとき、「どのステートからクローズしたか」を変数 x に記録しておきます。

ガード条件:変数 x の値による分岐(T6・T7)

Section titled “ガード条件:変数 x の値による分岐(T6・T7)”
遷移ラベル意味
T6: Closed → AcceptedgoBack [x == acc]x が acc のときだけ Accepted に戻る
T7: Closed → ActivatedgoBack [x == act]x が act のときだけ Activated に戻る

goBack イベントが発生しても、ガード条件が偽のときは遷移しません。同じ goBack イベントで T6・T7 のどちらが発火するかは、変数 x の値によって決まります。

アクションとガード条件の連携

Section titled “アクションとガード条件の連携”

T4/T5 のアクション(x への代入)と T6/T7 のガード条件(x の値チェック)が対になっています。

Accepted ──T5: close / x := acc──→ Closed
goBack イベント発生 │
x == acc? → T6: Closed → Accepted に戻る
x == act? → T7: Closed → Activated に戻る
Activated ──T4: close / x := act──→ Closed
goBack イベント発生 │
x == act? → T7: Closed → Activated に戻る
x == acc? → T6: Closed → Accepted に戻る

このように、ガード条件を含む遷移をテストする場合は、条件が真になるケース(遷移が発生する)と偽になるケース(遷移が発生しない)の両方が必要です。


N-スイッチカバレッジは状態遷移テストのカバレッジ基準で、連続する N+1 本の遷移の列をすべてテストすることを求めます。

N別名対象
0遷移カバレッジすべての遷移を1回実行
11-スイッチカバレッジ連続する2本の遷移の組み合わせをすべて実行
22-スイッチカバレッジ連続する3本の遷移の組み合わせをすべて実行

1-スイッチ = 遷移 Tᵢ の直後に遷移 Tⱼ が続くペア(Tᵢ → Tⱼ)。ある遷移の終点ステートから出発できる遷移との組み合わせが1-スイッチになります。

各遷移の終点ステートから続けられる遷移を求めます。

Archived は終端ステート(Archived からの遷移なし)なので、T8 の後に続く遷移はありません。

Accepted を起点にできる遷移:T2、T5

1-スイッチ経路
T1 → T2Applied→Accepted→Activated
T1 → T5Applied→Accepted→Closed

小計:2

Activated を起点にできる遷移:T3、T4

1-スイッチ経路
T2 → T3Accepted→Activated→Accepted
T2 → T4Accepted→Activated→Closed

小計:2

Accepted を起点にできる遷移:T2、T5

1-スイッチ経路
T3 → T2Activated→Accepted→Activated
T3 → T5Activated→Accepted→Closed

小計:2

T4 は遷移時に x := act をセットします。Closed を起点にできる遷移は T6・T7・T8 ですが、T6 のガード条件 [x == acc] は x = act のため偽となり、T4 の直後に T6 は実行できません。

1-スイッチ経路実行可否
T4 → T6Activated→Closed→Accepted✗(x=act, ガード偽)
T4 → T7Activated→Closed→Activated
T4 → T8Activated→Closed→Archived

小計:2

T5 は遷移時に x := acc をセットします。Closed を起点にできる遷移は T6・T7・T8 ですが、T7 のガード条件 [x == act] は x = acc のため偽となり、T5 の直後に T7 は実行できません。

1-スイッチ経路実行可否
T5 → T6Accepted→Closed→Accepted
T5 → T7Accepted→Closed→Activated✗(x=acc, ガード偽)
T5 → T8Accepted→Closed→Archived

小計:2

Accepted を起点にできる遷移:T2、T5

1-スイッチ経路
T6 → T2Closed→Accepted→Activated
T6 → T5Closed→Accepted→Closed

小計:2

Activated を起点にできる遷移:T3、T4

1-スイッチ経路
T7 → T3Closed→Activated→Accepted
T7 → T4Closed→Activated→Closed

小計:2

Archived は終端ステート → 続く遷移なし

小計:0

遷移実行可能な後続遷移小計
T1T2、T52
T2T3、T42
T3T2、T52
T4T6、T7、T8(T6はガード偽)2
T5T6、T7、T8(T7はガード偽)2
T6T2、T52
T7T3、T42
T8なし(終端)0
合計14

b) 14


ガード条件による実行不可能な1スイッチ

Section titled “ガード条件による実行不可能な1スイッチ”

構造上は有効なペアでも、アクションがセットした変数値がガード条件を必ず偽にする場合は実行不可能な1スイッチになります。

実行不可能なペア理由
T4 → T6T4 が x := act をセット → T6 の [x == acc] が常に偽
T5 → T7T5 が x := acc をセット → T7 の [x == act] が常に偽

単純に「終点ステートの出次数の合計 = 16」とするだけでは、このようなデータフロー依存の実行不可能パスを見落とします。

Archived のような終端ステートからの遷移は存在しないため、T8 の1-スイッチは 0 です。終端ステートへの遷移は1-スイッチカバレッジを「打ち切る」点を見落とさないようにします。

#1-スイッチ経路
1T1 → T2Applied→Accepted→Activated
2T1 → T5Applied→Accepted→Closed
3T2 → T3Accepted→Activated→Accepted
4T2 → T4Accepted→Activated→Closed
5T3 → T2Activated→Accepted→Activated
6T3 → T5Activated→Accepted→Closed
7T4 → T7Activated→Closed→Activated
8T4 → T8Activated→Closed→Archived
9T5 → T6Accepted→Closed→Accepted
10T5 → T8Accepted→Closed→Archived
11T6 → T2Closed→Accepted→Activated
12T6 → T5Closed→Accepted→Closed
13T7 → T3Closed→Activated→Accepted
14T7 → T4Closed→Activated→Closed