PythonのテストをChatGPTに書いてもらう
テストを書いてない
テスト書いてない。あってはならない気がしますが、実際ありますよね(ここだけの話)。
だって、テストって無くてもプログラム動きますからね。逆にテストだけあっても、プログラムは動きません。背に腹は代えられないってやつですね(駄目なやつです)。
といってもテストって書いたことないと、何をどう書いてよいかイマイチ分かりません。この記事は、そんな人(自分です)に、ChatGPTを使ってテストを書く第一歩を踏み出してみると良いかもという記事です。
最初に書いておきますが、この記事は決して「テストは人間が書く必要ない、これからはAIでテストを書く時代」ということを言いたい記事ではないです。怖い人に怒られそうなのもありますが、実際やってみると、結構AIでテストをいい感じに書いてもらうの、まだ難しかったです。
ChatGPTでテストを書く方法
ChatGPTでテストを書く方法ですが、その前にPythonでテストを書くライブラリを確認します。テストのためのライブラリは色々あるようですが、よく聞くのが「unittest」「pytest」です(他にも「nose」「doctest」もあるようですが割愛します)。
どれでもよいのですが、以下の書籍(テスト駆動Python)やSansanさんの研修資料などがpytestをすすめていてメジャーなようなのでpytestを使うことを前提とします。
テストを書く対象のコードは、自分が昔に作った色を抽出するだけのプログラムにしてみます。
ChatGPTのプロンプトは以下のような感じです。最後の「自分を信じて、限界を超えてください。」は修造メソッドと言われれている手法です。
あなたは優秀なテスターです。以下お願いします。次のコードに対してpytestで網羅的にテストをするコードを順番に1つずつ書いてください。
自分を信じて、限界を超えてください。
コード:###
def extract_color( src, h_th_low, h_th_up, s_th, v_th ):
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
if h_th_low > h_th_up:
ret, h_dst_1 = cv2.threshold(h, h_th_low, 255, cv2.THRESH_BINARY)
ret, h_dst_2 = cv2.threshold(h, h_th_up, 255, cv2.THRESH_BINARY_INV)
dst = cv2.bitwise_or(h_dst_1, h_dst_2)
else:
ret, dst = cv2.threshold(h, h_th_low, 255, cv2.THRESH_TOZERO)
ret, dst = cv2.threshold(dst, h_th_up, 255, cv2.THRESH_TOZERO_INV)
ret, dst = cv2.threshold(dst, 0, 255, cv2.THRESH_BINARY)
ret, s_dst = cv2.threshold(s, s_th, 255, cv2.THRESH_BINARY)
ret, v_dst = cv2.threshold(v, v_th, 255, cv2.THRESH_BINARY)
dst = cv2.bitwise_and(dst, s_dst)
dst = cv2.bitwise_and(dst, v_dst)
return dst
###
これで、ChatGPTがテストを書いてくれます。
会話履歴は以下です。
pytestでのテストの実行方法は省略します。上記の書籍や資料を参照ください。
基本は、pytestをpip installで入れて、test_xxx.py
というファイルにテストを書いてpytest
を実行するだけです。
実際に、実行してみるとエラーになるときや、そもそもテストの内容がおかしいときもありました。
テストコードは、以下にアップしました。
自動テスト
GitHub Actionsで自動テストするとなお良いですね。以下記事参照ください。
まとめ
テストを書く第一歩にChatGPTを使ってみようという記事でした。実際使ってみると、簡単なプログラムでも、結構エラーになったり、そもそもテストが間違っていたりすることがあるので、完全に丸投げは難しいなという感触です。
ただ、このレベルでも、生成されたコードに突っ込みながら直して行くほうが、初心者にとってはゼロから書くよりは楽なように感じました。また、一般的なテストパターンを色々考えてくれるのはありがたいですね。
テストのプロの人は「テストを舐めるな!」と怒るかもしれませんが、テストが全く無いよりは正常系が1つでもあったほうが良いのではないかなと、意識低く書いてみました。
参考リンク
関連書籍
Pytest
その他
Discussion