インストゥルメンテーション テスト

まず、developer.android.com にあるアプリのテストをご覧ください。プラットフォーム テストでのインストゥルメンテーション テストの使い方にはいくつかの違いがあります。

インストゥルメンテーション テストは、am instrument コマンドによって起動される特別なテスト実行環境を提供します。この環境でターゲット アプリケーション プロセスが再起動され、基本アプリケーション コンテキストで初期化されて、アプリケーション プロセス VM 内でインストゥルメンテーション スレッドが起動されます。テストコードはこのインストゥルメンテーション スレッドで実行が開始され、Instrumentation インスタンスが付属しています。このインスタンスは、アプリケーション コンテキストへのアクセスとテスト中のアプリケーション プロセスを操作する API を提供します。

主な概念

  • アプリケーション パッケージでインストゥルメンテーションを宣言する必要があります。アプリケーション パッケージ マニフェストの <manifest> タグ下に <instrumentation> タグをネストします。
  • 技術的にアプリケーション パッケージ マニフェストに複数の <instrumentation> タグを含めることは可能ですが、この方法では一般的に使用されません。
  • <instrumentation> に以下を含める必要があります。
    • android:name 属性: テスト アプリケーションに含まれる Instrumentation のサブクラス名である必要があります。これは、一般的に使用されているテストランナーです。例: android.support.test.runner.AndroidJUnitRunner
    • android:targetPackage 属性を定義する必要があります。その値は、テスト対象のアプリケーション パッケージに設定する必要があります。

ステップの概要

  1. 一般的にフレームワーク サービスに対する目的の密閉型テストは次のとおりです。

    frameworks/base/core/tests/coretests
        frameworks/base/services/tests/servicestests
        

    コンポーネントに新しいインストゥルメンテーション モジュールを追加する場合、以下をご覧ください。

  2. 上記のいずれかの場所にテストを追加する場合、既存の規則に従います。新しいテスト モジュールを設定する場合は、上記のいずれかの場所にある AndroidManifest.xmlAndroid.mk のセットアップに従います。

  3. frameworks/base/core/tests/coretests/ の例をご覧ください。以下の行により、追加のアプリがインストールされますので、ご注意ください。

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
        <option name="test-file-name" value="BstatsTestApp.apk" />
        
  4. 必ず、@SmallTest@MediumTest@LargeTest のいずれかとしてテストをマークしてください。

  5. テスト モジュールを make でビルドします。例:

    make FrameworksCoreTests -j
        
  6. テストを実施します。

    make tradefed-all -j
        tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
        
  7. Tradefed を使用しない場合、テストを手動でインストールして実行します。

    1. 生成された apk をインストールします。
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
        

    ヒント: adb shell pm list instrumentation を使用して、インストールされた APK 内のインストゥルメンテーションを検索します。

    1. さまざまなオプションを指定してテストを実行します。

      1. apk 内のすべてのテスト

        adb shell am instrument -w com.android.frameworks.coretests\
              /android.support.test.runner.AndroidJUnitRunner
            
      2. 特定の Java パッケージ下のすべてのテスト

        adb shell am instrument -w -e package android.animation \
              com.android.frameworks.coretests\
              /android.support.test.runner.AndroidJUnitRunner
            
      3. 特定のクラス下のすべてのテスト

        adb shell am instrument -w -e class \
              android.animation.AnimatorSetEventsTest \
              com.android.frameworks.coretests\
              /android.support.test.runner.AndroidJUnitRunner
            
      4. 特定のテスト方法

        adb shell am instrument -w -e class \
              android.animation.AnimatorSetEventsTest#testCancel \
              com.android.frameworks.coretests\
              /android.support.test.runner.AndroidJUnitRunner
            

テストでは、JUnit API を使用して成功または失敗に関して明示的にアサーションを作成できます。また、例外がキャッチされない場合も、機能的な失敗を招きます。

パフォーマンス指標を出力するには、テストコードで Instrumentation#sendStatus を呼び出して Key-Value ペアのリストを送信します。注意点は次のとおりです。

  1. 指標には整数または浮動小数点を使用できます。
  2. 数値以外の値は破棄されます。
  3. テスト apk は機能テストか指標テストのいずれかになりますが、両方の組み合わせは現在サポートされていません。