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
t *testing.T は どこからやってくるの?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kotaro Otaka
April 22, 2026
Programming
1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
t *testing.T は どこからやってくるの?
The Go gopher was designed by Renée French.
https://gotalk.connpass.com/event/388084/
Kotaro Otaka
April 22, 2026
More Decks by Kotaro Otaka
See All by Kotaro Otaka
Vendoring をやめたけどやめたのは正解だったのか
otakakot
0
29
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
1.2k
Go で作った CLI ツールにバージョンを埋め込みたい
otakakot
0
230
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
2
590
組込みだけじゃない! TinyGo で始める無料クラウド開発入門
otakakot
1
150
統一感のある Go コードを生成 AI の力で手にいれる
otakakot
1
3.8k
SQLBoiler がメンテナンスモードになりまして
otakakot
0
350
Wasm わからないけど Go で実装したいから入門する
otakakot
1
11k
cmp.Or に感動した
otakakot
3
1.1k
Other Decks in Programming
See All in Programming
Contextとはなにか
chiroruxx
1
320
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
680
Inside Stream API
skrb
1
720
ふつうのFeature Flag実践入門
irof
7
4k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
9
5.1k
スマートグラスで並列バイブコーディング
hyshu
0
140
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
200
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.1k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
340
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.1k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Believing is Seeing
oripsolob
1
150
How to Think Like a Performance Engineer
csswizardry
28
2.7k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Scaling GitHub
holman
464
140k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Marketing to machines
jonoalderson
1
5.5k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
t *testing.T は どこからやってくるの? おーたかこーたろー / @otakakot 2026.04.22 Go Connect
#12 The Go gopher was designed by Renée French.
ある日... #goconnect
データベースを使ったテストを 実装していたときの話 #goconnect
#goconnect
context canceled が発生して クリーンアップ処理に失敗 #goconnect
pgx パッケージを確認 #goconnect
t.Context() がキャンセルされている #goconnect
Bad! Good! #goconnect
t.Cleanup() では t.Context() は キャンセル済み! #goconnect
ところで... #goconnect
この t *testing.Tはどこからくるのか #goconnect
そもそも Go は main パッケージの main 関数が実行されるんでしょ #goconnect
#goconnect
なぜこのコードは動く ... ??? #goconnect
TextXxx は黒魔術...??? #goconnect
go test が動く仕組み #goconnect
おさらい #goconnect
#goconnect How to Write Go Code #Testing go test コマンドと
testing パッケージ _test.go で終わるファイル func TestXXX(t *testing.T) 関数 https://go.dev/doc/code#Testing
#goconnect https://go.dev/doc/code#Testing
結論 #goconnect
#goconnect go test は ... テスト関数を呼び出す Go コード (main関数)を自動生成し コンパイルして実行している!
全体像 go test コマンド実行 ファイルの分類・関数の収集 _testmain.go の生成 ビルド 実行 #goconnect
注釈 ステップ数はおーたかによる解釈 #goconnect
サンプルコード #goconnect
go version Go 1.26.2 #goconnect
パッケージ構成 #goconnect
#goconnect
#goconnect
#goconnect
注釈 Go 本体のコードを引用しますが スライドの都合で省略しています 詳しくはURLを添付しているので そちらをご参照ください #goconnect
go test コマンド実行 #goconnect
概要 go コマンドが test サブコマンドを呼び テスト処理を実行する #goconnect
軽く解説 #goconnect
#goconnect ざっくりの流れ... go コマンド → test サブコマンド https://github.com/golang/go/blob/go1.26.2/src/cmd/go/main.go
#goconnect ざっくりの流れ... func runTest(...) に到達 https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/test/test.go
rutTest() 関数は パッケージごとに build → run → print を行うオーケストレーション #goconnect
build 処理にて テスト対象ファイル・関数を収集する Import(...) 関数に到達 #goconnect
#goconnect ファイルの分類・関数の収集
概要 ファイル名とパッケージ宣言で分類 テスト名をもとにテスト関数を収集 #goconnect
ファイルとパッケージの分類 ファイル名が _test.go で終わるか パッケージ宣言が _test で終わるか #goconnect
グルーピング ファイル名 パッケージ宣言 GoFiles ex) calc.go ex) package calc TestGoFiles
ex) calc_test.go ex) package calc XTestGoFiles ex) calc_x_test.go ex) package calc_test #goconnect
グルーピング ファイル名 パッケージ宣言 GoFiles ex) calc.go ex) package calc TestGoFiles
ex) calc_test.go ex) package calc XTestGoFiles ex) calc_x_test.go ex) package calc_test pxtest ptest #goconnect
各パッケージからテスト関数を AST により収集 #goconnect
#goconnect ptest, pxtest を for ループ https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L584-L593
#goconnect テスト関数を管理する構造体 https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L626-L638
#goconnect ファイル内の関数をループ https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L702-L773
#goconnect 命名規則チェック 関数の型チェック https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L702-L773
#goconnect https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L584-L593
#goconnect 型チェック ジェネリクス禁止 https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L775-L788
#goconnect 戻り値・引数チェック ポインタチェック 型名チェック https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L557-L579
以下のテスト関数を収集 ptest.TestAdd(t *testing.T) ptest.TestSub(t *testing.T) pxtest.TestAdd(t *testing.T) #goconnect
_testmain.go の生成 #goconnect
概要 テスト関数を実行する main () 関数を生成する #goconnect
Go Template を使ったコード生成 testFuncs 構造体を受け取る testmainTmpl #goconnect
#goconnect https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L790-L862
#goconnect https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L790-L862
#goconnect https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L790-L862
#goconnect Go Template によるコード生成 https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/load/test.go#L617-L624
生成されるテスト実行コード #goconnect
_testmain.go の確認方法 go test -work WORK=xxxx #goconnect
#goconnect https://github.com/golang/go/blob/go1.26.2/src/testing/testing.go#L2319-L2329
#goconnect https://github.com/golang/go/blob/go1.26.2/src/testing/testing.go#L2340-L2487
#goconnect https://github.com/golang/go/blob/go1.26.2/src/testing/testing.go#L2551-L2598
t *testing.T は自動生成するコードで テストを動かす MainStart(..).Run() 関数 からやってくる! #goconnect
#goconnect https://github.com/golang/go/blob/go1.26.2/src/testing/testing.go#L1876-L2042
ビルド #goconnect
概要 リスト化したパッケージをもとに 実行可能バイナリを生成する #goconnect
省略! go build と同じ仕組みを利用 バイナリの命名が異なる (.test が付与) #goconnect
実行 #goconnect
概要 生成したテストバイナリを 子プロセスとして実行 #goconnect
#goconnect https://github.com/golang/go/blob/go1.26.2/src/cmd/go/internal/test/test.go#L1435-L1774
テスト実行完了! #goconnect
まとめ #goconnect
#goconnect go test は黒魔術ではなく go template と AST を愚直に使った コード自動生成による
main 関数の実行
2020.04 2021.04 2022.11 Kotaro Otaka おーたかこーたろー / @otakakot Web Engineer
新卒入社 Hello Golang! Web Engineer @株式会社ビットキー Gopher6年生 #goconnect
おわり またどこかで お会いしましょう!