GIHOZで状態遷移テスト

# はじめに
GIHOZを用いて状態遷移テストを実践していきます.

# 状態遷移テスト
状態遷移テストとは,**「状態遷移図を用いたテスト」や「状態遷移表を用いたテスト」の総称**です.

状態遷移テストでは,**ソフトウェアの動作中の状態**に着目します.

## 状態遷移図のメリット
状態遷移図を作成すると,**状態遷移の流れが容易に把握**できます.

また,図示することで**状態遷移に関する仕様の不備**に気づくこともあります.
![スクリーンショット 2024-12-17 131455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/82dfc879-3fdd-eeb2-8f09-8fe0811244d9.png)

# 状態遷移表のメリット
状態遷移表を作成すると,すべての状態をすべてのイベントの組み合わせを一覧表示できるので,使用があいまいな箇所を特定できます.

これにより,欠陥を発見する可能性を高めることができます.

# 状態遷移テストの例
次のコピー機の仕様に対して状態遷移テストを考えます.
- 電源を入れると停止中になり,いつでもコピーできる状態になる
- 停止中に設定ボタンを押すと設定中になり,コピー枚数やコピー倍率などを指定可能
設定を終え,コピーボタンを押すとコピーが始まりコピー中になる
- 毎度設定をしなくても停止中にコピーボタンを押すと標準設定(コピー枚数:1枚,コピー倍率:等倍)でのコピーが始まりコピー中となる
- コピー終了を検知すると停止中になる
- コピー中に停止ボタンを押すとコピーが中断され停止中になる
用紙トレイのセンサーが用紙無しを検知しても停止中になる
- 停止中に用紙トレイを開けると用紙交換中になる
コピー中や設定中に用紙トレイを開ける場合も用紙交換中になる
- 用紙補充後,用紙トレイを占めると停止中になる

## 状態
状態の候補は以下があげられます.
- 停止中
- 設定中
- コピー中
- 用紙交換中

## イベント
イベントの候補は以下があげられます.
- 電源を入れる
- 設定ボタンを押す
- コピーボタンを押す
- コピー終了を検知
- 停止ボタンを押す
- 用紙無しを検知
- 用紙トレイを空ける
- 用紙トレイを閉める

## 状態遷移図の準備
GIHOZで状態遷移図に,状態を記入していきます.
状態遷移図において,状態の追加はダブルクリックで行えます.

#### 状態遷移図に状態を記入
![スクリーンショット 2024-12-18 012942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/0ef683be-90e1-3d30-d88d-93c49e586f4b.png)

## イベントの記入
仕様をもとにして,状態遷移図にイベントを記入していきます.
#### 状態遷移図にイベントを記入
![スクリーンショット 2024-12-18 014554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/33f9beda-6dd7-0128-8bb1-b55ac733713e.png)

## 状態遷移表とテストケースの生成
状態遷移図を作ったら,「状態遷移表とテストケースを更新」をクリックすることでそれらが生成されます.

また,テストケースを作成する場合には全遷移テストだけでなく,設定により途中に何個の状態を経由するか,というスイッチを設定することで0 ~ 3スイッチのテストケースが生成できます.

状態遷移図を作るだけで適切な状態遷移表とテストケースを得られました.

#### 状態遷移表
![スクリーンショット 2024-12-18 014726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/9c5e6e68-e330-3d32-d405-c0732630a727.png)

#### テストケース(全遷移)
![スクリーンショット 2024-12-18 014738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/22101886-5a3f-e0da-0ad9-98673f50e23d.png)

#### テストケース(0スイッチ)
![スクリーンショット 2024-12-18 015043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/562f0dd5-94e3-054a-443c-2f6ad8ac7870.png)


#### テストケース(1スイッチ)
![スクリーンショット 2024-12-18 015035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/6176cb2d-4a9f-7c67-f8f6-9b30dd8f412e.png)

## 状態遷移表の解釈
状態遷移図だけでは,「できないはずのこと」が本当に実行できないことを確認することができません．

「できないはずのこと」を網羅的に書き表すために状態遷移表は存在します.

また,基本的に状態遷移図と状態遷移表は相互に確認しながら,同時に生成を進めていくので,
GIHOZの状態遷移表にも状態とイベントは記入していきましょう.

#### 以下の状態遷移表にイベントを記入するようにする
![スクリーンショット 2024-12-18 013002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/420cb43e-64cc-2afe-36c1-015858eee69c.png)

![スクリーンショット 2024-12-18 012957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/8b95996c-7747-977b-cbda-20721656546d.png)


### 状態とイベントの状態遷移表
ここで,生成された状態とイベントの状態遷移表に注目してみます.

この状態遷移表は,状態とイベントの数に比例して表が大きくなってしまいますが,状態やイベントを漏れなく確認することができます.

仮に状態の抽出が不十分でも関係するイベントが抽出できていれば,状態の不足に気づくことができます.

#### 状態とイベントの状態遷移表
![スクリーンショット 2024-12-18 015637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/5aabaaf3-ad9d-be53-04ab-cfd8ea5f114f.png)

### 前状態と後状態の状態遷移表
さらに,生成された前状態と後状態の状態遷移表にも注目していきます.

この例では同じ状態→同じ状態になるような遷移はありませんが,場合によっては,何らかのイベントが起きて同じ状態に戻ることもあります.

このとき,「停止→停止となるようなイベントは本当にないのか」という思考を働かせる(**できないことの確認**)ことで,仕様書に対する訂正を行ったりすることができます.

ただし,最初に行う状態とイベントの抽出が不十分だと状態遷移に漏れが生じる場合があるので注意は必要です.

#### 前状態と後状態の状態遷移表
![スクリーンショット 2024-12-18 015640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/d09acc77-9d0c-5488-4b3c-bf90ddf86d37.png)

## 最後に
GIHOZで状態遷移テストをしてみましたが,状態遷移図を書くだけで状態遷移表も生成してくれたり,考えるべきテストケースも考えてくれるというのは非常に効率的であると感じました.

次回は,組み合わせテストを何らかのツールを用いてやってみたいと思います.

## 参考
[ソフトウェアテストの教科書](https://www.amazon.co.jp/%E3%80%90%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E3%80%91-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82-%E7%AC%AC2%E7%89%88-%E5%B8%83%E6%96%BD/dp/481560875X)