データベースをテストしてデバッグする

Room 永続ライブラリを使用してデータベースを作成する場合は、アプリのデータベースとユーザーのデータの安定性を検証する必要があります。このページでは、データベースをテストして、テストに合格するためにデバッグ手順を実行する方法について説明します。

データベースをテストする

データベースをテストするには、次の 2 つの方法があります。

  • Android を搭載したデバイスの場合
  • ホスト開発マシン上

データベース移行に固有のテストについては、移行をテストするをご覧ください。

Android を搭載したデバイスでテストする

データベース実装をテストするには、Android を実行するデバイスで実行される JUnit テストを作成することをおすすめします。このテストではアクティビティが必要ないため、UI テストよりも高速に実行できます。

テストをセットアップする際は、データベースのインメモリ バージョンを作成して、閉鎖環境でテストを実行するようにします。次のサンプルをご覧ください。

import kotlinx.coroutines.test.runTest

@RunWith(AndroidJUnit4::class)
class SimpleEntityReadWriteTest {
    private lateinit var userDao: UserDao
    private lateinit var db: TestDatabase

    @Before
    fun createDb() {
        val context = ApplicationProvider.getApplicationContext<Context>()
        db = Room.inMemoryDatabaseBuilder<TestDatabase>(context)
                .setDriver(BundledSQLiteDriver())
                .build()
        userDao = db.userDao()
    }

    @After
    fun closeDb() {
        db.close()
    }

    @Test
    fun writeUserAndReadInList() = runTest {
        val user = User(3, "george")
        userDao.insert(user)
        val byName = userDao.findUsersByName("george")
        assertEquals(byName.single(), user)
    }
}

ホストマシン上でテストする(JVM)

Room KMP を使用すると、ローカル JVM JUnit テストを使用して、ホスト開発マシンでデータベース テストを実行できます。この設定により、Android エミュレータやデバイスのオーバーヘッドがなくなるため、テストをより高速に実行できます。

一貫性を維持するには、BundledSQLiteDriver を使用します。このドライバには、ソースからコンパイルされた SQLite が含まれています。これは、ホストマシン、Android デバイス、iOS デバイスでまったく同じバージョンの SQLite を使用します。このドライバを使用すると、バージョンの不一致の問題を解消できます。

JVM テストを設定するには、テスト データベース ビルダーで BundledSQLiteDriver を構成します。

val db = Room.inMemoryDatabaseBuilder<TestDatabase>()
    .setDriver(BundledSQLiteDriver())
    .build()

移行をテストする

Room はデータベースの増分移行をサポートしており、アプリのアップデートによってデータベース スキーマが変更された場合に既存のアプリデータを保持できます。ただし、移行が正しく定義されていない場合、アプリがクラッシュする可能性があります。必ず、Room のデータベースの移行をテストしてください。

データベースをデバッグする

データベースのデバッグに使用できるツールやプロセスを紹介します。

Database Inspector を使用する

Android Studio 4.1 以降では、Database Inspector を使用してアプリの実行中にアプリのデータベースを検査、クエリ、変更できます。Database Inspector は、Android にバンドルされている SQLite バージョンと互換性があり、Room で使用するための特別な機能を備えています。

  • ガター アクションを使用して、DAO クラスからクエリを実行します。
  • 実行中のアプリがデータを変更すると、Database Inspector にライブ アップデートがすぐに表示されます。

Database Inspector の詳細については、Database Inspector を使用してデータベースをデバッグするをご覧ください。

コマンドラインからデータをダンプする

Android SDK には、アプリのデータベースを調査するための sqlite3 データベース ツールが含まれています。これには、テーブルの内容を出力する .dump や、既存のテーブルに対する SQL CREATE ステートメントを出力する .schema などのコマンドがあります。

次のスニペットに示すように、SQLite コマンドをコマンドラインから実行することもできます。

adb -s emulator-5554 shell sqlite3
/data/data/your-app-package/databases/rssitems.db

詳細については、SQLite のウェブサイトにある sqlite3 コマンドラインのドキュメントをご覧ください。

参考情報

Room データベースのテストとデバッグの詳細については、次の参考情報をご覧ください。

ブログ投稿

動画