TF でホスト側のデバイスレス テストを作成する

このページでは、Linux GCE インスタンスで実行するテストなど、デバイスを必要としないホスト側でのテストを作成する方法について説明します(デバイスを必要とするホストドリブン テストの作成についての詳細は、Trade Federation でホストドリブン テストを作成するをご覧ください)。

ホスト側のテストの種類

Trade Federation(TF)を使用して、数種類のホスト側のテストを実行できます。

ネイティブ(gtest)テスト

プラットフォームをテストするためのネイティブ テスト(gtests)を作成します。テストにデバイスが必要ない場合は、ホストで実行します。そうすることで、テストの実行がはるかに高速になります。このようなテストをテストホストで実行するように設定するには、TF ランナー HostGTest を使用します。

以下に、Tradefed テスト設定の例を示します。

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

上記のテスト設定は、ホストで gtest テスト(hello_world_test)を実行します。このテスト設定例は自動生成できます。テストに特別なセットアップやクリーンアップが必要ない場合は、テスト設定の自動生成機能を使用するだけで、適切な TF テスト設定を作成できます。

ホスト側の gtest を設定し、テスト設定の自動生成を有効にするには、hello_world_test の場合と同様に、Android.bphost_supportedtrue に設定します。

ネイティブ テストの作成方法の詳細については、新しいネイティブ テスト例の追加をご覧ください。

JAR ホストテスト

JUnit などの JAR(Java)ホストテストは、デバイス上で実行する必要がなく、Java プロジェクトのコード カバレッジを提供するテストです。このようなテストは、ランナー HostTest を使用して、テストホストで実行するように設定できます。

Tradefed テスト設定の例

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

上記のテスト設定は、ホスト側 JUnit テスト HelloWorldHostTest を実行します。なお、このテスト設定は自動生成できます。テストに特別なセットアップやクリーンアップが必要ない場合は、テスト設定の自動生成機能を使用するだけで、適切な Tradefed テスト設定を作成できます。

JAR ホストテストの作成方法の詳細については、JAR(Java)ホストテストのページをご覧ください。

分離 Java ホストテスト

デバイスレス Java テストは、パフォーマンスを大幅に低下させることなく分離環境で実行できます。ただし、分離環境の使用を決めるにあたっては、重要な点をいくつか考慮する必要があります。

  • これは、Robolectric と JUnit の単体テストに使用するデフォルトのランナーです
  • 分離環境では、Tradefed は JUnit テストのみをサポートします。
  • 静的にリンクされた依存関係のみがサポートされます。lib で宣言された依存関係は、クラスパスに含まれません。
  • 分離ランナーは、shim ランナーとテスト JAR のみをクラスパスに配置します。
  • このランナーでテストを実行するごとに、ある程度の固定オーバーヘッドが発生します。

Tradefed テスト設定(分離環境)の例

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

自動生成の Soong 構成の例

Soong では、上記のようなテスト構成を手動で作成する代わりに、次の例のような宣言を使用して構成を自動生成できます。

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Robolectric テスト

Robolectric テストでは分離ホストテストと同じランナーを使用しますが、特別なオプションがいくつかあります。

  • robolectric-resources オプションを使用すると、Robolectric 固有のコマンドライン オプションをサブプロセスに渡し、android-all のツリービルドをサブプロセス クラスパスに追加できます。後述の 2 つのオプションはベスト プラクティスですが、Robolectric テストの実行を成功させるために、このオプションは必須です。
  • java-folder オプションを使用すると、サブプロセスで使用する Java ランタイムを変更できます。このオプションは、ホストシステムの優先 JVM と一致しない可能性がある特定の Java バージョンを Robolectric が優先する場合に必要となります。
  • exclude-paths オプションを使用すると、サブプロセス ランナーが特定のモジュールをまったく読み込まないようにすることができます。これは、JAR に余分なクラスが読み込まれて読み込みエラーを引き起こす場合に有用です。java. は一般的な除外で、SecurityException 例外のスローを防ぎます。

Robolectric 構成の例

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Robolectric 自動生成の Soong 構成の例

Soong では、上記のようなテスト構成を手動で作成する代わりに、次の例のような宣言を使用して構成を自動生成できます。

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

Python テスト

テストロジックが Python で記述されている場合は、ビルドタイプ python_test_host を使用して、TF の PythonBinaryHostTest で実行できる par ファイルを作成します。

Tradefed テスト設定の例

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

テストスイートの設定

特定のビルドで TF がホスト側のテストにアクセスできるようにするには、テスト モジュールの `test_suites` 設定を `general-tests` にします。

test_suites: ["general-tests"],

この設定により、テストは test_suites ターゲットの general-tests.zip にパッケージ化されます。