問題19
問題 #19
Section titled “問題 #19”保険会社の請求ライフサイクルを管理するシステムコンポーネントの状態ベーステストを設計します。以下の仕様が与えられています。
変数 x は請求のクローズ方法を保持し、acc(Accepted からクローズ)または act(Activated からクローズ)の値を取ります。

| ID | 遷移 | トリガー / アクション |
|---|---|---|
| T1 | Applied → Accepted | accept |
| T2 | Accepted → Activated | activate |
| T3 | Activated → Accepted | goBack |
| T4 | Activated → Closed | close / x := act |
| T5 | Accepted → Closed | close / x := acc |
| T6 | Closed → Accepted | goBack [x == acc] |
| T7 | Closed → Activated | goBack [x == act] |
| T8 | Closed → Archived | archive |
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種類が含まれます。
イベント [ガード条件] / アクション| 要素 | 記法 | 役割 |
|---|---|---|
| イベント | ラベルの主部(例:close、goBack) | 遷移を引き起こすきっかけ |
| ガード条件 | [...] で囲まれた条件式 | 遷移が実行される前提条件。偽のときは遷移しない |
| アクション | / の後に続く処理 | 遷移時に実行される処理(変数への代入など) |
この問題での具体例
Section titled “この問題での具体例”アクション:変数 x への代入(T4・T5)
Section titled “アクション:変数 x への代入(T4・T5)”| 遷移 | ラベル | 意味 |
|---|---|---|
| T4: Activated → Closed | close / x := act | close イベントで遷移。同時に変数 x に act を代入する |
| T5: Accepted → Closed | close / x := acc | close イベントで遷移。同時に変数 x に acc を代入する |
クローズ操作を行ったとき、「どのステートからクローズしたか」を変数 x に記録しておきます。
ガード条件:変数 x の値による分岐(T6・T7)
Section titled “ガード条件:変数 x の値による分岐(T6・T7)”| 遷移 | ラベル | 意味 |
|---|---|---|
| T6: Closed → Accepted | goBack [x == acc] | x が acc のときだけ Accepted に戻る |
| T7: Closed → Activated | goBack [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 に戻るこのように、ガード条件を含む遷移をテストする場合は、条件が真になるケース(遷移が発生する)と偽になるケース(遷移が発生しない)の両方が必要です。
1-スイッチ(N-スイッチ)とは
Section titled “1-スイッチ(N-スイッチ)とは”N-スイッチカバレッジは状態遷移テストのカバレッジ基準で、連続する N+1 本の遷移の列をすべてテストすることを求めます。
| N | 別名 | 対象 |
|---|---|---|
| 0 | 遷移カバレッジ | すべての遷移を1回実行 |
| 1 | 1-スイッチカバレッジ | 連続する2本の遷移の組み合わせをすべて実行 |
| 2 | 2-スイッチカバレッジ | 連続する3本の遷移の組み合わせをすべて実行 |
1-スイッチ = 遷移 Tᵢ の直後に遷移 Tⱼ が続くペア(Tᵢ → Tⱼ)。ある遷移の終点ステートから出発できる遷移との組み合わせが1-スイッチになります。
全1-スイッチの列挙
Section titled “全1-スイッチの列挙”各遷移の終点ステートから続けられる遷移を求めます。
Archived は終端ステート(Archived からの遷移なし)なので、T8 の後に続く遷移はありません。
T1(Applied → Accepted)
Section titled “T1(Applied → Accepted)”Accepted を起点にできる遷移:T2、T5
| 1-スイッチ | 経路 |
|---|---|
| T1 → T2 | Applied→Accepted→Activated |
| T1 → T5 | Applied→Accepted→Closed |
小計:2
T2(Accepted → Activated)
Section titled “T2(Accepted → Activated)”Activated を起点にできる遷移:T3、T4
| 1-スイッチ | 経路 |
|---|---|
| T2 → T3 | Accepted→Activated→Accepted |
| T2 → T4 | Accepted→Activated→Closed |
小計:2
T3(Activated → Accepted)
Section titled “T3(Activated → Accepted)”Accepted を起点にできる遷移:T2、T5
| 1-スイッチ | 経路 |
|---|---|
| T3 → T2 | Activated→Accepted→Activated |
| T3 → T5 | Activated→Accepted→Closed |
小計:2
T4(Activated → Closed)
Section titled “T4(Activated → Closed)”T4 は遷移時に x := act をセットします。Closed を起点にできる遷移は T6・T7・T8 ですが、T6 のガード条件 [x == acc] は x = act のため偽となり、T4 の直後に T6 は実行できません。
| 1-スイッチ | 経路 | 実行可否 |
|---|---|---|
| ✗(x=act, ガード偽) | ||
| T4 → T7 | Activated→Closed→Activated | ✓ |
| T4 → T8 | Activated→Closed→Archived | ✓ |
小計:2
T5(Accepted → Closed)
Section titled “T5(Accepted → Closed)”T5 は遷移時に x := acc をセットします。Closed を起点にできる遷移は T6・T7・T8 ですが、T7 のガード条件 [x == act] は x = acc のため偽となり、T5 の直後に T7 は実行できません。
| 1-スイッチ | 経路 | 実行可否 |
|---|---|---|
| T5 → T6 | Accepted→Closed→Accepted | ✓ |
| ✗(x=acc, ガード偽) | ||
| T5 → T8 | Accepted→Closed→Archived | ✓ |
小計:2
T6(Closed → Accepted)
Section titled “T6(Closed → Accepted)”Accepted を起点にできる遷移:T2、T5
| 1-スイッチ | 経路 |
|---|---|
| T6 → T2 | Closed→Accepted→Activated |
| T6 → T5 | Closed→Accepted→Closed |
小計:2
T7(Closed → Activated)
Section titled “T7(Closed → Activated)”Activated を起点にできる遷移:T3、T4
| 1-スイッチ | 経路 |
|---|---|
| T7 → T3 | Closed→Activated→Accepted |
| T7 → T4 | Closed→Activated→Closed |
小計:2
T8(Closed → Archived)
Section titled “T8(Closed → Archived)”Archived は終端ステート → 続く遷移なし
小計:0
| 遷移 | 実行可能な後続遷移 | 小計 |
|---|---|---|
| T1 | T2、T5 | 2 |
| T2 | T3、T4 | 2 |
| T3 | T2、T5 | 2 |
| T4 | 2 | |
| T5 | T6、 | 2 |
| T6 | T2、T5 | 2 |
| T7 | T3、T4 | 2 |
| T8 | なし(終端) | 0 |
| 合計 | 14 |
b) 14
ガード条件による実行不可能な1スイッチ
Section titled “ガード条件による実行不可能な1スイッチ”構造上は有効なペアでも、アクションがセットした変数値がガード条件を必ず偽にする場合は実行不可能な1スイッチになります。
| 実行不可能なペア | 理由 |
|---|---|
| T4 → T6 | T4 が x := act をセット → T6 の [x == acc] が常に偽 |
| T5 → T7 | T5 が x := acc をセット → T7 の [x == act] が常に偽 |
単純に「終点ステートの出次数の合計 = 16」とするだけでは、このようなデータフロー依存の実行不可能パスを見落とします。
終端ステートに着目する
Section titled “終端ステートに着目する”Archived のような終端ステートからの遷移は存在しないため、T8 の1-スイッチは 0 です。終端ステートへの遷移は1-スイッチカバレッジを「打ち切る」点を見落とさないようにします。
実行可能な1スイッチの一覧
Section titled “実行可能な1スイッチの一覧”| # | 1-スイッチ | 経路 |
|---|---|---|
| 1 | T1 → T2 | Applied→Accepted→Activated |
| 2 | T1 → T5 | Applied→Accepted→Closed |
| 3 | T2 → T3 | Accepted→Activated→Accepted |
| 4 | T2 → T4 | Accepted→Activated→Closed |
| 5 | T3 → T2 | Activated→Accepted→Activated |
| 6 | T3 → T5 | Activated→Accepted→Closed |
| 7 | T4 → T7 | Activated→Closed→Activated |
| 8 | T4 → T8 | Activated→Closed→Archived |
| 9 | T5 → T6 | Accepted→Closed→Accepted |
| 10 | T5 → T8 | Accepted→Closed→Archived |
| 11 | T6 → T2 | Closed→Accepted→Activated |
| 12 | T6 → T5 | Closed→Accepted→Closed |
| 13 | T7 → T3 | Closed→Activated→Accepted |
| 14 | T7 → T4 | Closed→Activated→Closed |