Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
testdata ディレクトリを活用しよう!
Search
uji
December 01, 2025
500
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
testdata ディレクトリを活用しよう!
uji
December 01, 2025
More Decks by uji
See All by uji
【Go ハンズオン】Windows / Linux コマンドを Go で再現
uji
1
130
MCP 公式の Go SDK で QA データ登録アシスタントを作ってみた
uji
0
190
Green Tea GCの動作を紙芝居にしてみる
uji
1
230
Go Proverbs の紹介
uji
2
240
Go標準の暗号ライブラリメンテナンス戦略
uji
3
780
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
280
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
330
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
830
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
1.1k
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
How to make the Groovebox
asonas
2
2.5k
Into the Great Unknown - MozCon
thekraken
41
2.8k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
320
Everyday Curiosity
cassininazir
0
350
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
A Soul's Torment
seathinner
8
3.7k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
510
We Have a Design System, Now What?
morganepeng
55
8.4k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Transcript
© NOT A HOTEL, Inc. testdata ディレクトリを活用しよう! 2025-12-03 明日から使えるgo test実践テクニック集
#go_findy 1 NOT A HOTEL株式会社 uji
© NOT A HOTEL, Inc. 自己紹介 uji @uji_rb 神戸市在住 NOT
A HOTEL 所属 Gopher 7年生 KOBE.go, Kyoto.go 運営 Kyoto.go KOBE.go
© NOT A HOTEL, Inc.
© NOT A HOTEL, Inc. © NOT A HOTEL, Inc.
testdata 活用 Tips を3つ紹介 4
© NOT A HOTEL, Inc. testdata とは? • テストに利用する補助データを 置いておくことができるディレクトリ
• Go ツールはビルドなどからは testdata と命名された ディレクトリは無視されるので安全(doc) ◦ 中に .go ファイルがあってもビルド対象にならない
© NOT A HOTEL, Inc. 何が嬉しい? • 入出力データや状態が複雑になるテストの 可読性や保守性を上げられる •
Table Driven Test でも可読性や保守性を 高くしきれない場面で有効。 テストケースと検証ロジックの分離度がさらに上がる
© NOT A HOTEL, Inc. 基本的な使い方 • 任意の場所に testdata ディレクトリを作成
• テストで利用するファイルを用意 • 標準 pkg でテストコードからファイルを読み取り ◦ os.Open(“testdata/xxx.png”) や embed など • src/image/testdata など golang/go でも実例がたくさん
© NOT A HOTEL, Inc. © NOT A HOTEL, Inc.
Tips 1 Golden Test に利用する 8
© NOT A HOTEL, Inc. Golden Test とは? • テスト対象の出力結果を事前に保存された
“Golden” ファイル と比較するテスト手法 • コードの変更した際、意図しない変更や 回帰がないかを検証するために特に有用 • “Golden” は、 「黄金の価値がある」「非常に信頼性の高い」という意味合いが由来
© NOT A HOTEL, Inc. Golden Test の書き方 • Golden
ファイルを testdata に格納し読み書き • flag パッケージを活用することで、 Golden ファイルの生成機構も簡単に用意できる
© NOT A HOTEL, Inc. golang/go/src/go/doc/doc_test.go の例 var update =
flag.Bool("update", false, "update golden (.out) files") ... func test(t *testing.T, mode Mode) { ... for _, pkg := range pkgs { t.Run(pkg.Name, func(t *testing.T) { ... // Golden ファイルのupdate golden := filepath.Join(dataDir, fmt.Sprintf("%s.%d.golden", pkg.Name, mode)) if *update { err := os.WriteFile(golden, got, 0644) if err != nil { t.Fatal(err) } } // Golden ファイルの取得 want, err := os.ReadFile(golden) if err != nil { t.Fatal(err) } // 検証 ...
© NOT A HOTEL, Inc. golang/go/src/go/doc/doc_test.go の例 var update =
flag.Bool("update", false, "update golden (.out) files") ... func test(t *testing.T, mode Mode) { ... for _, pkg := range pkgs { t.Run(pkg.Name, func(t *testing.T) { ... // Golden ファイルのupdate golden := filepath.Join(dataDir, fmt.Sprintf("%s.%d.golden", pkg.Name, mode)) if *update { err := os.WriteFile(golden, got, 0644) if err != nil { t.Fatal(err) } } // Golden ファイルの取得 want, err := os.ReadFile(golden) if err != nil { t.Fatal(err) } // 検証 ... flag パッケージで変数を宣言
© NOT A HOTEL, Inc. golang/go/src/go/doc/doc_test.go の例 var update =
flag.Bool("update", false, "update golden (.out) files") ... func test(t *testing.T, mode Mode) { ... for _, pkg := range pkgs { t.Run(pkg.Name, func(t *testing.T) { ... // Golden ファイルのupdate golden := filepath.Join(dataDir, fmt.Sprintf("%s.%d.golden", pkg.Name, mode)) if *update { err := os.WriteFile(golden, got, 0644) if err != nil { t.Fatal(err) } } // Golden ファイルの取得 want, err := os.ReadFile(golden) if err != nil { t.Fatal(err) } // 検証 ... flag 変数で条件分岐
© NOT A HOTEL, Inc. • go test で生成されるテストバイナリは、 内部で
flag.Parse() を呼び出している (code) • フラグ変数をグローバル変数として定義すれば、 go test -update などでテストに値を渡すことができる
© NOT A HOTEL, Inc. © NOT A HOTEL, Inc.
Tips 2 txtar 形式を活用する 15
© NOT A HOTEL, Inc. • Go 言語のエコシステム内で利用される、 アーカイブ形式の一つ •
複数のファイルの内容を単一のテキストファイルに まとめて表現するための形式 txtar とは?
© NOT A HOTEL, Inc. 複数ファイルを 見やすく、シンプルに表現
© NOT A HOTEL, Inc. Go PlayGround でもサポート
© NOT A HOTEL, Inc. • golang.org/x/tools/txtar でライブラリが サポートされている ◦
例えば txtar.Parse() で簡単に複数ファイルを取得可能 • 活用例 ◦ テストの入力・出力をセットで扱う ◦ ファイルシステムの状態を表現 txtar の活用方法
© NOT A HOTEL, Inc. © NOT A HOTEL, Inc.
Tips 3 script-based test で利用する 20
© NOT A HOTEL, Inc. • テストケースをスクリプト (手順と期待結果を記述した文書)で記述するテスト • Go公式の
cmd/go のテストでもヘビーに利用 ◦ Russ Cox 氏により、 internal package で独自の スクリプト言語が実装されている(README) • testdata でテストスクリプトを管理している script-based test とは?
© NOT A HOTEL, Inc. src/cmd/go/testdata/script/test_status.txt の例 env GO111MODULE=off !
go test x y stdout ^FAIL\s+x stdout ^ok\s+y stdout (?-m)FAIL\n$ -- x/x_test.go -- package x import "testing" func TestNothingJustFail(t *testing.T) { t.Fail() } -- y/y_test.go -- package y このファイルを scripttest.Run() に渡すと テストが動作 src/cmd/go/script_test.go#L40
© NOT A HOTEL, Inc. • Go で使われているスクリプト言語を利用するためのライ ブラリは github.com/rsc/script
にて Russ Cox 氏が公開 • 別の記述スタイルが欲しければ自作するのもアリ…? ◦ 多様なパターンをテストしたい場合はコストに見合う価値はあるかも 同じように script-based test を書くには
© NOT A HOTEL, Inc. 他にも testdata 活用 Tips があれば是非
#go_findy で教えてください! 参考文献 • research!rsc: Go Testing By Example https://research.swtch.com/testing • Bitfield Consulting: Flipping the script: a smarter way to test Go binaries https://bitfieldconsulting.com/posts/test-scripts