Slide 1

Slide 1 text

GitHub Copilotと快適なユニ ットテストコード作成⽣活 2024年5⽉23⽇

Slide 2

Slide 2 text

GitHub Copilot は開発に必 須級のツールだと思います

Slide 3

Slide 3 text

開発コードの近くのユニッ トテストでも重要なツール のはずです

Slide 4

Slide 4 text

今⽇はGitHub Copilotと⼀緒にユニット テストを書く際に役⽴つ知識や私なりの⾒ 解をお話します(初級者向け)

Slide 5

Slide 5 text

今⽇時点の私の考えであることご了承くだ さい!

Slide 6

Slide 6 text

⾃⼰紹介 名前: bun (今泉⼤樹) 所属: クラスメソッド株式会社 経歴 ~ 2018年 地⽅公務員 ~ 2022年 開発系のエンジニア(アドテク) ~ 現在: AWSを基盤としてお客様の開発内製 化⽀援など 認定試験 AWS認定試験12種 JSTQB(ソフトウェアテスト技術者の試 験) Foundation Level Advanced Level Test Manager / Test Analyst / Technical Test Analyst 最近多⽤しているAIに渡すプロンプト 「この資料で発表した後も堂々と⽣きてい けるかな?」 Japan AWS Top Engineer(Service)

Slide 7

Slide 7 text

1.前提知識 GitHub Copilotとは? 私が理解している内容を共有

Slide 8

Slide 8 text

GitHub Copilot AIのコードアシスタントです VSCodeや様々なエディタで利⽤できます 当然テストコードも提案してくれます

Slide 9

Slide 9 text

DS協会_ChatGPTによって描かれる未来とAI開発の変遷.pdf より 引⽤ GPTベース 今回はモデルの深掘 りはせずに「GPTベー ス」くらいのノリで いきます

Slide 10

Slide 10 text

DS協会_ChatGPTによって描かれる未来とAI開発の変遷.pdf より引⽤ GPTとは? 次の⽂字を予測 これら情報を使う 学習データ プロンプト ⽂脈(コンテキス ト) 事実関係ではなく、出現 確率であるのが重要 だから嘘を付くこと があると⾔われる

Slide 11

Slide 11 text

ということは‧‧‧GitHub Copilotにお いてもより良い予測をしてもらうために、 プロンプトやコンテキストにあたるものを 提供するのが⼤事そう

Slide 12

Slide 12 text

これらを抑えたうえで本題に⼊ります

Slide 13

Slide 13 text

. GItHub Copilotの TIPS 良い提案をもらうために知っておきたいこと

Slide 14

Slide 14 text

GitHub Copilotはどうやってプロンプト を⽣成して、提案してくれるのか?

Slide 15

Slide 15 text

https://github.blog/ - - -how-github-copilot-is-getting- better-at-understanding-your-code/ より引⽤ プロンプトの 作成⽅法 今開いているファイルの 内容を元に → 他のソースって何?

Slide 16

Slide 16 text

https://github.blog/ - - -how-to-use-github-copilot-in- your-ide-tips-tricks-and-best-practices/ より引⽤ 開いている他 のタブも⾒る 関連するファイルをタブ として開いておけば予測 に使ってくれる 関連ファイルを開いてい なければ、閉じたファイ ルからコンテキストは取 得できない

Slide 17

Slide 17 text

公式ブログによる「コメント」のTIPS 公式ブログでは、「ファイルのトップレベルにコメントを書くことで GitHub Copilot が今から作ろう としていることの全体感を理解しやすい」といったことが書かれています fetchData のような関数命名ではなく fetchAirPorts というような意味のある命名にすること ファイルのトップレベルだけではなく、適宜「単⼀、具体的、短い」コメントがよりよいと記載されて います その他、 import ⽂を先に書いておくなどのTIPSも書いてありますので是⾮ご覧ください Using GitHub Copilot in your IDE: Tips, tricks, and best practices より引⽤

Slide 18

Slide 18 text

例えば、こんな関数があるとします まとめ買いがお得な⼿芸⽤品店のお題 「ソフトウェアテスト技法練習帳 知識を経験に変える40問」よりお題を引⽤

Slide 19

Slide 19 text

この関数のテスト設計をするときに考えそうなこと 当然ながら 0.0 ~ 100.1 の値をすべてテストするようなことはあまり現実的ではないですよね 参考: JSTQB ソフトウェアテストの7原則 「全数テストは不可能」 であれば、「同じふるまいになる」値に関しては何度も同じテストをしたくない 同値分割法 / 同値クラス と呼ばれるテスト技法 得てして「同値クラス」の境界となるあたりによくバグが潜む 境界値分析 と呼ばれるテスト技法 → じゃあこんな値をテストケースに盛り込んでいきたいな! 0.0 はエラー、0.1 は 単価400円 ‧‧‧ 、100.0は単価350円、100.1 はエラー ⾮常に重要な技法となりますが、今回は詳細を割愛します

Slide 20

Slide 20 text

わざと雑に指⽰を出してみます なかなか良さそうだ けど 境界値っぽいところをテストケースを 書いてくれているものの 有効な境界値である100.0がテスト されていなかったり ⼩数点第⼀位のコメントは考慮され てない? 欲を⾔えば代表値もテストしてくれ て良いんだぜ?とか

Slide 21

Slide 21 text

ちょっとコメントで指⽰を追加してみました さっきより良さそう 外してほしくない指⽰をコメントと して記載 例えば120mなど無効クラスの代表 値があっても良さそうだけど、⼀番 確かめてほしそうなところは⾒てく れてそう ⾜りない部分は更にコメントで追加 の指⽰を出すなどすると良いと思い ます 私がコピペでテストを書くより 時間が圧倒的に節約できました

Slide 22

Slide 22 text

ここまでのまとめ GitHub Copilot では今開いているファイルやタブとして開いているファイルを元に提案してくれる コメントで指⽰を与えることでより意図した結果を得やすい模様

Slide 23

Slide 23 text

. GItHub Copilot Chat のTIPS チャットベースのUIで質問やコード⽣成をして もらえます

Slide 24

Slide 24 text

GItHub Copilot Chat VSCode 内でチャットベースでコードに 関する説明や、提案を受けることが可能 ChatGPT のようにChatUIのような形で やり取りするほか、編集中のファイル内 からインラインで呼び出すことも可能

Slide 25

Slide 25 text

explain コマンドで説明を受けたり インラインでコードを説明してもらう( cmd + i で呼び出し) ChatUIが開き回答してくれる

Slide 26

Slide 26 text

tests コマンドでユニットテストを書いて もらうことも インラインで単体テストを提案してもらう( cmd + i で呼び出し) 「同意する」で テスト⽤のファイルにテストを追 記してくれる(ちなみ結構境界値間違えている)

Slide 27

Slide 27 text

その他にも便利なコマンド‧エージェント が沢⼭あります Chat UI でビジネスロジックの実装場所を教えても らったり( @workspace エージェント) VSCode⾃体の質問をしたり( @vscode エージェン ト)

Slide 28

Slide 28 text

ここまでのまとめ GitHub Copilot Chat で開いているファイルの説明、ドキュメント作成、ユニットテスト作成などを依 頼できる Chat UI で ワークスペース全体の情報を加味した質問への回答をもらうことも可能 VSCode⾃体の質問などもできる 「既存コードが何をやっているかわからないからテストを書けない」とか「ビジネス的に重要な部分 からテストを書いていきたい」というときに全体像を把握するのにも使えると思います

Slide 29

Slide 29 text

⾮常に便利。もう全部 GitHub Copilot に 任せることはできないの?

Slide 30

Slide 30 text

(少なくとも今は丸投げは)やらない⽅が いいと思います

Slide 31

Slide 31 text

4. ユニットテストにおけ るAIとの関わり⽅ なぜGitHub Copilot Chat にすべてを任せるこ とはできないのか? 我々は良いテストを書くために、どのように GitHub Copilot などのツールと関わるのか?

Slide 32

Slide 32 text

なぜ GitHub Copilotにユニットテストを まるっと投げることができないのか? 公式で書かれている ⾝も蓋もないですが However, it is important to note that generated test cases may not cover all possible scenarios, and manual testing and code review are still necessary to ensure the quality of the code. About GitHub Copilot Chat in your IDE - GitHub Docs より ⽣成されるコードの精度 既存のコードを参考に⽣成 されるテストが本当に有⽤ なテストになっているの か? 正常系っぽいテスト 明らかな異常ケースだけ 通っているだけとか あまり学習されにくい領域 のコードの提案は苦⼿なの では? コンテキストに含まれて いない重要な情報 ユーザーストーリーや受け ⼊れ基準、その他デザイン ドキュメントなど 機能を実装する背景は? ユースケースは? 「期待する(あってはなら ない)振る舞い」を与えた りとか

Slide 33

Slide 33 text

AIと良いテストをするために⼤事にしたいこと 開発者がテストについて学習する / テスト技術者が開発や開発者が使うツールに近づいてみる 開発者がテスト設計技法を学習してみる テスト技術者が Copilot 使ったり、⽣成AIサービスで⼿動作業を楽にしたりとか ステークホルダーとコミュニケーション。「誰のために」「なぜ」「機能を作るのか」を明確に そのうえで「この要求(要件)を完了とみなすには、◯◯のテストが必要だね」と理解する そこにテスト技術者とのコラボがあれば尚良い するとAIへの指⽰が的確になり、提案された結果を評価する⼟台ができる(と思います)

Slide 34

Slide 34 text

GitHub Copilot はユニットテストを楽に するのか? 楽になると思います(なりました) 同じようなテストコードを何回も書かずに、⼟台を書いてもらえる。時短がすごくできてます。 既存システムにテストコードもドキュメントもない場合に全体像を把握したり Web API のテストなどは「既存のテストコード」「テスト対象のコード」「振る舞いに対する指⽰」 を与えれば良い感じに提案してくれます(体感) テストのタイトル「user_idがない場合はレコード作成失敗し、HTTP Status Code を返却す る」と書くと結構良い感じにテストや前処理を書いてくれたり ⼀⽅で、「限られた時間で」「複雑なコードに⽴ち向かう」ための知識は未だに必要だと思います 有⽤なテストを書く技術 テストも書きやすい設計技術 → 全部丸っとお任せではなくコパイロットしてもらいながらテストコードを書くと良いと思います。 Copilot Chat なども使いながら、重要なドメインのテストから書き始めるのも良いと思います ちなみに、今後はプランによっても結構差が出るかもしれない

Slide 35

Slide 35 text

全体のまとめ GitHub Copilot に対してコンテキストを提供する⽅法について タブを開く コメントで指⽰を出す など GitHub Copilot Chat で対話ベースで細かい作業を依頼することが可能 コードの説明、「この処理はどこにあるか」といった問い合わせ、テストコードの⽣成 (個⼈的に)ユニットテストを GitHub Copilot などのAIに丸投げは難しい(今はそう思います) 要件や要求を理解したうえで、少ない時間で有⽤なテストを書けるように学習は必要 理解したうえでツールの使い⽅を覚えて、効率的にテストコード作成を依頼、提案されたコードの 評価をできるようになりたい

Slide 36

Slide 36 text

ご清聴ありがとうご ざいました