結合テストケース自動組立ツール作ってみた【ディシジョンテーブル×シナリオ】

## はじめに
エアークローゼットでSRE兼QAEをしているCutです！

この記事は、[エアークローゼットアドベントカレンダー2024](https://qiita.com/advent-calendar/2024/air-closet)の7日目の記事です:christmas_tree:

https://qiita.com/advent-calendar/2024/air-closet

今回は、テストプロセスの効率化を目的に、結合テストケースを自動的に組み立てるツールを作成してみたのでご紹介します。

## 背景と課題
「[変更障害率を大幅改善する過程で、私たちがやったこと](https://qiita.com/Cut/items/dd3651864578659076b2#%E9%96%8B%E7%99%BA%E5%93%81%E8%B3%AA%E3%82%92%E6%94%B9%E5%96%84%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91)」でご紹介している通り、2023年時点でエアークローゼットの障害発生率は非常に高く、品質の改善が急務でした。

特に、主力事業の「[airCloset](https://www.air-closet.com)」では、約10年の歴史によって仕様が複雑化し、特にそれらの組み合わせはテストで拾いきれずバグに発展するケースが相次いでいました。

そこで、テストの標準化を図り、テストケースを書くまでの過程を標準化しました。具体的には、ディシジョンテーブルテストとシナリオテストを組み合わせて、パターンやシナリオの抜け漏れが起きにくいようにしました。

```markdown: 2023年の結合テストフロー
1. テストケースを作る
2. レビューする
```

```markdown:2024年の結合テストフロー
1. 条件表を作る
2. シナリオ表を作る
3. ディシジョンテーブルを作る
4. (上記をレビューする)
5. テストケースを作る
```

しかし、標準化したことで品質改善の手応えはあったものの、無視できないレベルの追加工数がかかるようになりました。これまで各メンバーの脳内で完結していたプロセスにアウトプットとレビューを要求したためです。特に、ディシジョンテーブルの作成には大きな時間がかかっていました。

これを解消し、最終的には標準化前の工数を維持したまま、結合テストの品質を大幅に改善することを狙いとしていました。

## 作ったもの
元々、結合テストの作成はGoogle Spread Sheet上でなされていたことから、Google App Scriptを組み合わせて作成プロセスの一部を自動化するシステムを作りました。

特に、先述のプロセスで時間がかかっていた `4.ディシジョンテーブルを作る` と `5.テストケースを作る` を自動化することにより、作成の大幅な効率化を狙いました。

### 条件表
![qiita_condition-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/9e35c72d-6329-cd45-fcb4-dee9e5b9559b.png)

### シナリオ表
![qiita_scenario-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/0eb1279d-9f5d-1b65-5672-8d6a544ed372.png)

### 中間表
![qiita_generation-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/eb48260b-a717-72b5-ba0a-2a0f9abc80d5.png)

### ディシジョンテーブル
![qiita_decision-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/50bd7a48-8698-0429-b640-ae1b3ffe4ccb.png)

### テストケース
![qiita_test-case.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/0717f033-136c-8896-a29f-6272a7ac39cc.png)



## 機能
### 1.ディシジョンテーブルの自動作成
条件表とシナリオをもとに、ディシジョンテーブルを作成する機能です。
* 単に条件表とシナリオをもとにディシジョンテーブルを作成すると膨大な行数が生成されてしまうため、途中に中間表を用意し、不要な生成を行わないようにする仕組みを整えました
* シナリオ上で、条件表の条件名を `${}` で囲んで使用すると、テストケースの自動組立(後述)時に値が自動的に埋め込まれます
* シナリオ上で、条件表にない名前を `${}` で囲んで使用すると、ディシジョンテーブルの自動作成時に列が作成され、任意の値を設定できます

![qiita_create_decision-table.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/9be47160-2953-a479-7f24-008367859953.gif)


### 2.テストケースの自動組立
シナリオとディシジョンテーブルをもとに、テストケースを組み立てる機能です。
* シナリオ上で `${}` で囲んだ要素を変数として使用できるようになっており、ディシジョンテーブル上で変数を埋めることで、テストケースへ反映できるようにしました

![qiita_create_test-case.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751808/23751512-8c94-f939-33cb-66196ba0d93a.gif)

## 結果
テストケースの作成効率は大幅に短縮され、工数は標準化前と同等、修正の工数も含めるとむしろ低いレベルに落ち着きました。
この仕組みも大きく寄与し、エアークローゼットの障害発生率は大幅に低下しました。この仕組み以外にも品質に寄与した取り組みを紹介しているので、[こちら](https://qiita.com/Cut/items/dd3651864578659076b2#%E9%96%8B%E7%99%BA%E5%93%81%E8%B3%AA%E3%82%92%E6%94%B9%E5%96%84%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91)の記事もぜひご覧ください。

## まとめ
最後までご覧いただきありがとうございました！

[エアークローゼット Advent Calendar 2024](https://qiita.com/advent-calendar/2024/air-closet)はまだまだ続きますので、ぜひ他のエンジニア、デザイナー、PMの記事もご覧いただければと思います

また、エアークローゼットはエンジニア採用活動も行っておりますので、興味のある方はぜひご覧ください！

https://corp.air-closet.com/recruiting/developers/