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
82
0
Share
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
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
670
Go で作った CLI ツールにバージョンを埋め込みたい
otakakot
0
210
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
2
540
組込みだけじゃない! TinyGo で始める無料クラウド開発入門
otakakot
1
120
統一感のある Go コードを生成 AI の力で手にいれる
otakakot
1
3.8k
SQLBoiler がメンテナンスモードになりまして
otakakot
0
330
Wasm わからないけど Go で実装したいから入門する
otakakot
1
10k
cmp.Or に感動した
otakakot
3
1.1k
net/http/httptest が推しです♡
otakakot
3
390
Other Decks in Programming
See All in Programming
Feature Toggle は捨てやすく使おう
gennei
0
570
TiDBのアーキテクチャから学ぶ分散システム入門 〜MySQL互換のNewSQLは何を解決するのか〜 / tidb-architecture-study
dznbk
1
160
アクセシビリティ試験の"その後"を仕組み化する
yuuumiravy
0
130
Swift Concurrency Type System
inamiy
0
480
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.9k
Radical Imagining - LIFT 2025-2027 Policy Agenda
lift1998
0
280
Coding as Prompting Since 2025
ragingwind
0
820
ファインチューニングせずメインコンペを解く方法
pokutuna
0
300
Running Swift without an OS
kishikawakatsumi
0
780
PHP 7.4でもOpenTelemetryゼロコード計装がしたい! / PHPerKaigi 2026
arthur1
1
570
PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい
higaki_program
0
190
Rethinking API Platform Filters
vinceamstoutz
0
11k
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
100
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
240
Building the Perfect Custom Keyboard
takai
2
730
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
140
A Modern Web Designer's Workflow
chriscoyier
698
190k
Navigating Weather and Climate Data
rabernat
0
160
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Balancing Empowerment & Direction
lara
6
1k
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
おわり またどこかで お会いしましょう!