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
97
Golangのデータベーステストフィクスチャ作成
雪泉はかわいいぞ
お姫ちんはいいぞ
マグロ隊長kinTV
February 23, 2024
Tweet
Share
More Decks by マグロ隊長kinTV
See All by マグロ隊長kinTV
DiscordとLINEをPython+FastAPI+Dockerで連携させる
maguroalternative
0
210
就活体験記
maguroalternative
0
91
LINEBotCourse.pdf
maguroalternative
0
190
カプコンのカンファレンスいった話
maguroalternative
0
110
22年度新歓LT
maguroalternative
0
88
jackさん合同LT
maguroalternative
0
49
21年度新歓LT
maguroalternative
0
39
DiscordとLINE連携した
maguroalternative
1
2k
Discordで世界変えた
maguroalternative
0
170
Other Decks in Technology
See All in Technology
エンジニア候補者向け資料2024.04.24.pdf
macloud
0
3.4k
One engineer company with Ruby on Rails
rstankov
2
450
M5stackで使用できるpHセンサの開発
shinrinakamura
0
260
Gradle Build Scanを使ってビルドのことを知ろう potatotips #87
tomorrowkey
2
160
競技としてのKaggle、役に立つKaggle
yu4u
7
2.5k
コードや知識を組み込む / Incorporate Code and knowledge
ks91
PRO
0
150
How to Lead? Testimonial of a Lead Android Engineer
oleur
1
120
Gitlab本から学んだこと - そーだいなるプレイバック / gitlab-book
soudai
7
1.4k
IaCジェネレーターとBedrockで詳細設計書を生成してみた
tsukasa_ishimaru
4
940
さらばあのボタンとは言わせない SORACOM LTE-M Button powerd by AWSをまだ使えるようにした(前編?)
miura55
0
100
EM完全に理解した と思ったけど、 やっぱり何も分からなかった話 / EM Night Fukuoka #1
hirutas
0
300
Autonomous Database Cloud 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
15
35k
Featured
See All Featured
Music & Morning Musume
bryan
41
5.6k
A Philosophy of Restraint
colly
197
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
358
22k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
22
1.6k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
Building Adaptive Systems
keathley
32
1.9k
How to train your dragon (web standard)
notwaldorf
75
5.2k
We Have a Design System, Now What?
morganepeng
43
6.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
0
30
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Unsuck your backbone
ammeep
664
57k
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/