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
97
1
Share
DBアクセスを伴う自動テストを書くときのプラクティス/Practices When Writing Automated Tests with DB Access
yukana
September 26, 2024
More Decks by yukana
See All by yukana
Gradleよくわからんから脱する/Gradle Getting Started
yukana
0
84
Nice to haveな気づきに向き合う / Facing Nice to Have Awareness
yukana
1
58
ユニットテスト実行を 45% 高速化した Repository テスト戦略 / Repository Test Strategy Speeds up Unit Test
yukana
5
2k
Other Decks in Programming
See All in Programming
ECR拡張スキャンでSBOMを収集して サプライチェーン攻撃の影響調査を 爆速で終わらせてみた
akihisaikeda
2
210
デフォルト運用のCodeRabbit、1年で何が変わったか / How CodeRabbit Changed Our Code Review in 1 Year
bake0937
1
110
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
430
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
1.4k
初めてのRubyKaigiはこう見えた
jellyfish700
0
270
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
660
GitHub Copilot CLIのいいところ
htkym
2
1.2k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.2k
oxlintはeslint/typescript-eslintを置き換えられるのか
shomafujita
2
280
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
310
バックエンドにElysiaJSを採用して気付いた、良い点・悪い点
wanko_it
1
190
Zod v4 Codec でスキーマに型変換を埋め込む REST API 設計 #TSKaigi2026
ryutaro_yako
0
160
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
150
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
430
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
74k
Raft: Consensus for Rubyists
vanstee
141
7.5k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
My Coaching Mixtape
mlcsv
0
140
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
380
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