Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
DBアクセスを伴う結合テストを 書くときのプラクティス BABY JOB株式会社 第8回社内LT 2024/09/26 西牧 佑哉
Slide 2
Slide 2 text
大事なこと ● テストの環境を本番とできるだけ合わせる ○ テストの環境が本番と違っていると結果を信頼しづらくなる 2
Slide 3
Slide 3 text
テスト用DBのスキーマファイルを手動で管理しない 3
Slide 4
Slide 4 text
想定しているケース ● DBの変更履歴をマイグレーションファイルで管理している ● テスト用DBのセットアップのためにスキーマファイルを用意している 4
Slide 5
Slide 5 text
手動管理のデメリット ● マイグレーションファイルの内容に合わせて変更するのが面倒 ● ミスがあっても気づきづらい 5
Slide 6
Slide 6 text
どうするか? ● スキーマファイルを用意しない ○ テスト実行前にマイグレーションする ● 自動生成する(ダンプする) ○ マイグレーションに時間がかかる場合に有効 ○ マイグレーション後に必ずスキーマファイルが生成/更新される仕組みにしておくと常に最新 に保てる 6
Slide 7
Slide 7 text
インメモリDBを使用しない 7
Slide 8
Slide 8 text
想定しているケース ● ローカルではDockerで立てたDBを使用して開発している ● テストではSQLiteやH2のようなインメモリDBを使用している 8
Slide 9
Slide 9 text
インメモリDBを使用するメリデメ ● メリット ○ セットアップが簡単 ● デメリット ○ 本番環境やローカルでの動作確認時と異なる挙動をする可能性がある ■ つまり、テスト結果を信頼しづらい 9
Slide 10
Slide 10 text
どうするか? ● ローカルや本番と同じDBを使用する ○ Testcontainersを使うと簡単にできる! 10
Slide 11
Slide 11 text
テストの準備、実行、検証を 同一トランザクション上で行わない 11
Slide 12
Slide 12 text
想定しているケース ● テスト実行時の挙動 1. トランザクション開始 a. 準備(テスト用のデータのインサート) b. 実行(例:何らかの保存処理) c. 検証(例:DBからデータを取得して保存した内容の確認) 2. ロールバック 12
Slide 13
Slide 13 text
同一トランザクションで行うメリデメ ● メリット ○ テスト終了後にロールバックしてテストデータの後始末ができる ● デメリット ○ 本番では準備、実行、検証が同一トランザクション上で行われない ■ つまり、テストと本番でやっていることが異なる 13
Slide 14
Slide 14 text
どうするか? ● 各フェーズごとにトランザクションを分ける ● テストデータの後始末はテスト前に行うようにする ○ 他のテストに依存せずに、確実にクリーンアップできる 14
Slide 15
Slide 15 text
参考 ● 単体テストの考え方/使い方 15
Slide 16
Slide 16 text
まとめ ● テスト用DBのスキーマファイルを手動で管理しない ● インメモリDBを使用しない ● テストの準備、実行、検証を同一トランザクション上で行わない 16