在 TF 中编写主机端无设备测试

本页介绍如何编写不需要设备的主机端测试,例如在 Linux GCE 实例上运行的测试。(如需详细了解如何编写需要设备的主机驱动的测试,请参阅在 Trade Federation 中编写主机驱动的测试。)

主机端测试类型

您可以通过 Trade Federation (TF) 运行多种类型的主机端测试。

原生 (gtest) 测试

您可以创建原生测试 (gtest) 来测试平台。如果测试不需要设备,请在主机上运行该测试;这样,测试的运行速度会更快。如需将此类测试配置为在测试主机上运行,请使用 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.bp 中将 host_supported 设置为 true

如需详细了解如何编写原生测试,请参阅添加新的原生测试示例

JAR (Java) 主机测试

JAR 主机测试(例如 JUnit)是不需要在设备上运行的测试,可以提供 Java 项目的代码覆盖率。这种测试可以配置为使用运行程序 HostTest 在测试主机上运行。

TradeFed 测试配置示例:

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

该测试配置会运行一项名为 HelloWorldHostTest 的主机端 JUnit 测试。请注意,上述测试配置可以自动生成。除非您的测试需要特殊设置或清理操作,否则,请使用自动测试配置生成功能来创建合适的 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 的树 build 添加到子进程类路径中。虽然另外两种做法是最佳做法,但要成功运行 Robolectric 测试,此选项必不可少。
  • java-folder 选项允许更改子进程使用的 Java 运行时。由于 Robolectric 偏好的特殊 Java 版本可能与主机系统的首选 JVM 不一致,因此该选项必不可少。
  • 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>

Soong 配置示例(Robolectric 自动生成)

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 编写的,请使用 build 类型 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 能够访问指定 build 的主机端测试,请将测试模块 `test_suites` 设置设为 `general-tests`

test_suites: ["general-tests"],

使用此设置时,测试将封装到 test_suites 目标的 general-tests.zip 中。