Slide 1

Slide 1 text

Golangのデータベーステ ストフィクスチャ作成 マグロ

Slide 2

Slide 2 text

自己紹介 • 名前:マグロ/佐々木陽貴 • 所属:日本大学工学部情報工学科B4/24卒 • 分野:Webサーバーサイド/Python/Golang • X(旧Twitter):@sigumataityouda

Slide 3

Slide 3 text

突然ですが、、、、、、

Slide 4

Slide 4 text

テストコード、書いてますか??

Slide 5

Slide 5 text

え?テストコードって何??

Slide 6

Slide 6 text

テストコードとは • プログラムが想定通り動くか確認するためのプログラムのこと 実装前に動作確認を行えるので、開発効率の向上やコードへの 理解が進まる つまり書けばお得

Slide 7

Slide 7 text

でも書くのが面倒!!

Slide 8

Slide 8 text

特にデータベース!!

Slide 9

Slide 9 text

データベースのテスト • (自分の推しを詰め込める)テーブルがあるとします。

Slide 10

Slide 10 text

データベースのテスト • 以下のようなデータをCRUDできるWebアプリを想定しテス トを組みます。

Slide 11

Slide 11 text

ここが面倒!! データベースに結果が反映されたまま

Slide 12

Slide 12 text

結果が反映されたまま • 登録のテスト 1回目は通っても2回 目はCOUNTで引っか かる 登録した値と個数が 一致しているかテス ト テスト前にDELETE するのもアリだが、 必要なデータも消し てしまうかも

Slide 13

Slide 13 text

ここが面倒!! 肥大化するSQL

Slide 14

Slide 14 text

肥大化するSQL • 読み取りを行う場合、事前にテーブルにデータを格納する必要 があるが、、、 登録のためSQLをテ ストコード内に書か なければならない 加えてsource_idは外 部キーのためsource を登録するSQLも書 かなければならない source_idは連番なのでSELECT で取り出す必要があり、 依存関係が増えるとさらに大変 に、、、

Slide 15

Slide 15 text

どうにかならないかな、、、?

Slide 16

Slide 16 text

内定者インターンスタート そこであるものを知る

Slide 17

Slide 17 text

フィクスチャ作成 • フィクスチャとは テストの実行前後で行いたい前処理や後処理を記述するための 関数 データベースのテストで結構多用されるらしい Golangで実装してみよう

Slide 18

Slide 18 text

ロールバック • ロールバックを使用することで、テストで行われた操作をな かったことにできる テストコード データベース 登録 取得 カグラとアイマスのキャラね ロールバック 誰それ??? 取得 登録したデータはな くなるため、何度テ ストしても同じ結果 が返ってくるように なる

Slide 19

Slide 19 text

ロールバック Golangには標準ライブラリでデータベースを操作でき、トラン ザクション処理を行うことができる しかし本番での競合状態を避けるため、テストのみトランザク ション使用 DBとTxに型の互換がないため、新たにDriver構造体を宣言し、 独自の型を作成

Slide 20

Slide 20 text

フィクスチャ • データベースのテーブルの型とテストに使用するテーブルを宣 言

Slide 21

Slide 21 text

フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する テーブルに入れ るデフォルトの 値

Slide 22

Slide 22 text

フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する Insertする分だけ テーブルに入れる []funcの形で代 入し、上書きも 可能

Slide 23

Slide 23 text

フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する テーブルに入れ た値を挿入 テストコード内 で参照が可能

Slide 24

Slide 24 text

フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する 外部キーがある場合 同じ値を代入 Source_idを自動的に 登録してくれる

Slide 25

Slide 25 text

フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する 登録 連番のidを返してくれ る

Slide 26

Slide 26 text

フィクスチャ • あとは順番通りに実行させるように組み込み、、、

Slide 27

Slide 27 text

フィクスチャ • データベースのテストデータを 簡単に用意できるように!!!

Slide 28

Slide 28 text

まとめ • データベースのテストにはロールバックを使おう • フィクスチャを作れば楽にテストデータを用意できる • それと雪泉と四条貴音はいいぞ!!!!!!

Slide 29

Slide 29 text

(一応)今回のコードと参考リンク • コード https://github.com/maguro-alternative/goheki • 参考(ほぼ丸パクリ)リンク https://engineering.mercari.com/blog/entry/20220411- 42fc0ba69c/