Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GPTを使った新たな開発者体験!?flaky testを自動修復してみた/JaSST nano vol.25-Link and Motivation

GPTを使った新たな開発者体験!?flaky testを自動修復してみた/JaSST nano vol.25-Link and Motivation

【JaSST nano vol.25】
リンクアンドモチベーション登壇資料(2023/06/20)

『GPTを使った新たな開発者体験!?flaky testを自動修復してみた』

#jasstnano #リンクアンドモチベーション #リンモチ
=============================================
【イベント情報】
■イベントページ
 https://jasst-nano.connpass.com/event/285934/

【株式会社リンクアンドモチベーション】
■お問い合わせ
 [email protected]
■Entrancebook
 https://note.com/lmi/n/n179505e048f4
■テックブログ
 https://link-and-motivation.hatenablog.com/
=============================================

More Decks by リンクアンドモチベーション

Transcript

  1. 2 © Link and Motivation Group 自己紹介 代慶 真(よけい まこと)

    株式会社リンクアンドモチベーションQA • モチベーションクラウドの開発で バックエンドエンジニアとして2年間経験 • 昨年よりQAエンジニアとして、 主に自動テストの保守・運用を担当する
  2. © Link and Motivation Group 6 今日話すこと • flaky testにおける課題

    • flaky testの可視化 • flaky testの改善 ← GPTを使った話をします
  3. 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
  4. 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 現在時刻が変化することで、 ユーザーの作成時刻と現在時 刻として取得した時間がずれ、 対象のレコードが見つからな い場合がある
  5. 13 © Link and Motivation Group 課題①: 生産性の低下 うーん、ユニットテストのCI失敗してるけど、 こんなところいじった覚えないな〜

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

    これって、自分の修正が原因?flaky test? また、CIが落ちたぞ! これで再実行何度目だ 開発者A 開発者B CIの失敗した原因を調べるための余計な調査の発生 CIの再実行を繰り返し、PRの待ち時間の発生
  7. 15 © Link and Motivation Group 課題②: 品質の低下 ユニットテストでバグに気づくよりflaky testの方が多い。不要なのでは?

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

    どうせ再実行しても失敗するんだから、 もう強制マージしちゃえ 開発者A 開発者B 失敗の繰り返しによる、ユニットテストの信頼性低下 ユニットテストの信頼性低下による、バグ混入の危険性の増加
  9. 17 © Link and Motivation Group 課題のまとめ 生産性の低下 CIの失敗した原因を調べるための余計な調査の発生 CIの再実行を繰り返し、PRの待ち時間の発生

    品質の低下 失敗の繰り返しによる、ユニットテストの信頼性低下 ユニットテストの信頼性低下による、バグ混入の危険性の増加
  10. 19 © Link and Motivation Group 可視化の方法 • masterにマージ後、ユニットテストを実行 •

    実行結果をGoogle Sheetsに連携 • Google Looker Studioを用いてデータを加工・可視化 • slackに結果の送信
  11. 24 © Link and Motivation Group 可視化② 優先課題となるテストケースの可視化 失敗頻度が高い テストケースを特定で

    きる テストファイル単位で flaky testが改善され ている 失敗頻度順に並べたテストケース一覧と頻度の推移
  12. 26 © Link and Motivation Group 結果 4月 ~ 6月にかけて

    徐々に成功率が改善されている ユニットテストのCIの成功率の月ごとの遷移 可視化を始めた4月時点での 成功率がかなり低い
  13. 27 © Link and Motivation Group 可視化のまとめ 現状がわかる 定量的に可視化することで、実際にどれほどflaky testの影響を受けているかがわかる

    改善アクションがわかる flaky testの発生頻度を可視化することで、優先課題を洗い出しコスパよく改善ができる 改善状況がわかる flaky testが実際に治ったことも観測できる
  14. 32 © Link and Motivation Group 入力内容 # フレーキーなRSpecテストの調査と修正に関する質問: ###

    前提条件 ・Railsを使った開発です。 ・フレーキーなテストとは、コードまたはテストそのものに変更がないにもかかわらず、 合格と不合格の両方を返すテストのことです。 ... etc ### 質問 - テストがフレーキーになっている原因と対策をコードベースで提案してください。 - わからない部分があれば私に質問してください ### 過去にフレーキーなテストが発生した事例 - 実行時間に依存することで落ちる - 月初のタイミングで落ちる ...etc ### エラーログ {{ エラーログ }} ### テストコード {{ テストコード }} ### プロダクションコード {{ プロダクションコード }} プロンプトの概要
  15. 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
  16. 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 実行タイミング に依存
  17. 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 実行タイミング に依存
  18. 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 現在時刻を固定 することで解決 実行タイミング に依存
  19. 38 © Link and Motivation Group 構成 • テストが失敗するまで、テストの実行 •

    失敗した時のエラーログとテストコードを元にプロンプトを作成 • GPTに問い合わせ • 問い合わせ結果をもとにコードの修正 • テストの再実行をし、コードの検証
  20. 40 © Link and Motivation Group 改善のまとめ 必要な人手が減る ChatGPTを活用したプロンプトを使うことで、flaky testの改善の効率化

    必要な人手がなくなる GPTを活用した自動修復を使うことで、最終的には人間の介在なしにflaky testが改善できる かもしれない
  21. 42 © Link and Motivation Group まとめ flaky testの課題 生産性の低下

    品質の低下 flaky testの可視化 現状がわかる 改善のアクションがわかる 改善状況がわかる flaky testの改善 必要な人手が減る 必要な人手がなくなる
  22. 43 © Link and Motivation Group 今後の展望 flaky test改善の運用 •

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