ChatGPT はソフトウェアテスターになれるのか？

この記事は [ソフトウェアテストの小ネタ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/software-testing-koneta) 15日目の記事です。

### 2023-03-27 追記
この記事は ChatGPT がリリースされてすぐに書いたものなので、うまく利用する手段が確立されていませんでした。
しかしながら、そこから4ヶ月ほどで爆発的に流行し、 ChatGPT にいい回答をさせるためのプロンプトエンジニアリングが浸透しました。
ChatGPT にテスト設計の手助けをしてもらう際も、「あなたはプロのテストエンジニアです。」のようにロールを決める工夫をすれば回答精度は向上すると思います。
ぜひ他の方の記事も参考にしながらAIを活用してみてください。

# はじめに

はじめまして、[@tomo_tk11](https://twitter.com/tomo_tk11) です。[ChatGPT](https://chat.openai.com/) が登場して世の中がざわつきましたね。私も色々と遊んでみました。

![fig_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/fb2fd984-3809-78fb-045d-8e337a8ceee5.png)
晩ご飯、決めてくれているようで決めてくれていないですね。結局副菜に迷います。
でも選択肢を出してくれるだけ｢何でも良い｣よりましかも？

# ChatGPTについて

> ChatGPTは、AIテクノロジーを利用した自然言語処理ツールであり、人間を相手にしているときと同じような会話を可能にするなどの機能を備えたチャットボットをユーザーに提供する。この言語モデルは、質問に答えたり、電子メールやエッセイ、コードの作成などのタスクを支援したりすることが可能だ。

[ZDNet Japan, 「ChatGPT」とはどんなものなのか--OpenAIの対話AIを知る](https://japan.zdnet.com/article/35197140/)

現在(2022-12)、ChatGPT は研究段階で無償公開されているので OpenAI アカウントを作成するだけで利用可能です。
詳しくは [OpenAI の Blog](https://openai.com/blog/chatgpt/) を参照してください。

# ChatGPT の可能性

## コーディングはしてくれる

![fig_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/dc2f3550-1957-31f7-762f-ea313c80f7e5.png)
若干冗長な感じもしますが、とりあえず 2 かどうかや 2 で割れるかを試したあとに本格的に素数かどうかを調べに行ってますね。 `range(3, math.floor(math.sqrt(n)) + 1, 2)` には計算を高速にするための以下の工夫がなされています。

> 与えられた整数$x$が素数かどうかは、「ある程度小さな」素数すべてによって割り切れるかどうかで判定できます。
>> $x$を2以上の整数とする。$\sqrt{x}$以下のすべての素数$p（p \leq \sqrt{x})$で割り切れないなら$x$は素数である。

[趣味の大学数学, 素数判定の試し割り法 エラトステネスの篩とは](https://math-fun.net/20210219/11020/)

> この素数判定は$O(\sqrt{N})$で計算可能です。
> ここで、高速化のポイントとして、偶数を約数に持つなら2で割り切れているはずなので、2以降は奇数のみを調べると良いそうです。

[@takayg1, Pythonでアルゴリズム（素数判定）](https://qiita.com/takayg1/items/3769ab4cc62a231f4259)

なお、厳密な素数判定アルゴリズムをお願いしない場合は計算量への配慮がなされていないコードが返ってきます。ちなみにここでは書きませんが、[エラトステネスの篩 (ふるい)](https://algo-method.com/descriptions/64) を使った素数判定関数も作ってくれました。

## ユニットテストもしてくれる？

![fig_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/70587067-88f6-e42e-59e7-f58eba5803df.png)
ちょっと…厳しい結果ですね。果てのない素数をどこまでテストするのでしょうか？

## テスト観点[^テスト観点]は出してくれる？
![fig_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/7f485bf6-1057-a536-b174-c6a2596afbc4.png)
上のテストコードと同じですね。これはテスト観点とは言えなさそう。

![fig_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/1df53225-e836-279a-fa03-0e03882fa830.png)
少し聞き方を工夫してみたところ、それっぽい返答になりました。境界値には気をつけろ、と言っているみたいですね。次は同値分割に絞って聞いてみましょう。

![fig_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/3056a31e-710c-f1d7-ff0c-c62a75b222a4.png)
`int` 以外を入力するとどうか？みたいな観点はユニットテストでは欲しいと思っていたので、なかなか良さそうな感じがします。

## システムテストレベルのテスト観点はどうか？

![fig_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/49105bb6-1c3d-e086-4c67-0d5508e56edc.png)
仕様[^プリコネ仕様] を具体的に伝えてみました。わりとそれっぽいが、4:59:59 でガチャを引くなどの時間の境界値の観点が抜けてそうな気がします。あとは引くボタンを連打してみるとか、そういうのでしょうか。基本的な観点は出してくれるようですが、これは別に AI を使わなくてもいいかなというレベル。

## 複雑な仕様のテスト観点出しを手伝ってもらうのはどうか？

複雑な仕様の代表、｢商業施設の駐車場の利用料金｣さんに出てきてもらおうと思ったんですが、複雑すぎて `network error` が多発したので諦めました。代わりに、[楽天カードのランクアップロジック](https://point.rakuten.co.jp/guidance/rankkeep/) を拝借します。

![fig_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/c42b689b-70b1-3d26-c746-70ec5eaa0762.png)
うーん…わかっているようでわかっていない感じがあります。解釈しやすいように聞き方も工夫したんですが、デシジョンテーブルっぽいけど違う表ができあがっていますね。もう少しシンプルな条件のものであればよいのかもしれません。

![fig_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78128/e8db4758-b084-5a3d-a0e3-08bf0bc94302.png)
知っているようで、知らない回答を得ることができました。回答によっては `true` or `false` (Y or N)で答えてくれるものもあったんですが、間違っている内容のものが多かったです。デシジョンテーブルとは何かを知りたい方は [秋山 浩一さんのnote](https://note.com/akiyama924/n/ndd7dcbb2cd5b) がめちゃくちゃ分かりやすいのでご参考にしてください。

# 総括

ChatGPT の登場には驚きましたが、登場時から言われている通り、回答を鵜呑みにしてはいけません。当然嘘も混じっているので、知識がある方の補助ツールとして利用すべきです。しかしながら、対話だけでここまで確からしい回答が返ってくることは素晴らしいと思います。AI によって誰かの仕事が無くなるとは思いませんが、**AI を上手に使わないと良い仕事ができなくなる時代** は迫ってきているかもしれません。今回は ChatGPT にテスト分析、テスト設計が可能かどうかを見てみましたが、汎用的に作られた AI にそれをお願いできるのはまだ先かなと思いました。ただ、ドメインに特化して学習させたモデルを用いれば、現時点でも高い精度でテスト観点を出せる可能性は残されている気はします。

結論として、現時点では ChatGPT はソフトウェアテスターにはなれなさそうです。知識のあるソフトウェアテスターの力にはギリギリなってくれるかも。しかし、遠くない将来 AI がテストをしてくれる時代が到来するかもしれません。テスト対象を熟知した AI と対話をしながらテストをする、そんな時代かもしれません。AI との対話式テスト手法、**ダイアログテスティング** や **ダイアログベースドテスティング** とでも呼称しましょうか。**Dialogue Driven Testing(DDT)** というのもありそうですね。

今後も夢のような技術がたくさん出てくると思いますが、私たちができることはいつだって、**人にしかできない仕事をやり続けること** かなと思いました。以上、ChatGPT のテストに関する小ネタでした。

# リファレンス
* ChatGPT
    * https://chat.openai.com/ 
* ChatGPT: Optimizing Language Models for Dialogue
    * https://openai.com/blog/chatgpt/
* ZDNet Japan, 「ChatGPT」とはどんなものなのか--OpenAIの対話AIを知る
    * https://japan.zdnet.com/article/35197140/
* 趣味の大学数学, 素数判定の試し割り法 エラトステネスの篩とは
    * https://math-fun.net/20210219/11020/
* @takayg1, Pythonでアルゴリズム（素数判定）
    * https://qiita.com/takayg1/items/3769ab4cc62a231f4259
* エラトステネスの篩 (ふるい) を徹底解説 〜 実装から計算量まで 〜
    * https://algo-method.com/descriptions/64
* プリンセスコネクト！Re:Dive (プリコネR) のノーマルガシャの仕様
    * https://dmg.priconne-redive.jp/help/
* 楽天カードのランクアップロジック
    * https://point.rakuten.co.jp/guidance/rankkeep/
* 秋山 浩一, 93号：デシジョンテーブル（前編）
    * https://note.com/akiyama924/n/ndd7dcbb2cd5b

[^テスト観点]: どうやらテスト観点という言葉は日本独特のものらしく、ChatGPT にはテスト設計やテスト分析という言葉で伝えた方が良いかもしれません。[ISTQB用語集](https://glossary.istqb.org/jp/search/) にもテスト観点という言葉は存在しません。
[^プリコネ仕様]: [プリンセスコネクト！Re:Dive (プリコネR) のノーマルガシャの仕様](https://dmg.priconne-redive.jp/help/) を拝借しました。