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

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

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

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

  • Android デバイス上
  • ホスト開発マシン上(非推奨)

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

Android デバイス上でテストする

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

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

Kotlin

@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(
                context, TestDatabase::class.java).build()
        userDao = db.getUserDao()
    }

    @After
    @Throws(IOException::class)
    fun closeDb() {
        db.close()
    }

    @Test
    @Throws(Exception::class)
    fun writeUserAndReadInList() {
        val user: User = TestUtil.createUser(3).apply {
            setName("george")
        }
        userDao.insert(user)
        val byName = userDao.findUsersByName("george")
        assertThat(byName.get(0), equalTo(user))
    }
}

Java

@RunWith(AndroidJUnit4.class)
public class SimpleEntityReadWriteTest {
    private UserDao userDao;
    private TestDatabase db;

    @Before
    public void createDb() {
        Context context = ApplicationProvider.getApplicationContext();
        db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class).build();
        userDao = db.getUserDao();
    }

    @After
    public void closeDb() throws IOException {
        db.close();
    }

    @Test
    public void writeUserAndReadInList() throws Exception {
        User user = TestUtil.createUser(3);
        user.setName("george");
        userDao.insert(user);
        List<User> byName = userDao.findUsersByName("george");
        assertThat(byName.get(0), equalTo(user));
    }
}

ホストマシン上でテストする

Room は SQLite サポート ライブラリを使用して、Android フレームワーク クラスのインターフェースと適合するインターフェースを実現します。この機能により、サポート ライブラリのカスタム実装を渡してデータベース クエリをテストできます。

移行をテストする

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 データベースのテストとデバッグの詳細については、次の参考情報をご覧ください。

ブログ投稿

動画