📝

PythonのテストをChatGPTに書いてもらう

2023/11/04に公開

テストを書いてない

テスト書いてない。あってはならない気がしますが、実際ありますよね(ここだけの話)。

だって、テストって無くてもプログラム動きますからね。逆にテストだけあっても、プログラムは動きません。背に腹は代えられないってやつですね(駄目なやつです)。

といってもテストって書いたことないと、何をどう書いてよいかイマイチ分かりません。この記事は、そんな人(自分です)に、ChatGPTを使ってテストを書く第一歩を踏み出してみると良いかもという記事です。

最初に書いておきますが、この記事は決して「テストは人間が書く必要ない、これからはAIでテストを書く時代」ということを言いたい記事ではないです。怖い人に怒られそうなのもありますが、実際やってみると、結構AIでテストをいい感じに書いてもらうの、まだ難しかったです。

ChatGPTでテストを書く方法

ChatGPTでテストを書く方法ですが、その前にPythonでテストを書くライブラリを確認します。テストのためのライブラリは色々あるようですが、よく聞くのが「unittest」「pytest」です(他にも「nose」「doctest」もあるようですが割愛します)。

どれでもよいのですが、以下の書籍(テスト駆動Python)やSansanさんの研修資料などがpytestをすすめていてメジャーなようなのでpytestを使うことを前提とします。

https://amzn.to/3tUzQGz

https://buildersbox.corp-sansan.com/entry/2023/10/25/110000

テストを書く対象のコードは、自分が昔に作った色を抽出するだけのプログラムにしてみます。
https://github.com/karaage0703/python-image-processing/blob/master/extract_color.py

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がテストを書いてくれます。

会話履歴は以下です。
https://chat.openai.com/share/628c638e-9e7e-4593-a512-8b81d3f1f279

pytestでのテストの実行方法は省略します。上記の書籍や資料を参照ください。

基本は、pytestをpip installで入れて、test_xxx.pyというファイルにテストを書いてpytestを実行するだけです。

実際に、実行してみるとエラーになるときや、そもそもテストの内容がおかしいときもありました。

テストコードは、以下にアップしました。

https://github.com/karaage0703/python-image-processing/blob/master/tests/test_extract_color.py

自動テスト

GitHub Actionsで自動テストするとなお良いですね。以下記事参照ください。

https://zenn.dev/karaage0703/articles/900b42bbaa5f4a

まとめ

テストを書く第一歩にChatGPTを使ってみようという記事でした。実際使ってみると、簡単なプログラムでも、結構エラーになったり、そもそもテストが間違っていたりすることがあるので、完全に丸投げは難しいなという感触です。

ただ、このレベルでも、生成されたコードに突っ込みながら直して行くほうが、初心者にとってはゼロから書くよりは楽なように感じました。また、一般的なテストパターンを色々考えてくれるのはありがたいですね。

テストのプロの人は「テストを舐めるな!」と怒るかもしれませんが、テストが全く無いよりは正常系が1つでもあったほうが良いのではないかなと、意識低く書いてみました。

参考リンク

関連書籍

https://amzn.to/3tUzQGz

https://amzn.to/3MG1opx

Pytest

https://qiita.com/kg1/items/4e2cae18e9bd39f014d4

https://www.nogawanogawa.work/entry/pytest

https://speakerdeck.com/yumechi/to-become-an-advanced-user-of-python-that-can-be-used-at-work

https://nikkie-ftnext.hatenablog.com/entry/pycon-apac-2023-practice-test-talk-extra-awesome-unittest

https://nikkie-ftnext.hatenablog.com/entry/pycon-apac-2023-practice-test-talk-extra-test-topics-commentary

https://nikkie-ftnext.hatenablog.com/entry/pycon-apac-2023-practice-test-talk

https://tech-blog.abeja.asia/entry/techblog-operation-202310

https://zenn.dev/fumi_sagawa/articles/932bcaafd28c53

その他

https://speakerdeck.com/keio_smilab/keio-univ-intro-to-ml-02-coding

https://zenn.dev/akfm/articles/testing-strategies-to-accelerate-team

Discussion