Slide 1

Slide 1 text

tparseでgo testの出力を 見やすくする id:utgwkk / @utgwkk (うたがわきき) 2025/12/3 明日から使えるgo test実践テクニック集 1

Slide 2

Slide 2 text

自己紹介 ● うたがわきき (@utgwkk) ● 株式会社はてな ○ Webアプリケーションエンジニア ● 好きなパッケージはreflect 2

Slide 3

Slide 3 text

go testのいいところ ● 標準ライブラリ・ツールでテストできる ○ testingパッケージを使ってテストを書けばよい ○ go testコマンドを実行すればよい 3

Slide 4

Slide 4 text

go testのいまいちなところ ● どのテストが失敗したのか見づらい ○ サマリはいちおう表示されるが ○ テストが多くなってくると特に顕著 ○ -v オプションを付けると顕著 4

Slide 5

Slide 5 text

どこで落ちた? === RUN TestFoo main_test.go:8: Foo --- PASS: TestFoo (0.00s) === RUN TestBaz main_test.go:12: failed! --- FAIL: TestBaz (0.00s) === RUN TestBar --- PASS: TestBar (0.00s) FAIL exit status 1 FAIL github.com/owner/repo 0.228s 5

Slide 6

Slide 6 text

どこで落ちた? === RUN TestFoo main_test.go:8: Foo --- PASS: TestFoo (0.00s) === RUN TestBaz main_test.go:12: failed! --- FAIL: TestBaz (0.00s) === RUN TestBar --- PASS: TestBar (0.00s) FAIL exit status 1 FAIL github.com/owner/repo 0.228s 6

Slide 7

Slide 7 text

そこでtparse ● https://github.com/mfridman/tparse ● go testの出力を整形するツール 7

Slide 8

Slide 8 text

8 画像はREADMEより引用

Slide 9

Slide 9 text

9 画像はREADMEより引用

Slide 10

Slide 10 text

基本的な使い方 (1) set -o pipefail && go test ./... -json | tparse -all 10

Slide 11

Slide 11 text

基本的な使い方 (2) go test ./... -json > test.json tparse -all -file=test.json 11

Slide 12

Slide 12 text

CIでの注意事項 12 ● 異常終了したら以降のステップをskipする設定に なっていがち ○ テスト失敗するとtparseで整形されない!! ● 対策 ○ go testとtparseを1つのstepで実行する ○ go testが失敗しても後続のstepが実行されるようにする ■ GitHub Actionsならif: always()

Slide 13

Slide 13 text

GitHub ActionsのJob summaryを活用する ジョブの実行結果をMarkdown形式で整形・表示できる - run: | go test -v -json ./... | tee output.jsonl tparse -format markdown -file output.jsonl > $GITHUB_STEP_SUMMARY 13

Slide 14

Slide 14 text

14 tparseのCIの実行ログから引用

Slide 15

Slide 15 text

あわせて読みたい ● Goのテスト結果をtparseで整形する ・GitHub ActionsのJob Summaryと組み合 わせる - 私が歌川です 15

Slide 16

Slide 16 text

tparseの仕組み ● go test -jsonの出力をパースしている 16

Slide 17

Slide 17 text

go test -json ● テストの出力をJSON形式で得られる ● テスト結果をプログラマブルに解析・パース するのに便利 17

Slide 18

Slide 18 text

go test -v 18 === RUN TestDummy --- PASS: TestDummy (0.00s) PASS ok github.com/owner/repo 0.492s

Slide 19

Slide 19 text

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} 19

Slide 20

Slide 20 text

JSONのフィールド 20 ● Actionにイベントの種類が入る ○ start/run/output/pass/(fail) ● Actionに応じてJSONのフィールドが変わる

Slide 21

Slide 21 text

test2json ● https://pkg.go.dev/cmd/test2json ● test2jsonというコマンドでログ→JSONの変 換だけを行うこともできる ○ cat output.log | go tool test2json 21

Slide 22

Slide 22 text

あわせて読みたい ● go test -json そして testing.T.Attr 22

Slide 23

Slide 23 text

今日の発表のまとめ 23 ● tparseでgo testの結果を整形できる ● tparseはgo test -jsonの出力をパースする

Slide 24

Slide 24 text

株式会社はてなのエンジニア求人一覧 https://findy-code.io/companies/1096/jobs 24

Slide 25

Slide 25 text

hatena.co.jp/recruit 25 25

Slide 26

Slide 26 text

想定質問・時間が余ったとき用 ● set -o pipefailについて ● ツールの見つけ方 ● gotestsumとの比較 ● tparseが使われている様子を詳しく見たい 26

Slide 27

Slide 27 text

set -o pipefailについて (1) ● 通常、パイプをつなげたコマンドのうち最後 の終了コードが使われる ○ cmd1 | cmd2のうちcmd1が異常終了、cmd2が正常 終了した場合、cmd1 | cmd2は正常終了扱いになる 27

Slide 28

Slide 28 text

set -o pipefailについて (2) ● set -o pipefailを実行することで、この挙動を変更 できる ○ cmd1が異常終了したらcmd1 | cmd2も異常終了扱いになる ● 参考 ○ ネコでもわかる set ±o pipefail - Hirosaji Tech Blog 🍙 28

Slide 29

Slide 29 text

ツールの見つけ方 ● awesome-goを見る ○ https://github.com/avelino/awesome-go ● 会社で教えてもらう ● Goコミュニティで教えてもらう 29

Slide 30

Slide 30 text

gotestsumとの比較 (1) ● https://github.com/gotestyourself/gotestsum ● gotestsumのほうが多機能 ○ watchモードでテストできる ○ テスト終了後に実行するコマンドを指定できる ○ etc. ● tparseはテスト結果の整形に特化している 30

Slide 31

Slide 31 text

gotestsumとの比較 (2) ● シンプルであることの旨み ○ 実装を気軽に読める ○ 責務がはっきりしている ○ 最悪、脱出しやすい 31

Slide 32

Slide 32 text

tparseが使われている様子を詳しく見たい ● tparseのリポジトリのCIで使われている ○ GitHub Actions workflowの定義 ○ CIの実行ログ 32