Upgrade to Pro — share decks privately, control downloads, hide ads and more …

go test -json そして testing.T.Attr / Kyoto.go #63

go test -json そして testing.T.Attr / Kyoto.go #63

Kyoto.go #63 オフラインLT会@マネフォ京都
https://kyotogo.connpass.com/event/363034/

Avatar for utagawa kiki

utagawa kiki

August 31, 2025
Tweet

More Decks by utagawa kiki

Other Decks in Programming

Transcript

  1. go test -json そして testing.T.Attr id:utgwkk / @utgwkk (うたがわきき) 2025/8/31

    Kyoto.go #63 オフラインLT会@マネフォ京都 #kyotogo 1
  2. go test -v 8 === RUN TestDummy --- PASS: TestDummy

    (0.00s) PASS ok github.com/owner/repo 0.492s
  3. 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
  4. go test -jsonの大まかな実装 • テストのログを1行ずつパースしている ◦ === RUN TestDummy ◦

    --- PASS: TestDummy (0.00s) • cmd/internal/test2json 以下に実装がある 12
  5. ふと目に入った新機能 >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
  6. たぶん最も詳しい日本語情報 • 近頃の気になるGo testingパッケージ - Speaker Deck • CA.go#16 LT大会

    の実況ログからたどって何 とかたどり着いた ◦ https://x.com/0xjj_official/status/1940000781 283074204 24
  7. 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
  8. 制約 • Attr(key, value string) • keyは空白文字を含めない • valueは改行 (CR,

    LF) を含めない • 出力される順序の規定はない 30
  9. なぜ Attr(key string, value any) で はないのか • slogには Any(key

    string, value any) という 関数があるけれども…… ◦ だいたい何でもログ出力できる 33
  10. なぜ Attr(key string, value any) で はないのか • valueが任意の型だと、valueを文字列化 ・JSON

    encodeする必要がある ◦ 全てのテストがencoding/jsonに依存するのは微妙 ◦ 必要なときだけJSON encodeする方がいい • (このあたりの議論をかいつまんだ) 34
  11. 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
  12. 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
  13. 小まとめ (testing.T.Attr) • Go 1.25 でtesting.T,B,FにAttrメソッドが追 加された ◦ テストのログに構造化されたメタデータを埋めること ができる

    • 利用方法はこちらに委ねられていそう ◦ テスト結果をパースするツールでうまく使われる? 38
  14. 参考 • 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