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
Kotaro Otaka
April 22, 2026
Programming
1.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
actions/setup-go 完全に理解した
otakakot
1
21
Vendoring をやめたけどやめたのは正解だったのか
otakakot
0
56
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
1.3k
Go で作った CLI ツールにバージョンを埋め込みたい
otakakot
0
240
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
2
620
組込みだけじゃない! TinyGo で始める無料クラウド開発入門
otakakot
1
160
統一感のある Go コードを生成 AI の力で手にいれる
otakakot
1
3.9k
SQLBoiler がメンテナンスモードになりまして
otakakot
0
370
Wasm わからないけど Go で実装したいから入門する
otakakot
1
11k
Other Decks in Programming
See All in Programming
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
460
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
180
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
300
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
130
テーブルをDELETEした
yuzneri
0
130
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
620
Android CLI
fornewid
0
200
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1.1k
Build-to-own AI: Agentic Development for Humans
inesmontani
PRO
0
160
その節約、円になってますか?
isamumumu
1
640
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
310
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
420
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Marketing to machines
jonoalderson
1
5.6k
Why Our Code Smells
bkeepers
PRO
340
58k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
A better future with KSS
kneath
240
18k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
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
おわり またどこかで お会いしましょう!