ChatGPTにテスト設計のお手伝いをしてもらった

こちらの記事は「Medley（メドレー） Advent Calendar 2024」の17日目の記事です。

https://qiita.com/advent-calendar/2024/medley

## はじめに

こんにちは、QAエンジニアをしている田村です。
2024年の5月にメドレーへ入社し、ジョブメドレーアカデミーのプロダクトに所属しています。
私が参画する前のジョブメドレーアカデミーはQAエンジニアが不在でしたが、PMや開発エンジニアがテストを書いて自走できるプロダクトでした。
大きな不具合もなくリリースできていて素晴らしいことだなと感動しました。
とはいえ、QAエンジニア目線で見ると
　・テストケースの内容に個人差がある
　・後で見返した時にどんな目的で作成したテストケースなのかわかりにくい
などの課題が見えてきましたので、QAエンジニアとして1つ1つ解決してプロダクトの品質を上げていきたいと思っています。

その課題の1つと思っているのが、私が入社した時よりメンバーも増え、機能開発のスピードがグンと上がったことで、テストスピードも上げていかないとリリースが滞ってしまうことです。
新機能が並行して開発される中、QAエンジニアは1人ということで、テストプロセスの何かを効率化できないかと思い、ChatGPT(gpt-4o)にテスト設計のお手伝いをしてもらおうと、取り入れてみました。

この記事ではChatGPTを使ってテスト設定をしてみた話をさせていただこうと思います。
(ちなみに、メドレーでは生成AI利用のガイドラインが社内で展開されており、各部門の業務ではそのガイドラインに沿って利用をしています。)

## ChatGPTで最初に試したこと

ChatGPTを初めて使うにあたり、最初に思ったのは「なにができるんだろう？」「テストプロセスの何に活かせるだろう？」でした。
機密情報に気をつけながら、仕様や要件を具体的に記載する必要があるということから、適当な文字に置き換えをした因子と水準でペアワイズ法からテストケース作成をChatGPTにやってもらうのが良さそうかなと試してみました。

```
あなたはテストエンジニアです。
以下の因子と水準からペアワイズ法でテストケースを作成してください。

因子と水準
・因子A
　・因子Aの水準：A、B、C、D
・因子B
　・因子Bの水準：ON、OFF
・因子C
　・因子Cの水準：A、B、C
```

<!-- open属性なし -->
<details><summary>ChatGPTの結果</summary>

```
ペアワイズ法（Pairwise Testing）は、因子間のすべてのペアの組み合わせを網羅するテストケースを作成する有効な手法です。早速、指定された因子と水準をもとにペアワイズテストケースを作成しましょう。

因子と水準：
- 因子A: A, B, C, D
- 因子B: ON, OFF
- 因子C: A, B, C

テストケースを以下に示します：

| テストケース | 因子A | 因子B | 因子C |
|---------------|-------|-------|-------|
| 1             | A     | ON    | A     |
| 2             | A     | OFF   | B     |
| 3             | B     | ON    | C     |
| 4             | B     | OFF   | A     |
| 5             | C     | ON    | B     |
| 6             | C     | OFF   | C     |
| 7             | D     | ON    | A     |
| 8             | D     | OFF   | B     |

このペアワイズテストケースセットは、因子と水準の全てのペアを最低1回は網羅しています。このようにして、全てのペアの組み合わせを効率的にテストすることができます。
```

</details>

Pict Masterなどのツールを使うのとあまり変わらないような...箇条書きで簡単に書けるのは楽ですね。
これだとChatGPTの恩恵を受けている感じはなかったです。


## 検証に必要なテストデータをChatGPTに聞いてみる

ChatGPTを直行表やペアワイズ法で組み合わせを回答してくれるツールとして利用していたところ、ジョブメドレーアカデミーの機能開発でChatGPTを活用できそうな機会が訪れました。
ジョブメドレーアカデミーで新しく並び替え機能が開発されたので、機能が正しく動作しているかを確認するために、どんなテストデータが必要かをChatGPTで試してみました。

```
あなたはテストエンジニアです。
以下のテスト目的を達成するためのテストケースを作成してください。

テスト目的：並び替え機能が正しく動作し、要件と仕様に従っていることを確認する

要件：「フリガナ」を選択すると、一覧が名前のフリガナ順で並び変わること

仕様：
・フリガナは昇順で並ぶ
・同性同名のフリガナの場合は登録IDの昇順で並ぶ
```

<!-- open属性なし -->
<details><summary>ChatGPTの結果</summary>

```
並び替え機能のテスト目的を達成するために、以下の詳細なテストケースを作成します。

### テストケース1: 基本的なフリガナの昇順並び替えの確認

#### 目的：
「フリガナ」を選択したときに、リストがフリガナの昇順で並び変わることを確認する。

#### 前提条件：
1. データベースに以下のテストデータが登録されていること
    - {ID: 1, 名前: "田中 太郎", フリガナ: "タナカ タロウ"}
    - {ID: 2, 名前: "鈴木 次郎", フリガナ: "スズキ ジロウ"}
    - {ID: 3, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}

#### 手順：
1. 初期一覧を表示する。
2.「フリガナ」列のヘッダーをクリックして、フリガナでソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. 佐藤 花子
    2. 鈴木 次郎
    3. 田中 太郎

### テストケース2: 同姓同名のフリガナの場合の登録IDの昇順確認

#### 目的：
同じフリガナが複数存在する場合、登録IDの昇順で並び替えられることを確認する。

#### 前提条件：
1. データベースに以下のテストデータが登録されていること
    - {ID: 1, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}
    - {ID: 2, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}
    - {ID: 3, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}

#### 手順：
1. 初期一覧を表示する。
2.「フリガナ」列のヘッダーをクリックして、フリガナでソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. 登録ID: 1, 佐藤 花子 (ID: 1)
    2. 登録ID: 2, 佐藤 花子 (ID: 2)
    3. 登録ID: 3, 佐藤 花子 (ID: 3)

### テストケース3: 空のフリガナフィールドの扱い確認

#### 目的：
フリガナが空の場合の並び替え結果を確認する。

#### 前提条件：
1. データベースに以下のテストデータが登録されていること
    - {ID: 1, 名前: "田中 太郎", フリガナ: ""}
    - {ID: 2, 名前: "鈴木 次郎", フリガナ: ""}
    - {ID: 3, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}

#### 手順：
1. 初期一覧を表示する。
2.「フリガナ」列のヘッダーをクリックして、フリガナでソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. 佐藤 花子
    2. 鈴木 次郎
    3. 田中 太郎

### テストケース4: 逆ソート機能の確認（UIに逆ソート機能がある場合のみ）

#### 目的：
フリガナのソート順が逆転することを確認する。

#### 前提条件：
1. テストケース1と同じデータセットを使用する。

#### 手順：
1.「フリガナ」列のヘッダーをクリックして昇順でソートする。
2. もう一度「フリガナ」列のヘッダーをクリックして降順でソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. 田中 太郎
    2. 鈴木 次郎
    3. 佐藤 花子

### テストケース5: フリガナに特殊文字や記号が含まれている場合の確認

#### 目的：
フリガナに特殊文字や記号が含まれている場合のソート結果を確認する。

#### 前提条件：
1. データベースに以下のテストデータが登録されていること
    - {ID: 1, 名前: "田中 太郎", フリガナ: "タナカ-タロウ"}
    - {ID: 2, 名前: "鈴木 次郎", フリガナ: "スズキ*ジロウ"}
    - {ID: 3, 名前: "佐藤 花子", フリガナ: "サトウ ハナコ"}

#### 手順：
1. 初期一覧を表示する。
2.「フリガナ」列のヘッダーをクリックして、フリガナでソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. サトウ ハナコ
    2. スズキ*ジロウ
    3. タナカ-タロウ

これらのテストケースを実行することで、フリガナソート機能が要件と仕様に沿って正しく動作することを確認できます。
```

</details>

ChatGPT優秀じゃないですか？
手順や期待結果、具体的な入力すべきテストデータも提示してくれているので、実際の機能と照らし合わせて不要なものは削り、テストケースとして作成しました。

**<font color="Orange">
このテストケースだけでは、テスト観点として漏れがあるの気づきました？
</font>**


## 「フリガナ」という落とし穴
ChatGPTが回答してくれたテストケースには、「濁音」「半濁音」「拗音」などの日本語特有の特殊パターンが考慮されていないのです。

別の機能テストを行なっていた際に偶然作成していたデータが`ショウゴ` `ジュリアン`の順番に並んでいて、何か並びに違和感があると思ったことでした。
一般的なソートで確かめてみようということでGoogle スプレッドシートに入力して、いざ昇順ソート！をしてみたところ、なんと`ジュリアン` `ショウゴ`の順番に表示されました。

完全な見落としですね。
申し訳ない気持ちいっぱいで開発エンジニアの方へ修正していただきました。

改めてChatGPTに日本語特有の特殊パターンのテストケースを追加で聞いてみました。

```
濁音、半濁音、拗音を考慮したテストケースを追加してください
```
<!-- open属性なし -->
<details><summary>ChatGPTの結果</summary>

```
濁音、半濁音、小さい文字などを考慮したテストケースを追加することで、フリガナソート機能が日本語の特殊な文字の処理においても正しく動作するかどうかを確認できます。

### テストケース6: 濁音、半濁音を含むフリガナのソート確認

#### 目的：
濁音（”が”、”ざ”など）と半濁音（”ぱ”など）を含むフリガナが正しくソートされることを確認する。

#### 前提条件：
1. データベースに以下のテストデータが登録されていること
    - {ID: 1, 名前: "鈴木 次郎", フリガナ: "スズキ ジロウ"}
    - {ID: 2, 名前: "田中 太郎", フリガナ: "タナカ タロウ"}
    - {ID: 3, 名前: "佐藤 晴美", フリガナ: "サトウ ハルミ"}
    - {ID: 4, 名前: "木村 美穂", フリガナ: "キムラ ミホ"}
    - {ID: 5, 名前: "橋本 剛", フリガナ: "ハシモト ゴウ"}
    - {ID: 6, 名前: "中村 京子", フリガナ: "ナカムラ キョウコ"}

#### 手順：
1. 初期一覧を表示する。
2.「フリガナ」列のヘッダーをクリックして、フリガナでソートする。

#### 期待結果：
- 一覧が以下の順番で表示されること：
    1. キムラ ミホ (ID: 4)
    2. サトウ ハルミ (ID: 3)
    3. スズキ ジロウ (ID: 1)
    4. タナカ タロウ (ID: 2)
    5. ナカムラ キョウコ (ID: 6)
    6. ハシモト ゴウ (ID: 5)

### テストケース7: 拗音（小さい文字）を含むフリガナのソート確認

(以下省略)

```

</details>

これだと見落としのテストケースにはならないですね。難しい...
日本語特有の特殊パターンの知識がある「人」のレビューが大事になりますね。


## 終わりに
ChatGPTへの質問内容をどうするか考えるのは大変ですが、繰り返し試してみることでChatGPTに任せられることの判別がつけられるようになるかと思います。
そのためにも、今後もChatGPTを活用して、テストプロセスの効率化をすすめていきたいです。

ここまで読んでいただきありがとうございました。
ChatGPTにテスト設計をしてもらう際の参考に少しでもなれば幸いです。

明日は [@mthiroshi](https://qiita.com/mthiroshi) さんです！お楽しみに♪

***
メドレーでは多様なスペシャリストを探しています!

https://www.medley.jp/jobs/