本页介绍如何编写不需要设备的主机端测试,例如在 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 主机测试
JAR (Java) 主机测试(例如 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
中。