Slide 1

Slide 1 text

© Link and Motivation Group GPTを使った新たな開発者体験!? flaky testを自動修復してみた 株式会社リンクアンドモチベーション イネーブリングチーム 代慶 真

Slide 2

Slide 2 text

2 © Link and Motivation Group 自己紹介 代慶 真(よけい まこと) 株式会社リンクアンドモチベーションQA ● モチベーションクラウドの開発で バックエンドエンジニアとして2年間経験 ● 昨年よりQAエンジニアとして、 主に自動テストの保守・運用を担当する

Slide 3

Slide 3 text

3 © Link and Motivation Group 働きがい あふれる社会へ リンクアンドモチベーション|プロダクト

Slide 4

Slide 4 text

4 © Link and Motivation Group リンクアンドモチベーション|プロダクト 診断 変革 ※ 2022年度 実績 10,060 社 312 万人

Slide 5

Slide 5 text

© Link and Motivation Group 5 今日話すこと ● flaky testにおける課題 ● flaky testの可視化 ● flaky testの改善

Slide 6

Slide 6 text

© Link and Motivation Group 6 今日話すこと ● flaky testにおける課題 ● flaky testの可視化 ● flaky testの改善 ← GPTを使った話をします

Slide 7

Slide 7 text

7 © Link and Motivation Group flaky testって何? 実行結果が不安定なテスト テストコードやプロダクションコードに変更 がないのに、テストが成功したり失敗したりする

Slide 8

Slide 8 text

8 © Link and Motivation Group flaky testの具体例 実行タイミングに依存したflaky test(ユニットテスト) it 'ユーザーが作成されること' do User.create(name: 'Test User') datetime = DateTime.now expect( User.where( name: ‘Test User’, created_at: datetime, ) ).to be_present end

Slide 9

Slide 9 text

9 © Link and Motivation Group it 'ユーザーが作成されること' do User.create(name: 'Test User') datetime = DateTime.now expect( User.where( name: ‘Test User’, created_at: datetime, ) ).to be_present end flaky testの具体例 ユーザーの作成-- 00:00:00 実行タイミングに依存したflaky test(ユニットテスト) 現在時刻の取得-- 00:00:01 現在時刻が変化することで、 ユーザーの作成時刻と現在時 刻として取得した時間がずれ、 対象のレコードが見つからな い場合がある

Slide 10

Slide 10 text

© Link and Motivation Group 10 flaky testにおける課題

Slide 11

Slide 11 text

11 © Link and Motivation Group 前提 PRのマージ条件にユニットテストの成功は必須

Slide 12

Slide 12 text

12 © Link and Motivation Group 前提 PRのマージ条件にユニットテストの成功は必須 ユニットテストが失敗するとマージできな い

Slide 13

Slide 13 text

13 © Link and Motivation Group 課題①: 生産性の低下 うーん、ユニットテストのCI失敗してるけど、 こんなところいじった覚えないな〜 これって、自分の修正が原因?flaky test? また、CIが落ちたぞ! これで再実行何度目だ 開発者A 開発者B

Slide 14

Slide 14 text

14 © Link and Motivation Group 課題①: 生産性の低下 うーん、ユニットテストのCI失敗してるけど、 こんなところいじった覚えないな〜 これって、自分の修正が原因?flaky test? また、CIが落ちたぞ! これで再実行何度目だ 開発者A 開発者B CIの失敗した原因を調べるための余計な調査の発生 CIの再実行を繰り返し、PRの待ち時間の発生

Slide 15

Slide 15 text

15 © Link and Motivation Group 課題②: 品質の低下 ユニットテストでバグに気づくよりflaky testの方が多い。不要なのでは? どうせ再実行しても失敗するんだから、 もう強制マージしちゃえ 開発者A 開発者B

Slide 16

Slide 16 text

16 © Link and Motivation Group 課題②: 品質の低下 ユニットテストでバグに気づくよりflaky testの方が多い。不要なのでは? どうせ再実行しても失敗するんだから、 もう強制マージしちゃえ 開発者A 開発者B 失敗の繰り返しによる、ユニットテストの信頼性低下 ユニットテストの信頼性低下による、バグ混入の危険性の増加

Slide 17

Slide 17 text

17 © Link and Motivation Group 課題のまとめ 生産性の低下 CIの失敗した原因を調べるための余計な調査の発生 CIの再実行を繰り返し、PRの待ち時間の発生 品質の低下 失敗の繰り返しによる、ユニットテストの信頼性低下 ユニットテストの信頼性低下による、バグ混入の危険性の増加

Slide 18

Slide 18 text

© Link and Motivation Group 18 flaky testの可視化

Slide 19

Slide 19 text

19 © Link and Motivation Group 可視化の方法 ● masterにマージ後、ユニットテストを実行 ● 実行結果をGoogle Sheetsに連携 ● Google Looker Studioを用いてデータを加工・可視化 ● slackに結果の送信

Slide 20

Slide 20 text

20 © Link and Motivation Group 可視化① 成功率 ユニットテストのCIの成功率の月ごとの遷移

Slide 21

Slide 21 text

21 © Link and Motivation Group 可視化① 成功率 ユニットテストのCIの成功率の月ごとの遷移 可視化を始めた4月時点での 成功率がかなり低い

Slide 22

Slide 22 text

22 © Link and Motivation Group 可視化② 優先課題となるテストケースの可視化 失敗頻度順に並べたテストケース一覧と頻度の推移

Slide 23

Slide 23 text

23 © Link and Motivation Group 可視化② 優先課題となるテストケースの可視化 失敗頻度順に並べたテストケース一覧と頻度の推移 失敗頻度が高い テストケースを特定で きる

Slide 24

Slide 24 text

24 © Link and Motivation Group 可視化② 優先課題となるテストケースの可視化 失敗頻度が高い テストケースを特定で きる テストファイル単位で flaky testが改善され ている 失敗頻度順に並べたテストケース一覧と頻度の推移

Slide 25

Slide 25 text

25 © Link and Motivation Group 結果 ユニットテストのCIの成功率の月ごとの遷移 可視化を始めた4月時点での 成功率がかなり低い

Slide 26

Slide 26 text

26 © Link and Motivation Group 結果 4月 ~ 6月にかけて 徐々に成功率が改善されている ユニットテストのCIの成功率の月ごとの遷移 可視化を始めた4月時点での 成功率がかなり低い

Slide 27

Slide 27 text

27 © Link and Motivation Group 可視化のまとめ 現状がわかる 定量的に可視化することで、実際にどれほどflaky testの影響を受けているかがわかる 改善アクションがわかる flaky testの発生頻度を可視化することで、優先課題を洗い出しコスパよく改善ができる 改善状況がわかる flaky testが実際に治ったことも観測できる

Slide 28

Slide 28 text

© Link and Motivation Group 28 flaky testの改善

Slide 29

Slide 29 text

29 © Link and Motivation Group 改善したい気持ちはありつつも、、、 一つ一つflaky testの修正に時間がかかるし、 一人でやっていくには厳しい pjtも佳境で、flaky testの改 善は後回しになってしまいます 私 開発者A

Slide 30

Slide 30 text

30 © Link and Motivation Group そんな時、 チーム内でGPTアイデアソンの開催

Slide 31

Slide 31 text

31 © Link and Motivation Group 取り組み①ChatGPTを使ったコードの改善 テストコード、エラーログなど を含んだプロンプト 原因と改善コード

Slide 32

Slide 32 text

32 © Link and Motivation Group 入力内容 # フレーキーなRSpecテストの調査と修正に関する質問: ### 前提条件 ・Railsを使った開発です。 ・フレーキーなテストとは、コードまたはテストそのものに変更がないにもかかわらず、 合格と不合格の両方を返すテストのことです。 ... etc ### 質問 - テストがフレーキーになっている原因と対策をコードベースで提案してください。 - わからない部分があれば私に質問してください ### 過去にフレーキーなテストが発生した事例 - 実行時間に依存することで落ちる - 月初のタイミングで落ちる ...etc ### エラーログ {{ エラーログ }} ### テストコード {{ テストコード }} ### プロダクションコード {{ プロダクションコード }} プロンプトの概要

Slide 33

Slide 33 text

33 © Link and Motivation Group 結果 it 'メール送信予約レコードが生成されていること' do post_pre_tests_send_mail datetime = CustomDateTime.get_date_time_hash date = datetime[:date].to_date time = datetime[:time] send_company_users.each do |send_company_user| expect( SendReservation.where( company_id: send_company_user.company_id, user_id: send_company_user.user_id, mail_type_id: MailType.type_ids[:pre_test], day: date, time: time, is_moved: 1, ), ).to be_present end 実際に存在したflaky test

Slide 34

Slide 34 text

34 © Link and Motivation Group 結果 実際に存在したflaky test it 'メール送信予約レコードが生成されていること' do post_pre_tests_send_mail datetime = CustomDateTime.get_date_time_hash date = datetime[:date].to_date time = datetime[:time] send_company_users.each do |send_company_user| expect( SendReservation.where( company_id: send_company_user.company_id, user_id: send_company_user.user_id, mail_type_id: MailType.type_ids[:pre_test], day: date, time: time, is_moved: 1, ), ).to be_present end 実行タイミング に依存

Slide 35

Slide 35 text

35 © Link and Motivation Group 結果 実際に存在したflaky test ChatGPTの回答 it 'メール送信予約レコードが生成されていること' do post_pre_tests_send_mail datetime = CustomDateTime.get_date_time_hash date = datetime[:date].to_date time = datetime[:time] send_company_users.each do |send_company_user| expect( SendReservation.where( company_id: send_company_user.company_id, user_id: send_company_user.user_id, mail_type_id: MailType.type_ids[:pre_test], day: date, time: time, is_moved: 1, ), ).to be_present end 実行タイミング に依存

Slide 36

Slide 36 text

36 © Link and Motivation Group 結果 実際に存在したflaky test ChatGPTの回答 it 'メール送信予約レコードが生成されていること' do post_pre_tests_send_mail datetime = CustomDateTime.get_date_time_hash date = datetime[:date].to_date time = datetime[:time] send_company_users.each do |send_company_user| expect( SendReservation.where( company_id: send_company_user.company_id, user_id: send_company_user.user_id, mail_type_id: MailType.type_ids[:pre_test], day: date, time: time, is_moved: 1, ), ).to be_present end 現在時刻を固定 することで解決 実行タイミング に依存

Slide 37

Slide 37 text

37 © Link and Motivation Group 取り組み②GPTを使ったコードの自動修復 自動修復・・・ 人間の介在なしにflaky testを検出し、コードを修正す る ※ 今回の発表時点では厳密に自動修復ができているわけではない

Slide 38

Slide 38 text

38 © Link and Motivation Group 構成 ● テストが失敗するまで、テストの実行 ● 失敗した時のエラーログとテストコードを元にプロンプトを作成 ● GPTに問い合わせ ● 問い合わせ結果をもとにコードの修正 ● テストの再実行をし、コードの検証

Slide 39

Slide 39 text

39 © Link and Motivation Group 結果

Slide 40

Slide 40 text

40 © Link and Motivation Group 改善のまとめ 必要な人手が減る ChatGPTを活用したプロンプトを使うことで、flaky testの改善の効率化 必要な人手がなくなる GPTを活用した自動修復を使うことで、最終的には人間の介在なしにflaky testが改善できる かもしれない

Slide 41

Slide 41 text

© Link and Motivation Group 41 まとめと今後の展望

Slide 42

Slide 42 text

42 © Link and Motivation Group まとめ flaky testの課題 生産性の低下 品質の低下 flaky testの可視化 現状がわかる 改善のアクションがわかる 改善状況がわかる flaky testの改善 必要な人手が減る 必要な人手がなくなる

Slide 43

Slide 43 text

43 © Link and Motivation Group 今後の展望 flaky test改善の運用 ● テスト成功率の目標を定め、開発チームと基準を揃える ● flaky testの発生の検出時に自動で担当者のアサインする GPTによる自動修復 ● 改善提案コードの精度の向上をする ● flaky test発生時に、改善提案コードを自動でPR作成までする

Slide 44

Slide 44 text

44 © Link and Motivation Group おしらせ ブログも書きました! LLM関連情報もいろいろあります! https://link-and- motivation.hatenablog.com/