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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
convto
October 06, 2025
Programming
690
2
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
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
790
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
400
MCPと認可まわりの話 / mcp_and_authorization
convto
2
1.7k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
2.3k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
180
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
610
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3.5k
みんなでたのしむ math/big / i love math big
convto
0
360
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
2
1.1k
Other Decks in Programming
See All in Programming
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
480
初めての模倣学習とVLA
natsutan
0
420
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
1
150
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
410
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
2
950
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
110
源内ハンズオン概要編
hideg
0
240
Foundry Localでエージェント開発
seosoft
0
110
AIエージェント時代のコードレビューを設計する
nogu66
5
2.2k
FDEとは、何者なのか?
masapyon1212
0
110
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
290
Featured
See All Featured
Ruling the World: When Life Gets Gamed
codingconduct
0
320
New Earth Scene 8
popppiees
3
2.5k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
880
A Tale of Four Properties
chriscoyier
163
24k
Technical Leadership for Architectural Decision Making
baasie
3
550
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
490
How GitHub (no longer) Works
holman
316
150k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
710
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
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
ご清聴ありがとうございました!