コンテンツ プロバイダをテストする

コンテンツ プロバイダを実装してデータの保存と取得、または他のアプリがデータにアクセスできるようにする場合は、プロバイダをテストして、予期しない動作がないことを確認する必要があります。このレッスンでは、公開コンテンツ プロバイダをテストする方法を説明します。このレッスンは、自身のアプリだけに公開するプロバイダにも適用できます。

コンテンツ プロバイダの統合テストを作成する

コンテンツ プロバイダを使用すると実際のユーザーデータにアクセスできるため、隔離されたテスト環境でコンテンツ プロバイダをテストすることが重要です。このアプローチでは、テストケースで明示的に設定されたデータ依存関係に対してのみ実行できます。また、テストでは実際のユーザーデータを変更しないことも意味します。たとえば、以前のテストのデータが残っているために失敗するテストを作成しないでください。同様に、テストでは、プロバイダで実際の連絡先情報を追加または削除しないようにしてください。

コンテンツ プロバイダを単独でテストするには、ProviderTestCase2 クラスを使用します。このクラスを使用すると、実際のユーザーデータに影響を与えることなく、IsolatedContextMockContentResolver などの Android モック オブジェクト クラスを使用して、ファイルとデータベースの情報にアクセスできます。

統合テストは、JUnit 4 テストクラスとして作成する必要があります。JUnit 4 テストクラスの作成と JUnit 4 アサーションの使用方法の詳細については、ローカル単体テストクラスを作成するをご覧ください。

コンテンツ プロバイダの統合テストを作成するには、次の手順を行う必要があります。

  1. テストクラスを ProviderTestCase2 のサブクラスとして作成します。
  2. AndroidX Test がデフォルトのテストランナーとして提供する AndroidJUnitRunner クラスを指定します。
  3. ApplicationProvider クラスの Context オブジェクトを設定します。以下のスニペットの例をご覧ください。

Kotlin


@Throws(Exception::class)
override fun setUp() {
  super.setUp()
  context = ApplicationProvider.getApplicationContext<Context>()
}

Java


@Override
protected void setUp() throws Exception {
  super.setUp();
  setContext(ApplicationProvider.getApplicationContext());
}

ProviderTestCase2 の仕組み

ProviderTestCase2 のサブクラスでプロバイダをテストします。この基本クラスは AndroidTestCase を拡張しているため、JUnit テスト フレームワークと、アプリの権限をテストするための Android 固有のメソッドが提供されます。このクラスで最も重要な機能は初期化であり、隔離されたテスト環境を作成します。

初期化

初期化は、サブクラスが独自のコンストラクタで呼び出す ProviderTestCase2 のコンストラクタで行われます。ProviderTestCase2 コンストラクタは、ファイルとデータベースの操作を許可するが、Android システムとの他のやり取りをスタブする IsolatedContext オブジェクトを作成します。 ファイルとデータベースのオペレーション自体は、デバイスまたはエミュレータに対してローカルの、特別な接頭辞が付いたディレクトリで行われます。

コンストラクタは、テスト用のリゾルバとして使用する MockContentResolver を作成します。

最後に、コンストラクタはテスト対象のプロバイダのインスタンスを作成します。これは通常の ContentProvider オブジェクトですが、環境情報をすべて IsolatedContext から取得するため、隔離されたテスト環境での動作に制限されます。テストケース クラスで実行されるすべてのテストは、この分離されたオブジェクトに対して実行されます。

コンテンツ プロバイダの統合テストは、インストルメンテーション単体テストと同じ方法で実行します。

テスト項目

コンテンツ プロバイダのテストに関する具体的なガイドラインは次のとおりです。

  • リゾルバ メソッドでテストする: ProviderTestCase2 でプロバイダ オブジェクトをインスタンス化できますが、必ず適切な URI を使用してリゾルバ オブジェクトでテストする必要があります。そうすることで、通常のアプリと同じインタラクションを実行してプロバイダをテストできます。
  • パブリック プロバイダをコントラクトとしてテストする: プロバイダを公開して他のアプリで利用できるようにするには、コントラクトとしてテストする必要があります。たとえば、次のような方法があります。
    • プロバイダが一般公開している定数でテストします。たとえば、プロバイダのいずれかのデータテーブル内の列名を参照する定数を探します。それは必ず、プロバイダによってパブリックに定義された定数でなければなりません。
    • プロバイダが提供するすべての URI をテストします。プロバイダによっては、それぞれデータの異なる側面を参照する複数の URI を提供している場合があります。
    • 無効な URI をテストします。単体テストでは、意図的に無効な URI でプロバイダを呼び出して、エラーを探す必要があります。プロバイダの設計では、無効な URI に対して IllegalArgumentException をスローすることをおすすめします。
  • 標準的なプロバイダの操作をテストする: ほとんどのプロバイダには、query()insert()delete()update()getType()onCreate() の 6 つのアクセス方法が用意されています。テストでは、これらすべてのメソッドが機能することを確認する必要があります。
  • ビジネス ロジックをテストする: コンテンツ プロバイダがビジネス ロジックを実装している場合は、テストする必要があります。ビジネス ロジックには、無効な値の処理、財務計算や算術計算、重複除去、重複の結合などがあります。