こんにちは、虎の穴ラボの浜田です。
ChatGPTとGitHub Copilot Chatを利用して単体テストコードをなるべく楽に作成できないか検証を行いましたので、その内容をお伝えしたいと思います。
はじめに
システムの品質を担保するためにテストコードの作成は非常に重要です。 実際、私も過去にミドルウェアのバージョンアップや、プログラム改修時の予期していなかった箇所へ影響の発見など、何度もテストコードに助けられました。
ただテストコードを作成する際、テストパターンの洗い出しやモック、テストデータの準備など意外と工数がかかってしまいます。 今回はChatGPT(またはGitHub Copilot Chat)を利用して単体テスト作成の工数を短縮できないか検証を行いましたので、結果を共有させていただきます。
ChatGPTとGitHub Copilot Chatの紹介
ChatGPTとGitHub Copilot Chatについて、改めて紹介いたします。
ChatGPTの紹介
ChatGPT(チャットジーピーティー、英語: Chat Generative Pre-trained Transformer)は、OpenAIが2022年11月に公開した人工知能チャットボットであり、生成AIの一種。
引用:https://ja.wikipedia.org/wiki/ChatGPT
広く普及した生成AIの一つだと思います。業務のほか、日常生活で活用されている方も多いのではないでしょうか?
GitHub Copilot Chatの紹介
GitHub Copilot Chat は、GitHub Copilot と対話して、GitHub.com およびサポートされている IDE 内でコーディング関連の質問に対する回答を得ることができるチャット インターフェイスです。
引用:https://docs.github.com/ja/copilot/github-copilot-chat/about-github-copilot-chat
GitHub Copilot Chatはよりコーディングに特化したチャットツールと捉えることが出来そうです。
ChatGPT(GitHub Copilot Chat)を利用した単体テストコードの作成方法
今回は以下のフローで単体テストを作成しました。
ChatGPT、GitHub Copilot Chatでフローは変わらないため、GitHub Copilot Chatでの作成フローを例に紹介します。
VS CodeのGitHub Copilot Chat拡張機能を利用して検証を行いました。
単体テスト作成対象のプログラムの紹介
今回は「配送サイズと配送方法から手数料を返却する」というメソッドを利用します。
package org.example; public class CalculateService { /** * 配送サイズ、配送方法に応じて手数料を計算する * * このメソッドの仕様は以下の通り * deliveryMethod == 0、かつboxSize < 10の場合、一律100円 * deliveryMethod == 1、かつboxSize < 10の場合、500円 * deliveryMethod == 1、かつboxSize >= 10の場合、1000円 * deliveryMethod == 2、かつboxSize < 10の場合、700円 * deliveryMethod == 2、かつboxSize >= 10の場合、1400円 * deliveryMethod == 2、かつboxSize == 99の場合、3000円 * * 上記以外の場合、エラーとして-1を返却する * * @param boxSize 配送サイズ * @param deliveryMethod 配送方法 * @return 料金(エラーの場合は-1) */ public int calculateFee(int boxSize, int deliveryMethod) { if(deliveryMethod == 0 && boxSize < 10){ return 100; } if(deliveryMethod == 1) { if(boxSize < 10){ return 500; } return 1000; } if(deliveryMethod == 2) { if(boxSize == 99){ return 3000; } if(boxSize < 10){ return 700; } return 1400; } return -1; } }
1.テスト対象のメソッドを取り込む
テスト対象となるメソッドの取り込みを行います。
2.テストパターンを考えてもらう
最初にこのメソッドに必要な単体テストのパターンを考えてもらいました。
3.サンプルとなるテストコードを「手動で」作成する
正常系のテストのみ1パターン手動で作成しました。
4.手動で作成したテストコードをGitHub Copilot Chatに取り込む
正常系のテストパターンを覚えさせます。
この手順を挟むことで、今後生成されるテストコードも、ある程度形式を保ったものが出力されるようになります。
5.GitHub Copilot Chatにテストパターンに応じたコードを作成してもらう
手順1で作成したテストパターンをプロンプトに入力し、他のテストコードを生成します。
画像赤枠内がGitHub Copilot Chatが生成したコードになります。
他のパターンも一気に作成することができました。
いきなり単体テストコードを作成させない理由
ChatGPT、GitHub Copilot Chatともに、単体テストコードを読み込ませた後にテストコードを生成しなかった理由は「生成したコードのほとんどが作り直しになった」ためです。
生成されたコードのほとんどが現行プロジェクトに合わないコードが生成されてしまい、結果として大部分が利用できませんでした。
ただし、最初にサンプルコードを読み込ませることで、出力されるコードもプロジェクトに合った内容で出力されるようになったため、上記の方法を採用しました。
ChatGPT、Copilot Chatの相違点
両方のツールを利用した結果、回答に以下のような違いがありました。
ChatGPT:
プログラム解析の説明が丁寧(言い換えると冗長、回りくどい)
GitHub Copilot Chat:
プログラム解析の説明が簡素
同じプログラムをChatGPT、GitHub Copilot Chatに取り込ませた結果は以下になります。
ChatGPT
GitHub Copilot Chat
GitHub Copilot Chatは「10以上99未満の場合は1400円」という回答を返している部分が気になりました。
(ロジック上はboxSize = 100となった場合でも1400円が返却されるため)
この点については、ChatGPTの回答のほうが無難だと感じました。
ただ、どちらのツールを利用するにせよ、最終的な人間のチェックは必要だと考えています。
まとめ
今回はChatGPT、GitHub Copilot Chatを利用した単体テストコードの作成方法を紹介させて頂きました。 所感としては以下になります。
メリットだと感じた点:
・テストパターンの洗い出しに使える
・1つのテストコードを元にほかパターンへの展開が容易
イマイチな点:
・生成されるテストコードがプロジェクトの形式と合わなかった
・文字数の制限により、コード量が多いメソッドではそもそも利用できない事がある
今回の検証では「テストコードの生成工数を削減する」という観点では、あまり良い結果を出すことが出来ませんでした。 ただ、テストパターンの洗い出しや、テストコードのバリエーション展開といった工程である程度活用できることがわかりました。 今後もChatGPT、GitHub Copilot Chatを活用しつつ、単体テスト作成の効率化を勧めていきたいと思います。 そして、もしもっと効率的な利用方法をご存知の方がいらっしゃれば、ぜひブログや勉強会で共有いただければと思います。
ちなみに、虎の穴ラボではChatGPT Plus、GitHub Copilot Chatの両方が利用できる環境が整っています。 生成AIを利用してシステム開発の効率化を行ってみたい方はぜひ採用ページもご覧いただければと思います。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp