Slide 1

Slide 1 text

Roomのマイグレーション をテストする方法

Slide 2

Slide 2 text

自己紹介 ● 名前:若松 健斗 ● 所属:DeNA SWETグループ ○ Androidエンジニア ● アプリの設計を考えることが好き

Slide 3

Slide 3 text

今日話すこと ● 業務で行なったマイグレーション ● Roomのマイグレーションテストの基本 ● 業務で作成したマイグレーションのテスト ● まとめ

Slide 4

Slide 4 text

業務で行なったマイグレーション

Slide 5

Slide 5 text

マイグレーションを行った背景 独自に定義した型をそのまま保存 することができないので、Json形式 の文字列に変換する必要あり

Slide 6

Slide 6 text

マイグレーションを行った背景 難読化されないようにする設定が漏 れてしまった その結果、難読化の影響を受けた Jsonが生成された 難読化の影響を受けたJson 難読化ツールにProguardを使用している

Slide 7

Slide 7 text

マイグレーションを行った背景 ● 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 難読化の影響を受けたデータを含むテーブル データを難読化前の状態に 戻す必要がある

Slide 8

Slide 8 text

実施したマイグレーションの概要 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)

Slide 9

Slide 9 text

実施したマイグレーションの概要 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)

Slide 10

Slide 10 text

マイグレーションのシナリオ ● よくあるマイグレーションのシナリオ ○ 新しいテーブルを追加 ○ 既存のテーブルを削除 ○ 既存のテーブルのスキーマを変更 ● 今回のマイグレーションのシナリオ ○ 新しいテーブルを追加する ○ 既存のテーブルの値を元にレコードを生成する ○ 生成したレコードを、新しいテーブルに追加する

Slide 11

Slide 11 text

Roomのマイグレーションテストの基本

Slide 12

Slide 12 text

事前準備(1/2) ● スキーマをJSONファイルにエクスポートさせる設定 ○ エクスポート先のパスを追加する

Slide 13

Slide 13 text

事前準備(2/2) ● スキーマのJsonをテスト時にRoomが利用できるようにする設定 ○ AndroidTestのアセットにJsonのパスを追加する

Slide 14

Slide 14 text

Roomのマイグレーションテストの基本的な流れ マイグレーションのテストコードのサンプル

Slide 15

Slide 15 text

Roomのマイグレーションテストの基本的な流れ MigrationTestHelperの生成 マイグレーションのテストコードのサンプル 古いスキーマのデータベース生成 やマイグレーションの実行を行う

Slide 16

Slide 16 text

Roomのマイグレーションテストの基本的な流れ 古いスキーマのDBを作成 SQLを使いテーブルにデータを追加 する マイグレーションのテストコードのサンプル

Slide 17

Slide 17 text

Roomのマイグレーションテストの基本的な流れ マイグレーションを実行する runMigrationsAndValidateでマイグ レーションの実行とスキーマの検証 を行う Entityに紐づいていないテーブルが データベース上に存在することを許 可しない場合 validateDroppedTablesをtrueにす る マイグレーションのテストコードのサンプル

Slide 18

Slide 18 text

Roomのマイグレーションテストの基本的な流れ 値の検証を行う runMigrationsAndValidateではス キーマのチェックしか行わない マイグレーションのテストコードのサンプル

Slide 19

Slide 19 text

業務で作成したマイグレーションのテスト

Slide 20

Slide 20 text

作成したマイグレーションのテスト ● 難読化されたデータを元に戻すロジックのテスト ● データベースの振る舞いのテスト

Slide 21

Slide 21 text

作成したマイグレーションのテスト ● 難読化されたデータを元に戻すロジックのテスト ● データベースの振る舞いのテスト

Slide 22

Slide 22 text

難読化されたデータを元に戻すロジックとそのテスト 今回テストしたいロジック obfuscatedJsonがnullの場合にnull を返すこと obfuscatedJsonがnullでない場合に 難読化が解除された文字列を返すこ と テストコードの一例 難読化されたJson形式のデータを元に戻すロジック

Slide 23

Slide 23 text

難読化されたデータを元に戻すロジックとそのテスト テストコードの一例 難読化されたJson形式のデータを元に戻すロジック 単体テストを作成 値の変更ロジックは単体テスト可能 単体テストでカバーできる範囲を広げ ることで、テストにかかる労力や時間を 削減することができる

Slide 24

Slide 24 text

単体テストと統合テストの比較 単体テスト 統合テスト 単体テストの方が圧倒的に簡単 テストにかかる労力や時間を削減できる

Slide 25

Slide 25 text

作成したマイグレーションのテスト ● 難読化されたデータを元に戻すロジックのテスト ● データベースの振る舞いのテスト

Slide 26

Slide 26 text

データベースの振る舞いのテスト

Slide 27

Slide 27 text

データベースの振る舞いのテスト 古いスキーマのDBを準備 スキーマバージョン1のDBを用意して難 読化されたデータを追加

Slide 28

Slide 28 text

データベースの振る舞いのテスト マイグレーションを実行 難読化の影響を受けたデータを元に戻 すマイグレーションを実行する validateDroppedTablesをFalseに設定 しEntitiyに紐づかないテーブルの存在を 許容してもらえるようにする

Slide 29

Slide 29 text

データベースの振る舞いのテスト 値の検証 new_userテーブルに意図した値が含ま れているかを確認する

Slide 30

Slide 30 text

マイグレーション後にデータを読み込む際の注意点 部分的なバージョン移行のテストで はSQLを使う Daoを経由してデータを取得しないように する。Daoは常に最新のスキーマを扱う ため再度スキーマを変更するとテストが 壊れてしまう 全てのマイグレーションをまとめたテスト ではDaoを使ってもOK マイグレーション後のデータベースが常 に最新のスキーマになるため

Slide 31

Slide 31 text

まとめ ● 業務で行ったマイグレーションテストと簡単なRoomの使い方について解説した ● マイグレーションの種類によっては単体テストを導入できる ● テストで扱うスキーマのバージョンからSQLとDaoの使い分けを行う