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
760
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
6
13k
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
960
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
500
MCPと認可まわりの話 / mcp_and_authorization
convto
2
1.8k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
2.5k
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
convto
0
200
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
700
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3.7k
みんなでたのしむ math/big / i love math big
convto
0
390
Other Decks in Programming
See All in Programming
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.5k
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
250
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
SODA - FACT BOOK(JP)
sodainc
1
40k
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
340
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
210
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
170
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.8k
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
300
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
2k
GraphQL の onError と Nullability のこれから
quramy
0
210
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Bash Introduction
62gerente
615
220k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
460
Are puppies a ranking factor?
jonoalderson
2
4.2k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
620
It's Worth the Effort
3n
188
29k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
A better future with KSS
kneath
240
18k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
550
Into the Great Unknown - MozCon
thekraken
41
2.8k
Making the Leap to Tech Lead
cromwellryan
135
10k
RailsConf 2023
tenderlove
30
1.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
ご清聴ありがとうございました!