Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / fast...
Search
convto
October 06, 2025
Programming
710
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
Go Bash #2 で喋った内容です
https://layerx.connpass.com/event/367057/
convto
October 06, 2025
More Decks by convto
See All by convto
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.1k
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
920
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
460
MCPと認可まわりの話 / mcp_and_authorization
convto
2
1.7k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
2.4k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
190
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
670
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3.6k
みんなでたのしむ math/big / i love math big
convto
0
370
Other Decks in Programming
See All in Programming
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
170
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
1
650
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
350
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
210
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.8k
setup-vp GitLab対応の裏側
naokihaba
0
140
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
140
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
AHC070解法紹介
eijirou
0
140
Are APIs Still Relevant in the AI Era?
soyuka
0
360
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
100
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
560
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
The browser strikes back
jonoalderson
0
1.7k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
530
YesSQL, Process and Tooling at Scale
rocio
174
15k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Designing Experiences People Love
moore
143
24k
Transcript
monorepo のテストを早くしたい! ~最小の依存解決への道のり~ 2025/10/06 Go Bash vol.2 @convto
自己紹介 © LayerX Inc. convto (よみは「こんぶと」です) LayerX (2023-03 -) バクラク事業部アカウント基盤開発部
ID チーム 2023-03 ~ 2023-09 まで申請/経費精算などのプロダクト担当 2023-09 くらいからID基盤の開発に関わっています 2
テストやってますか
テスト、早くしたいですよね © LayerX Inc. 早ければ早いほどいい なぜかどんどん遅くなる 困る 4
テストはなぜ遅くなる? © LayerX Inc. コード行数が増える 実行するテストケースが増える 5
テストはなぜ遅くなる? これ自体は悪いことではない 健全に事業成長している証拠 でもある どんな管理をしていても、ソフトウェア規模が大きくなるとぶつかる問題 © LayerX Inc. コード行数が増える 実行するテストケースが増える
6
LayerX では monorepo でバックエンド開発をしています © LayerX Inc. 単一のリポジトリに複数のアプリケーション、ライブラリ、スキーマ定義など monorepo でも問題の構造は変わらない
一方レポジトリの膨張速度は速い その結果 諸問題が早期に顕在化しやすい 7
大きいコードベースでも テストを早くしたい
早くするための手法 © LayerX Inc. コードを小さくする 不要なテストケースを減らす キャッシュする 実行箇所を限定する etc… 9
早くするための手法 © LayerX Inc. コードを小さくする 不要なテストケースを減らす キャッシュする 実行箇所を限定する etc… 10
実行箇所を限定した差分テスト
どうやって差分テストをやるか © LayerX Inc. ソースコードにはそれぞれ依存関係がある 変更した差分を起点に依存を解決させていけば 最小の影響範囲 がわかる いうは易しやるのは超大変だし〜 12
どうやって差分テストをやるか こういうグラフがあったとして © LayerX Inc. 13
どうやって差分テストをやるか B'' を変更したら A / B / A' / D'
/ B'' だけテスト実行されたい © LayerX Inc. 14
差分テスト実行の現在地
パッケージ単位の差分解決ができている https://pkg.go.dev/golang.org/x/tools/go/packages にドキュメントあるので気になる方はぜひ! © LayerX Inc. パッケージ単位の import graph を構築
x/tools/go/packages を利用して import 関係を読み込み、木に整形 変更パッケージからから到達可能なパッケージをリスト テスト実行 16
パッケージ単位の差分解決ができている このあたりは @ktr さんが過去発表しているので、詳細はそちらをどうぞ © LayerX Inc. 17
処理の流れざっくり © LayerX Inc. 変更の特定 GitHub CLI を使って PR で変更されたファイルを取得
影響分析 静的解析を使ってパッケージ単位の依存グラフを作成 影響を受けるパッケージを特定 選択的テスト実行 変更によって影響を受けるパッケージのテストのみを実行 18
成果 この試みは一定の成果を出していて当時 1~2min のテスト高速化ができました © LayerX Inc. 19
いまの困りごと
困り1: めちゃでかパッケージくん [service pkg] < 私のコード行数は53万です、ですがもちろんフルパワーであなたとテストする気はありませ んからご心配なく… [convto] < きみのpkgのテスト実行するだけで4分かかるんだけど
© LayerX Inc. 21
困り1: めちゃでかパッケージくん © LayerX Inc. かわいそうですね 1パッケージが大きいケースでは起きうる レイヤ分け系のアーキテクチャだとよくありそう 22
困り2: 根っこのpkgが引っかかると結局全部連れてくる [domain] < あちゃーおれも依存に含まれちゃったか [service / repository] < マブなんで俺らも出ますよ
[handler] < service さんが行くなら僕も… [convto] < 結局全員相手せなあかんやないかい © LayerX Inc. 23
困り2: 根っこのpkgが引っかかると結局全部連れてくる © LayerX Inc. かわいそうですね 依存の根っこの方のパッケージが含まれると起きがち 24
もっと最小の依存にしたい
さらに実行対象を絞りたい © LayerX Inc. さっきはパッケージ単位だった 関数呼び出しなど、もっと絞ればもっと早くなるのでは! 26
さらに実行対象を絞りたい さっきの依存の図 © LayerX Inc. 27
さらに実行対象を絞りたい 関数レベルまでみると実は依存を絞れる! © LayerX Inc. 28
関数単位の依存解決 © LayerX Inc. パッケージとしては依存してても、実際の変更箇所の処理には依存していないケースは 多々ある 関数呼び出しの call graph みたいなのを作って依存解決すれば優勝できそう
テストも実際の関数呼び出しをしてるので、テスト関数自体もそのグラフに繋がってる かを見れば テスト実行の必要性がマークできる 29
関数単位の依存解決 今の状態 © LayerX Inc. PoC はできて、動くものが作れることはわかった x/tools/x/packages は AST
も要求できるので、それを受け取る ガバっと見て関数呼び出しの依存解決する が、課題も見えてきている 素朴な解析、探索だとパフォーマンスの問題がありそう Go 本体がどうやって依存解決してるかなど参考にしたい PoC は関数だけだったが type / interface / const / var など公開されてる識別子も検証必要 30
まとめ © LayerX Inc. モノレポのテストは成長とともに遅くなる パッケージベースの差分テストでもまだ改善の余地がある コールグラフベースのアプローチでより精密な影響範囲特定を目指す 課題があるがいい感じの解決ができると嬉しい 31
ご清聴ありがとうございました!