Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Roomのマイグレーションをテストする方法
Search
Rakalute
January 31, 2024
Programming
5.8k
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
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
410
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
4
440
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
270
Are APIs Still Relevant in the AI Era?
soyuka
0
380
Workers Cache を知る
syumai
0
320
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
740
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
450
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
150
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.2k
Intent as Code
shoppingjaws
6
1.1k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
180
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Abbi's Birthday
coloredviolet
4
10k
The Limits of Empathy - UXLibs8
cassininazir
1
690
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
270
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
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の使い分けを行う