本页介绍如何编写不需要设备的host-side测试,例如在 Linux GCE 实例上运行的测试。(有关编写需要设备的 host-driven 测试的详细信息,请参阅在 Trade Federation 中编写 Host-driven 测试。)
主机端测试类型
您可以通过 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 并启用自动测试配置生成,请在 Android.bp
中将 host_supported
设置为 true
,如 hello_world_test 中所示。
有关编写原生测试的更多信息,请参阅添加新的原生测试示例。
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 主机测试
Deviceless 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
的树构建添加到子进程类路径中。虽然其他两个是最佳实践,但此选项对于成功运行 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>
用于 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
创建一个 par 文件,该文件可以由 TF PythonBinaryHostTest
运行。
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
中。