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
Golangのデータベーステストフィクスチャ作成
Search
マグロ隊長kinTV
February 23, 2024
Technology
0
320
Golangのデータベーステストフィクスチャ作成
雪泉はかわいいぞ
お姫ちんはいいぞ
マグロ隊長kinTV
February 23, 2024
Tweet
Share
More Decks by マグロ隊長kinTV
See All by マグロ隊長kinTV
UDDのすすめ
maguroalternative
0
840
LINE Works Bot入門
maguroalternative
0
54
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
73
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
110
DiscordとLINEをPython+FastAPI+Dockerで連携させる
maguroalternative
0
370
就活体験記
maguroalternative
0
130
LINEBotCourse.pdf
maguroalternative
0
230
カプコンのカンファレンスいった話
maguroalternative
0
220
22年度新歓LT
maguroalternative
0
100
Other Decks in Technology
See All in Technology
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
coconala_engineer
1
210
20250328_OpenAI製DeepResearchは既に一種のAGIだと思う話
doradora09
PRO
0
190
近年の PyCon 情勢から見た PyCon APAC のまとめ
terapyon
0
280
MCP Documentation Server @AI Coding Meetup #1
yyoshiki41
2
2.5k
試験は暗記より理解 〜効果的な試験勉強とその後への活かし方〜
fukazawashun
0
280
OPENLOGI Company Profile for engineer
hr01
1
23k
やさしいMCP入門
minorun365
PRO
144
90k
Amazon S3 Tables + Amazon Athena / Apache Iceberg
okaru
0
210
Vision Language Modelを活用した メルカリの類似画像レコメンドの性能改善
yadayuki
9
1.4k
Webアプリを Lambdaで動かすまでに考えること / How to implement monolithic Lambda Web Application
_kensh
7
1k
改めて学ぶ Trait の使い方 / phpcon odawara 2025
meihei3
1
400
Lightdashの利活用状況 ー導入から2年経った現在地_20250409
hirokiigeta
2
260
Featured
See All Featured
Bash Introduction
62gerente
611
210k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
What's in a price? How to price your products and services
michaelherold
245
12k
For a Future-Friendly Web
brad_frost
176
9.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
177
52k
The Cult of Friendly URLs
andyhume
78
6.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Producing Creativity
orderedlist
PRO
344
40k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
Transcript
Golangのデータベーステ ストフィクスチャ作成 マグロ
自己紹介 • 名前:マグロ/佐々木陽貴 • 所属:日本大学工学部情報工学科B4/24卒 • 分野:Webサーバーサイド/Python/Golang • X(旧Twitter):@sigumataityouda
突然ですが、、、、、、
テストコード、書いてますか??
え?テストコードって何??
テストコードとは • プログラムが想定通り動くか確認するためのプログラムのこと 実装前に動作確認を行えるので、開発効率の向上やコードへの 理解が進まる つまり書けばお得
でも書くのが面倒!!
特にデータベース!!
データベースのテスト • (自分の推しを詰め込める)テーブルがあるとします。
データベースのテスト • 以下のようなデータをCRUDできるWebアプリを想定しテス トを組みます。
ここが面倒!! データベースに結果が反映されたまま
結果が反映されたまま • 登録のテスト 1回目は通っても2回 目はCOUNTで引っか かる 登録した値と個数が 一致しているかテス ト テスト前にDELETE
するのもアリだが、 必要なデータも消し てしまうかも
ここが面倒!! 肥大化するSQL
肥大化するSQL • 読み取りを行う場合、事前にテーブルにデータを格納する必要 があるが、、、 登録のためSQLをテ ストコード内に書か なければならない 加えてsource_idは外 部キーのためsource を登録するSQLも書
かなければならない source_idは連番なのでSELECT で取り出す必要があり、 依存関係が増えるとさらに大変 に、、、
どうにかならないかな、、、?
内定者インターンスタート そこであるものを知る
フィクスチャ作成 • フィクスチャとは テストの実行前後で行いたい前処理や後処理を記述するための 関数 データベースのテストで結構多用されるらしい Golangで実装してみよう
ロールバック • ロールバックを使用することで、テストで行われた操作をな かったことにできる テストコード データベース 登録 取得 カグラとアイマスのキャラね ロールバック
誰それ??? 取得 登録したデータはな くなるため、何度テ ストしても同じ結果 が返ってくるように なる
ロールバック Golangには標準ライブラリでデータベースを操作でき、トラン ザクション処理を行うことができる しかし本番での競合状態を避けるため、テストのみトランザク ション使用 DBとTxに型の互換がないため、新たにDriver構造体を宣言し、 独自の型を作成
フィクスチャ • データベースのテーブルの型とテストに使用するテーブルを宣 言
フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する テーブルに入れ るデフォルトの 値
フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する Insertする分だけ テーブルに入れる []funcの形で代 入し、上書きも 可能
フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する テーブルに入れ た値を挿入 テストコード内 で参照が可能
フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する 外部キーがある場合 同じ値を代入 Source_idを自動的に 登録してくれる
フィクスチャ • ModelConnector宣言 データベースのモデルと操作、他のモデルとの関連を記述する 登録 連番のidを返してくれ る
フィクスチャ • あとは順番通りに実行させるように組み込み、、、
フィクスチャ • データベースのテストデータを 簡単に用意できるように!!!
まとめ • データベースのテストにはロールバックを使おう • フィクスチャを作れば楽にテストデータを用意できる • それと雪泉と四条貴音はいいぞ!!!!!!
(一応)今回のコードと参考リンク • コード https://github.com/maguro-alternative/goheki • 参考(ほぼ丸パクリ)リンク https://engineering.mercari.com/blog/entry/20220411- 42fc0ba69c/