设置套件

Tradefed 中的套件是指在驱动整体执行的通用测试运行程序下运行多项测试的一套设置。

在 Tradefed 中,套件通过 ITestSuite 类驱动,该类支持添加和移除测试,不受测试运行方式的限制。

定义

  • 套件:一组测试模块,配置为在类似的顶级设置下运行,以在单次调用下报告其结果。
  • 顶级设置:在运行任何测试模块之前应用于设备的设置。
  • 主要配置:套件级 Tradefed XML 配置,描述应运行的模块以及应使用的顶级设置。
  • 模块级设置:在运行模块之前应用于设备的设置。这些也称为“模块专用设置”。
  • 模块配置:是指 AndroidTest.xml Tradefed XML 配置,描述相应模块以及应执行的模块级设置。
  • 模块:测试单元,由设置步骤(模块级设置)、测试执行步骤和拆解步骤组成。
  • 模块内重试:由自动化测试框架在模块内完成的自动重试。
  • 套件重试:完全重新运行套件中之前失败的测试。

ITestSuite 结构

Tradefed 中的 ITestSuite 是指驱动套件执行的通用基类。它由所有主要测试套件(尤其是 Android 兼容性测试套件 (CTS)Android 供应商测试套件 (VTS))共享,并确保在所有套件中实现一致的执行体验。

我们有时会将 ITestSuite 称为“套件运行程序”。

套件运行程序按照以下步骤来执行:

  1. 加载模块的配置并确定应运行的集。
  2. 运行每个模块:

    1. 运行模块级设置。
    2. 运行模块测试。
    3. 运行模块级拆解。
  3. 报告结果。

顶级设置

从 Tradefed 的角度来看,ITestSuite 也只不过是一个测试而已。它比较复杂,但仍只是一个测试,就像其他任何 IRemoteTest 一样。因此,在 Tradefed 配置中指定套件运行程序时,Tradefed 会遵循通常的配置模式:运行 build_providertarget_preparer、测试(在这种情况下是我们的套件)和 target_cleaner

包含 ITestSuite 的 Tradefed 配置中的此序列就是顶级设置。

示例:

<configuration description="Common config for Compatibility suites">

    <build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
    <!-- Setup applied before the suite: so everything running in the suite will
    have this setup beforehand -->
    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
        <option name="run-command" value="settings put global package_verifier_enable 0" />
        <option name="teardown-command" value="settings put global package_verifier_enable 1"/>
    </target_preparer>

    <!-- Our ITestSuite implementation -->
    <test class="com.android.compatibility.common.tradefed.testtype.suite.CompatibilityTestSuite" />

    <result_reporter class="com.android.compatibility.common.tradefed.result.ConsoleReporter" />
</configuration>

模块元数据

我们将在测试模块 AndroidTest.xml 中指定的额外信息称为“模块元数据”。利用这些元数据,您可以指定有关模块的附加信息,还可以对模块进行过滤。

元数据示例:

<option name="config-descriptor:metadata" key="component" value="framework" />
<option name="config-descriptor:metadata" key="parameter" value="instant_app" />

元数据的过滤器示例:

--module-metadata-include-filter component=framework

以上代码将运行“component"元数据为“framework”的所有模块。

完整的 AndroidTest.xml 示例:

<configuration description="Config for CTS Gesture test cases">
    <option name="test-suite-tag" value="cts" />
    <!-- Metadata -->
    <option name="config-descriptor:metadata" key="component" value="framework" />
    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
    <!-- End: metadata -->
    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
        <option name="cleanup-apks" value="true" />
        <option name="test-file-name" value="CtsGestureTestCases.apk" />
    </target_preparer>
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="android.gesture.cts" />
        <option name="runtime-hint" value="10m50s" />
    </test>
</configuration>

参数化模块

一种特殊的元数据类型是 parameter

<option name="config-descriptor:metadata" key="parameter" value="instant_app" />

此元数据指定相应模块需要在不同的模式下执行,例如作为免安装应用,而不是标准应用模式。

所有可能的模式或参数都由 ModuleParameters 进行描述,并在 ModuleParametersHelper 中具有关联的处理程序,能让您更改模块设置以在特定模式下执行。

例如,免安装应用模式会强制在免安装模式下安装 APK。

为了实现参数化,您需要在命令行中通过以下命令启用它:

--enable-parameterized-modules

也可以通过以下命令运行单个给定模式:

--enable-parameterized-modules --module-parameter <Mode>

--enable-parameterized-modules --module-parameter INSTANT_APP

当模块的参数化版本运行时,它将在参数化模块名称下报告其结果,例如 CtsGestureTestCases[instant] 而非 base CtsGestureTestCases