Address
:
[go:
up one dir
,
main page
]
Include Form
Remove Scripts
Session Cookies
Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / fast...
Search
convto
October 06, 2025
Programming
2
320
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
Go Bash #2 で喋った内容です
https://layerx.connpass.com/event/367057/
convto
October 06, 2025
Tweet
Share
More Decks by convto
See All by convto
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
300
MCPと認可まわりの話 / mcp_and_authorization
convto
2
760
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
1.4k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
140
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
490
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3k
みんなでたのしむ math/big / i love math big
convto
0
290
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
2
880
Go1.20からサポートされるtree構造のerrの紹介と、treeを考慮した複数マッチができるライブラリを作った話/introduction of tree structure err added since go 1_20
convto
0
1.2k
Other Decks in Programming
See All in Programming
どの様にAIエージェントと 協業すべきだったのか?
takefumiyoshii
1
580
iOSDC.pdf
chronos2500
2
650
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
160
Serena MCPのすすめ
wadakatu
4
880
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
2
160
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
300
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
780
XP, Testing and ninja testing ZOZ5
m_seki
2
270
私達はmodernize packageに夢を見るか feat. go/analysis, go/ast / Go Conference 2025
kaorumuta
2
470
10年もののAPIサーバーにおけるCI/CDの改善の奮闘
mbook
0
750
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
CSC305 Lecture 04
javiergs
PRO
0
250
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Navigating Team Friction
lara
189
15k
How to Ace a Technical Interview
jacobian
280
23k
Side Projects
sachag
455
43k
Designing for Performance
lara
610
69k
Scaling GitHub
holman
463
140k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The Language of Interfaces
destraynor
162
25k
Fireside Chat
paigeccino
40
3.7k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
2.6k
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
ご清聴ありがとうございました!