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
go test -json そして testing.T.Attr / Kyoto.go #63
Search
utagawa kiki
August 31, 2025
Programming
3
330
go test -json そして testing.T.Attr / Kyoto.go #63
Kyoto.go #63 オフラインLT会@マネフォ京都
https://kyotogo.connpass.com/event/363034/
utagawa kiki
August 31, 2025
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
1.1k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
2.4k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
21
16k
Dive into gomock / Go Conference 2024
utgwkk
14
7.7k
Goでリフレクションする、その前に / Kansai.go #1
utgwkk
4
3.6k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
7
4.2k
ありがとう、create-react-app
utgwkk
4
11k
mockgenによるモック生成を高速化するツール bulkmockgenのご紹介 / Kyoto.go #43
utgwkk
2
2.4k
SPAでもデータをURLでシェアしたい / Kyoto.js 19
utgwkk
2
1.9k
Other Decks in Programming
See All in Programming
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
190
Introducing FrankenPHP gRPC
dunglas
1
620
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
240
より安全で効率的な Go コードへ: Protocol Buffers Opaque API の導入
shwatanap
3
920
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
Flutter with Dart MCP: All You Need - 박제창 2025 I/O Extended Busan
itsmedreamwalker
0
160
パフォーマンスチューニングで Web 技術を深掘り直す
progfay
5
1.4k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
420
Build your own WebP codec in Swift
kishikawakatsumi
1
160
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
4.9k
Playwrightはどのようにクロスブラウザをサポートしているのか
yotahada3
2
410
Android 16 × Jetpack Composeで縦書きテキストエディタを作ろう / Vertical Text Editor with Compose on Android 16
cc4966
2
290
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
GitHub's CSS Performance
jonrohan
1032
460k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Navigating Team Friction
lara
189
15k
Practical Orchestrator
shlominoach
190
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
820
Facilitating Awesome Meetings
lara
55
6.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Transcript
go test -json そして testing.T.Attr id:utgwkk / @utgwkk (うたがわきき) 2025/8/31
Kyoto.go #63 オフラインLT会@マネフォ京都 #kyotogo 1
自己紹介 • うたがわきき (@utgwkk) • 株式会社はてな ◦ Webアプリケーションエンジニア • 好きなパッケージはreflect
• 最近はTypeScript書いてる 2
ここでアンケート • Goでテストを書いたことがある? • (挙手を促す) • 雰囲気わかりました 3
アジェンダ • go test -json について • testing.T.Attr について 4
アジェンダ • go test -json について • testing.T.Attr について 5
ここでアンケート • go testの-jsonオプションを知っている・ 使ったことがある? • (挙手を促す) • 雰囲気わかりました 6
go test -json • テストの出力をJSON形式で得られる • テスト結果をプログラマブルに解析・パース するのに便利 7
go test -v 8 === RUN TestDummy --- PASS: TestDummy
(0.00s) PASS ok github.com/owner/repo 0.492s
go test -json {"Time":"2025-08-25T22:14:43.946504+09:00","Action":"start","Package":"github.com/owner/repo"} {"Time":"2025-08-25T22:14:44.522307+09:00","Action":"run","Package":"github.com/owner/repo","Test":"TestDummy "} {"Time":"2025-08-25T22:14:44.522455+09:00","Action":"output","Package":"github.com/owner/repo","Test":"TestDu mmy","Output":"=== RUN TestDummy\n"}
{"Time":"2025-08-25T22:14:44.522499+09:00","Action":"output","Package":"github.com/owner/repo","Test":"TestDu mmy","Output":"--- PASS: TestDummy (0.00s)\n"} {"Time":"2025-08-25T22:14:44.522507+09:00","Action":"pass","Package":"github.com/owner/repo","Test":"TestDumm y","Elapsed":0} {"Time":"2025-08-25T22:14:44.522513+09:00","Action":"output","Package":"github.com/owner/repo","Output":"PASS \n"} {"Time":"2025-08-25T22:14:44.522989+09:00","Action":"output","Package":"github.com/owner/repo","Output":"ok \tgithub.com/owner/repo\t0.576s\n"} {"Time":"2025-08-25T22:14:44.52587+09:00","Action":"pass","Package":"github.com/owner/repo","Elapsed":0.579} 9
雰囲気を嗅ぎ取る 10 • Actionに出力の種類が入っていそう ◦ start/run/output/pass/(fail) • Actionに応じて出力されるフィールドが変わ りそう ◦
Test/Output/Elapsed
ちゃんとしたドキュメント • https://pkg.go.dev/cmd/test2json • test2jsonというコマンドでログ→JSONの変 換だけを行うこともできる ◦ cat output.log |
go tool test2json 11
go test -jsonの大まかな実装 • テストのログを1行ずつパースしている ◦ === RUN TestDummy ◦
--- PASS: TestDummy (0.00s) • cmd/internal/test2json 以下に実装がある 12
go test -jsonの活用方法 • テストの実行結果を分かりやすく表示する ◦ mfridman/tparse ◦ gotestyourself/gotestsum 13
mfridman/tparse 14 画像は mfridman/tparse のREADMEから引用
15 画像は mfridman/tparse のREADMEから引用
16 画像は gotestyourself/gotestsum のREADMEから引用
小まとめ (go test -json) • go testコマンドに-jsonオプションを渡すこ とでテストの結果をJSON形式で出力できる • go
test -jsonの出力をパースして整形する ツールがある 17
アジェンダ • go test -json について • testing.T.Attr について 18
Go 1.25 is released • 👏🎉👏 • (ここで拍手) 19
リリースノートを見る • いろいろ増えたり変わったりしてますね • そんな中、ふと目に入った新機能が…… 20
ふと目に入った新機能 >The new methods T.Attr, B.Attr, and F.Attr emit an
attribute to the test log. An attribute is an arbitrary key and value associated with a test. https://go.dev/doc/go1.25#testingpkgtesting 21
これなに • 日本語の記事がぜんぜん出てこない • リリースノートの翻訳よりも深い情報が見つ からない 22
ググったら自分のCosenseが出てくる • なかなか情報量が増えない • 助けてくれ 23
たぶん最も詳しい日本語情報 • 近頃の気になるGo testingパッケージ - Speaker Deck • CA.go#16 LT大会
の実況ログからたどって何 とかたどり着いた ◦ https://x.com/0xjj_official/status/1940000781 283074204 24
自分なりに調査してみる • Attrっていうメソッドがあることは分かった • 何もわからない ◦ 生まれた経緯は? ◦ 使い方は? •
とりあえず自分の言葉でまとめ直してみる 25
proposal探す testing: structured output for test attributes #43936 26
モチベーション • go test -json によってGoのテストの出力を プログラマブルに解析・加工できて便利 • テストのログにメタデータを含められると もっと便利になるんじゃないか
27
要するに? • テストだって構造化ログにしたい • ってこと? ◦ 誰か教えて 28
proposalのタイムライン (ざっくり) • 2021/1/27 issueが起票される • 2023/7/20 議論が進みはじめる • 2023/11/2
Russ Coxによって現行のメソッドシグネ チャが提案される ◦ t.Attr(key, value string) • 2025/4/3 proposalが受理される • 2025/8/15 Go 1.25がリリースされる 29
制約 • Attr(key, value string) • keyは空白文字を含めない • valueは改行 (CR,
LF) を含めない • 出力される順序の規定はない 30
t.Log() との棲み分け • t.Log() のほうが人間には優しい ◦ ログを出力したコードの行番号つき ◦ だいたい何でも出力できる •
テストに対するメタデータを付与したいなら t.Attr() を使う 31
メタデータ is • いくつかユースケースが示されている ◦ テストのIDを埋め込む ◦ 外部ストレージに出力したログのURLを埋める • ツールとの連携が主なユースケース?
32
なぜ Attr(key string, value any) で はないのか • slogには Any(key
string, value any) という 関数があるけれども…… ◦ だいたい何でもログ出力できる 33
なぜ Attr(key string, value any) で はないのか • valueが任意の型だと、valueを文字列化 ・JSON
encodeする必要がある ◦ 全てのテストがencoding/jsonに依存するのは微妙 ◦ 必要なときだけJSON encodeする方がいい • (このあたりの議論をかいつまんだ) 34
Attrという語彙でピンと来た方へ • log/slogにはAttrという型がある ◦ 構造化ログのパラメータを表す • log/slogが導入された辺りでproposalの議論 が進みはじめた 35
proposalのタイムライン (ざっくり) • 2021/1/27 issueが起票される • 2023/7/20 議論が進みはじめる • 2023/11/2
Russ Coxによって現行のメソッドシグネ チャが提案される ◦ t.Attr(key, value string) • 2025/4/3 proposalが受理される • 2025/8/15 Go 1.25がリリースされる 36
proposalのタイムライン (ざっくり) • 2021/1/27 issueが起票される • 2023/3/16 log/slogのproposalが受理される • 2023/7/20
議論が進みはじめる • 2023/11/2 Russ Coxによって現行のメソッドシグネ チャが提案される ◦ t.Attr(key, value string) • 2025/4/3 proposalが受理される • 2025/8/15 Go 1.25がリリースされる 37
小まとめ (testing.T.Attr) • Go 1.25 でtesting.T,B,FにAttrメソッドが追 加された ◦ テストのログに構造化されたメタデータを埋めること ができる
• 利用方法はこちらに委ねられていそう ◦ テスト結果をパースするツールでうまく使われる? 38
まとめ • proposalの議論を追うとおもしろい ◦ 慎重に議論が進められていることが分かる • なぜこういうインターフェスなのか、その答 えはproposalにあるかもしれない ◦ 謎が深まることもあるかもしれない
39
参考 • test2json command - cmd/test2json - Go Packages •
Go 1.25 is released - The Go Programming Language • Go 1.25 Release Notes - The Go Programming Language • 近頃の気になるGo testingパッケージ - Speaker Deck • testing: structured output for test attributes #43936 • log/slog: structured, leveled logging #56345 40
おまけ (AI活用事例) • NotebookLMにGitHubのissueをソースとし て渡す ◦ URLを渡すよりも、GitHub APIでissueコメントを全 取得して渡すほうが精度が高い ◦
Web UI上では省略されているコメントに大事なこと が書いてありがち 41
おまけ (AI活用事例) https://notebooklm.google.com/notebook/ c63be61a-6547-40e7-870f-8326f99b417d 42
おまけ (AI活用事例) • NotebookLMの答えが正しいかどうかは自分 の目で確かめよう ◦ 最終的には人間が英語を読む 43
おまけ (AI活用事例) • GitHub公式のMCPサーバー実装がありそう ◦ https://github.com/github/github-mcp-server ◦ これを使うと手作業でissueコメントを取ってくるの すら不要になるのでは 44