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
480
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
180
Green Tea GCの動作を紙芝居にしてみる
uji
1
220
Go Proverbs の紹介
uji
2
230
Go標準の暗号ライブラリメンテナンス戦略
uji
3
780
NOT A HOTEL TECH TALK ーSOFTWARE 3.0への道筋ー NEXT Web3 (2024-08-07)
uji
0
270
マネーフォワード ME ブロックチェーン連携機能におけるGoの活用方法
uji
1
330
Goはブロックチェーン領域でなぜ使われ、どのように活躍しているのか
uji
1
820
標準パッケージ初のgenerics利用事例 "sync/atomic.Pointer"
uji
2
1.1k
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
We Are The Robots
honzajavorek
0
360
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Agile that works and the tools we love
rasmusluckow
331
22k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
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