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
Tests in Go
Search
Yunosuke Yamada
October 16, 2022
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Tests in Go
Yunosuke Yamada
October 16, 2022
More Decks by Yunosuke Yamada
See All by Yunosuke Yamada
AI時代に成長するエンジニアに必要なスキルとは.pdf
yunosukey
0
210
Gemini CLIでもセキュアで堅牢な開発をしたい!
yunosukey
1
620
DevOps/MLOpsに学ぶエージェントの可観測性
yunosukey
1
1.2k
Agent Development Kitで作るマルチエージェントアプリケーション(AIAgent勉強会)
yunosukey
4
1.7k
Agent Development Kitで作るマルチエージェントアプリケーション(GCNT2025)
yunosukey
0
81
AIエージェントのオブザーバビリティについて
yunosukey
1
910
OpenTelemetry + LLM = OpenLLMetry!?
yunosukey
2
1.1k
クラウド開発環境Cloud Workstationsの紹介
yunosukey
0
460
フロントエンドオブザーバビリティ on Google Cloud
yunosukey
1
370
Other Decks in Programming
See All in Programming
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
150
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
310
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
110
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
840
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
190
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
250
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
130
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.4k
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Fireside Chat
paigeccino
42
4k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
We Have a Design System, Now What?
morganepeng
55
8.2k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
Test your architecture with Archunit
thirion
1
2.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
390
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
Making the Leap to Tech Lead
cromwellryan
135
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
180
Transcript
テストについて Golang編 2022/03/24 山田悠之介
テスト テストは大事。 自動テストで担保できる部分に関しては 自動テストをしなくてはいけない。 業務ではフロントエンドのテストについて勉強していたが、 バックエンドのテストが気になったので調べてみた。 2
目次 1. 普通のテスト 2. API のテスト 3. DB のテスト 3
interface と struct Go では interface を struct で実装することで オブジェクト指向のコードが書ける。
4
type Repository interface { FindAllTodos() ([]Todo, error) } type repository
struct { db *sql.DB } func (r repository) FindAllTodos() ([]Todo, error) { ... } // 返り値が Repository にできている func NewRepository(db *sql.DB) Repository { return repository{db} } 5
interface と struct ただしクラスベースのオブジェクト指向ではない。 struct は継承ができず、委譲を強制する言語設計になっている。 6
DB アクセスを Repository へ移譲する type UseCase interface { GetTodos() ([]Todo,
error) } type useCase struct { repoitory Repository } func NewTodoUseCase(repoitory Repository) UseCase { return useCase{ repoitory, } } func (u useCase) GetTodos() ([]Todo, error) { return u.repoitory.FindAllTodos() } 7
interface のモック Go には interface のモックを生成する仕組みが公式である (gomock)。 DI などと合わせて使えばテストでは委譲先をモックし、 今テストしたい
struct だけをテストすることができる。 mockgen -source=repository.go -destination=mock/mock_repository.go 8
mock を使ったテスト func TestGetTodos(t *testing.T) { mockRet := []model.Todo{{ID: 1,
Content: "Todo1"}} // mock 生成 ctrl := gomock.NewController(t) defer ctrl.Finish() mock := mock_repository.NewMockRepository(ctrl) // 期待する振る舞いを設定 mock.EXPECT().FindAllTodos().Return(mockRet, nil) // 注入 usecase := NewUseCase(mock) actual, _ := usecase.GetTodos() assert.Equal(t, mockRet, actual) } 9
API のテスト 10
DB のテスト Go に限った話ではないがいくつか方法がある mock を使う方法 比較的簡単だが、DB を使ったときに本当に動くかは分からない。 ORM を使う場合は生成される
SQL を再現しないといけないかも。 軽量な DB を使う(割愛) 実際の DB を使う方法 mock の逆で、初期化と後処理の方法を考える必要がある。 11
go-txdb 後処理はテスト中の DB 操作をトランザクションにして、 テストケースが完了したらロールバックすれば良い。 go-txdb というライブラリを使うとコネクションを Close するだけで Open
してからの操作をロールバック してくれる。 12
func TestCreateTodo(t *testing.T) { txdb.Register("find_all_todos", "mysql", "dsn") db, _ :=
sql.Open("find_all_todos", "dsn") defer db.Close() // 最後に閉じてロールバック repo := NewRepository(db) actual, _ := repo.CreateTodo("todo4") assert.Equal(t, &model.Todo{ID: 4, Content: "todo4"}, actual) todos, _ := repo.FindAllTodos() assert.Equal(t, 4, len(todos)) } 13