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
DBアクセスを伴う自動テストを書くときのプラクティス/Practices When Writ...
Search
yukana
September 26, 2024
Programming
1
63
DBアクセスを伴う自動テストを書くときのプラクティス/Practices When Writing Automated Tests with DB Access
yukana
September 26, 2024
Tweet
Share
More Decks by yukana
See All by yukana
Gradleよくわからんから脱する/Gradle Getting Started
yukana
0
57
Nice to haveな気づきに向き合う / Facing Nice to Have Awareness
yukana
1
47
ユニットテスト実行を 45% 高速化した Repository テスト戦略 / Repository Test Strategy Speeds up Unit Test
yukana
5
1.8k
Other Decks in Programming
See All in Programming
Java_プロセスのメモリ監視の落とし穴_NMT_で見抜けない_glibc_キャッシュ問題_.pdf
ntt_dsol_java
0
230
Nitro v3
kazupon
2
320
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
2
390
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
6
8.6k
仕様がそのままテストになる!Javaで始める振る舞い駆動開発
ohmori_yusuke
8
4.6k
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
20
16k
スタートアップを支える技術戦略と組織づくり
pospome
8
11k
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
190
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
2.4k
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
110
Chart.jsで長い項目を表示するときのハマりどころ
yumechi
0
150
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
32
14k
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
The World Runs on Bad Software
bkeepers
PRO
72
12k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
118
20k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
340
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Agile that works and the tools we love
rasmusluckow
331
21k
Designing for Performance
lara
610
69k
Building an army of robots
kneath
306
46k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
980
Transcript
DBアクセスを伴う結合テストを 書くときのプラクティス BABY JOB株式会社 第8回社内LT 2024/09/26 西牧 佑哉
大事なこと • テストの環境を本番とできるだけ合わせる ◦ テストの環境が本番と違っていると結果を信頼しづらくなる 2
テスト用DBのスキーマファイルを手動で管理しない 3
想定しているケース • DBの変更履歴をマイグレーションファイルで管理している • テスト用DBのセットアップのためにスキーマファイルを用意している 4
手動管理のデメリット • マイグレーションファイルの内容に合わせて変更するのが面倒 • ミスがあっても気づきづらい 5
どうするか? • スキーマファイルを用意しない ◦ テスト実行前にマイグレーションする • 自動生成する(ダンプする) ◦ マイグレーションに時間がかかる場合に有効 ◦
マイグレーション後に必ずスキーマファイルが生成/更新される仕組みにしておくと常に最新 に保てる 6
インメモリDBを使用しない 7
想定しているケース • ローカルではDockerで立てたDBを使用して開発している • テストではSQLiteやH2のようなインメモリDBを使用している 8
インメモリDBを使用するメリデメ • メリット ◦ セットアップが簡単 • デメリット ◦ 本番環境やローカルでの動作確認時と異なる挙動をする可能性がある ▪
つまり、テスト結果を信頼しづらい 9
どうするか? • ローカルや本番と同じDBを使用する ◦ Testcontainersを使うと簡単にできる! 10
テストの準備、実行、検証を 同一トランザクション上で行わない 11
想定しているケース • テスト実行時の挙動 1. トランザクション開始 a. 準備(テスト用のデータのインサート) b. 実行(例:何らかの保存処理) c.
検証(例:DBからデータを取得して保存した内容の確認) 2. ロールバック 12
同一トランザクションで行うメリデメ • メリット ◦ テスト終了後にロールバックしてテストデータの後始末ができる • デメリット ◦ 本番では準備、実行、検証が同一トランザクション上で行われない ▪
つまり、テストと本番でやっていることが異なる 13
どうするか? • 各フェーズごとにトランザクションを分ける • テストデータの後始末はテスト前に行うようにする ◦ 他のテストに依存せずに、確実にクリーンアップできる 14
参考 • 単体テストの考え方/使い方 15
まとめ • テスト用DBのスキーマファイルを手動で管理しない • インメモリDBを使用しない • テストの準備、実行、検証を同一トランザクション上で行わない 16