Slide 1

Slide 1 text

Goと テスト と インプロセスDB Go Conference mini 2023 Winter IN KYOTO

Slide 2

Slide 2 text

自己紹介 牧内大輔(MakKi, makki_d) KLab株式会社 エンジニアリング本部 サーバサイドエキスパートグループ GitHub: makiuchi-d Twitter(X): makki_d

Slide 3

Slide 3 text

テスト

Slide 4

Slide 4 text

go test

Slide 5

Slide 5 text

DBアクセスする ロジックのテスト

Slide 6

Slide 6 text

リポジトリパターン DBへのクエリとその他のロジックを分離 👍 ロジック部分はテスト可能 👎 クエリ自体はテストできない

Slide 7

Slide 7 text

DBをモックにする github.com/DATA-DOG/go-sqlmock など 予期するクエリとレスポンスを登録して利用 👍 sql.DBを置き換えるだけ 👎 クエリが変化するとテストも作り直し

Slide 8

Slide 8 text

本物のDBを使う ローカルに建てたりDockerを使ったり 👍 DB機能をすべて使える 👎 外部に依存してしまう 👎 Dockerどうやってインストールする?

Slide 9

Slide 9 text

SQLiteを使う 同一プロセス内で動くDB 👍 外部に依存しない 👍ピュアGo実装もあってポータブル 👎 SQLの方言

Slide 10

Slide 10 text

SQL方言に対応 ピュアGo インプロセスDB

Slide 11

Slide 11 text

そんなDBが……あった MySQL github.com/dolthub/go-mysql-server PostgreSQL github.com/proullon/ramsql 👍 SQL方言使えてピュアGoでインプロセスなDB 👎 機能が完全ではない(トランザクション使えないなど)

Slide 12

Slide 12 text

ピュアGoのメリット大 ミドルウェアの書きやすさ

Slide 13

Slide 13 text

go-mysql-server インプロセスDBとして 使ってみた

Slide 14

Slide 14 text

いろいろ動かない unsignedなカラムをselectするとpanic (#1890) []byteをbindするとエラー (#1906) なおしました

Slide 15

Slide 15 text

またいろいろ動かない time.Timeがbindできない (#2050) CREATE TABLEできない (#2062) なおしました

Slide 16

Slide 16 text

テストで使いやすくするラッパー github.com/makiuchi-d/testdb つくりました db := testdb.New("my_test_db") db.Exec(`CREATE TABLE people ( id integer NOT NULL AUTO_INCREMENT, name varchar(128) NOT NULL, PRIMARY KEY (id) )`) sqlInsert := `INSERT INTO people (id, name) VALUES (?, ?)` db.Exec(sqlInsert, 1, "Alice") db.Exec(sqlInsert, 2, "Bob") db.Exec(sqlInsert, 3, "Carol") rows, _ := db.Query(`SELECT id, name FROM people`) defer rows.Close() for rows.Next() { var id int var name string rows.Scan(&id, &name) fmt.Println(id, name) }

Slide 17

Slide 17 text

DBアクセスするロジックも テストしていきましょう