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
Roomのマイグレーションをテストする方法
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Rakalute
January 31, 2024
Programming
5.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Roomのマイグレーションをテストする方法
Rakalute
January 31, 2024
Other Decks in Programming
See All in Programming
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
210
プロポーザルを書いてもらう
pvcresin
0
280
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.9k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
580
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
540
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
860
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
160
継続モナドとリアクティブプログラミング
yukikurage
3
690
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
How to Ace a Technical Interview
jacobian
281
24k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
Designing for Performance
lara
611
70k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Building Adaptive Systems
keathley
44
3.2k
Design in an AI World
tapps
1
270
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
360
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
780
Fireside Chat
paigeccino
42
4k
Transcript
Roomのマイグレーション をテストする方法
自己紹介 • 名前:若松 健斗 • 所属:DeNA SWETグループ ◦ Androidエンジニア •
アプリの設計を考えることが好き
今日話すこと • 業務で行なったマイグレーション • Roomのマイグレーションテストの基本 • 業務で作成したマイグレーションのテスト • まとめ
業務で行なったマイグレーション
マイグレーションを行った背景 独自に定義した型をそのまま保存 することができないので、Json形式 の文字列に変換する必要あり
マイグレーションを行った背景 難読化されないようにする設定が漏 れてしまった その結果、難読化の影響を受けた Jsonが生成された 難読化の影響を受けたJson 難読化ツールにProguardを使用している
マイグレーションを行った背景 • Proguardの難読化の影響を受けたJson形式のデータがDBに保存されている • Proguardのアルゴリズムが変更されると、DBからデータを読み込めなくなる可 能性がある id name age 1
{a: Taro, b: Tanaka} 20 1 {a: Hanako, b: Yamada} 34 1 {a: Jiro, b: Suzuki} 18 難読化の影響を受けたデータを含むテーブル データを難読化前の状態に 戻す必要がある
実施したマイグレーションの概要 Proguardで難読化された データを元に戻す マイグレーション前のデーターベース マイグレーション後のデーターベース id name age 1 {a:
Tanaka, b: Taro} 20 1 {a: Yamada, b: Hanako} 34 1 {a: Suzuki, b: Jiro} 18 id name age 1 {last_name : Tanaka, first_name: Taro} 20 1 {last_name: Yamada, first_name: Hanako} 34 1 {last_name: Suzuki, first_name: Jiro} 18 id name age 1 {a: Tanaka, b: Taro} 20 1 {a: Yamada, b: Hanako} 34 1 {a: Suzuki, b: Jiro} 18 テーブルA(UserEntity) テーブルA (紐づくEntityはなし) テーブルB(UserEntity)
実施したマイグレーションの概要 id name age 1 {a: Tanaka, b: Taro} 20
1 {a: Yamada, b: Hanako} 34 1 {a: Suzuki, b: Jiro} 18 id name age 1 {last_name : Tanaka, first_name: Taro} 20 1 {last_name: Yamada, first_name: Hanako} 34 1 {last_name: Suzuki, first_name: Jiro} 18 元のテーブルは残す id name age 1 {a: Tanaka, b: Taro} 20 1 {a: Yamada, b: Hanako} 34 1 {a: Suzuki, b: Jiro} 18 マイグレーション前のデーターベース マイグレーション後のデーターベース すぐにロールバックできる状態にし ておく テーブルA(UserEntity) テーブルA (紐づくEntityはなし) テーブルB(UserEntity)
マイグレーションのシナリオ • よくあるマイグレーションのシナリオ ◦ 新しいテーブルを追加 ◦ 既存のテーブルを削除 ◦ 既存のテーブルのスキーマを変更 •
今回のマイグレーションのシナリオ ◦ 新しいテーブルを追加する ◦ 既存のテーブルの値を元にレコードを生成する ◦ 生成したレコードを、新しいテーブルに追加する
Roomのマイグレーションテストの基本
事前準備(1/2) • スキーマをJSONファイルにエクスポートさせる設定 ◦ エクスポート先のパスを追加する
事前準備(2/2) • スキーマのJsonをテスト時にRoomが利用できるようにする設定 ◦ AndroidTestのアセットにJsonのパスを追加する
Roomのマイグレーションテストの基本的な流れ マイグレーションのテストコードのサンプル
Roomのマイグレーションテストの基本的な流れ MigrationTestHelperの生成 マイグレーションのテストコードのサンプル 古いスキーマのデータベース生成 やマイグレーションの実行を行う
Roomのマイグレーションテストの基本的な流れ 古いスキーマのDBを作成 SQLを使いテーブルにデータを追加 する マイグレーションのテストコードのサンプル
Roomのマイグレーションテストの基本的な流れ マイグレーションを実行する runMigrationsAndValidateでマイグ レーションの実行とスキーマの検証 を行う Entityに紐づいていないテーブルが データベース上に存在することを許 可しない場合 validateDroppedTablesをtrueにす る
マイグレーションのテストコードのサンプル
Roomのマイグレーションテストの基本的な流れ 値の検証を行う runMigrationsAndValidateではス キーマのチェックしか行わない マイグレーションのテストコードのサンプル
業務で作成したマイグレーションのテスト
作成したマイグレーションのテスト • 難読化されたデータを元に戻すロジックのテスト • データベースの振る舞いのテスト
作成したマイグレーションのテスト • 難読化されたデータを元に戻すロジックのテスト • データベースの振る舞いのテスト
難読化されたデータを元に戻すロジックとそのテスト 今回テストしたいロジック obfuscatedJsonがnullの場合にnull を返すこと obfuscatedJsonがnullでない場合に 難読化が解除された文字列を返すこ と テストコードの一例 難読化されたJson形式のデータを元に戻すロジック
難読化されたデータを元に戻すロジックとそのテスト テストコードの一例 難読化されたJson形式のデータを元に戻すロジック 単体テストを作成 値の変更ロジックは単体テスト可能 単体テストでカバーできる範囲を広げ ることで、テストにかかる労力や時間を 削減することができる
単体テストと統合テストの比較 単体テスト 統合テスト 単体テストの方が圧倒的に簡単 テストにかかる労力や時間を削減できる
作成したマイグレーションのテスト • 難読化されたデータを元に戻すロジックのテスト • データベースの振る舞いのテスト
データベースの振る舞いのテスト
データベースの振る舞いのテスト 古いスキーマのDBを準備 スキーマバージョン1のDBを用意して難 読化されたデータを追加
データベースの振る舞いのテスト マイグレーションを実行 難読化の影響を受けたデータを元に戻 すマイグレーションを実行する validateDroppedTablesをFalseに設定 しEntitiyに紐づかないテーブルの存在を 許容してもらえるようにする
データベースの振る舞いのテスト 値の検証 new_userテーブルに意図した値が含ま れているかを確認する
マイグレーション後にデータを読み込む際の注意点 部分的なバージョン移行のテストで はSQLを使う Daoを経由してデータを取得しないように する。Daoは常に最新のスキーマを扱う ため再度スキーマを変更するとテストが 壊れてしまう 全てのマイグレーションをまとめたテスト ではDaoを使ってもOK マイグレーション後のデータベースが常
に最新のスキーマになるため
まとめ • 業務で行ったマイグレーションテストと簡単なRoomの使い方について解説した • マイグレーションの種類によっては単体テストを導入できる • テストで扱うスキーマのバージョンからSQLとDaoの使い分けを行う