SDV 测试框架库

本页面简要介绍了 SDV 测试框架库,并指导您完成测试的设置、配置和执行。使用 SDV 测试框架进行端到端测试。该工具基于 Mobly 构建;您可以使用 Python 编写测试。

选择测试方法

在编写测试之前,请选择与您的验证范围相匹配的测试运行程序:

测试范围 Soong 模块类型 执行工具 何时使用
服务软件包单元测试 rust_test、rust_test_host或cc_test atest 在主机或单个 Cuttlefish 虚拟机 (VM) 上验证隔离的 Rust 或 C++ 业务逻辑、数据转换或辅助 crate。
端到端和多虚拟机系统测试 python_test_host(SDV 测试框架) atest 或 CATBox 验证服务包生命周期编排、虚拟机间通信、SOME/IP 桥接或跨一到三个虚拟机的硬件目标。

设置环境

本页面假定您已为 SDV 设置工作站。如需运行框架测试,请安装 virtualenv。

Python 依赖项

在 Android 中管理依赖项的推荐方法是使用 build 配置将测试、Python 及其依赖项打包为可执行文件。您必须在 SDV 测试代码库中遵循此方法。

SDV 测试框架库默认提供以下依赖项:

  • mobly
  • absl-py 在测试中使用参数化时需要。
  • pexpect 互动式指令功能需要此权限。
  • ptyprocess 互动式指令功能需要此权限。

如果您需要特定于测试的依赖项,请将其添加到测试的 Android.bp 文件中:

python_test_host {
    …
    libs: [
        "<DEPENDENCY1>",
        "<DEPENDENCY2>",
        …
    ],
    …
}

系统测试类型

您可以使用 SDV 测试框架创建系统测试。该框架区分以下类型。正确归类测试:

  • 示例测试:执行 SDV 示例服务,并验证结果是否与预期输出一致。
  • 端到端测试:请勿使用 SDV 示例服务。
  • 长时间运行的测试:专为较长的执行周期而设计。
  • 性能测试:使用 perfetto 库。
  • 硬件测试:旨在仅在实体设备上执行,而不是在 Cuttlefish (CF) 中执行。

创建测试

使用该框架编写的所有测试都必须位于测试代码库中。测试的确切位置取决于其类型。如需了解目录路径、Python 测试类模板、Android.bp 规则和 Mobly 编码准则,请参阅创建 SDV 系统测试。

配置测试

将所有测试配置为使用 atest 和 CATBox 运行。

配置 atest

该框架提供了适用于一个、两个和三个虚拟机测试的模板。将以下内容添加到 Android.bp 文件:

  • 一个虚拟机:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device",
    }
    
  • 两个虚拟机:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices",
    }
    
  • 三个虚拟机:

    python_test_host {
      ...
      test_config_template: ":sdv_three_devices",
    }
    

默认模板足以满足大多数测试的需求。除非有令人信服的理由,否则请避免创建自定义配置。

更新默认超时时间

默认超时时间应该足以在本地执行测试。

如果您的测试在本地因超时而失败,请考虑将其拆分为不同的测试。包含许多测试用例的超长测试可能会导致执行瓶颈。

如果您必须设置高于默认值的超时,请继续阅读。

替换默认超时时间

该框架不支持扩展模板以执行 atest。因此,请使用提供的模板,这些模板提供了更长的超时时间。

  • 单虚拟机长时间测试:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device_long_test",
    }
    
  • 两个虚拟机长时间测试:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices_long_test",
    }
    

添加注释,明确说明使用此模板的目的,并解释为何需要延长测试时间(例如,如果测试需要下载耗时较长的工件)。

将文件推送到设备

以下步骤介绍了如何将文件推送到设备以进行 atest 配置。

将文件推送到设备

该框架不支持扩展模板以执行 atest。因此,您必须创建一个 AndroidTest.xml 文件,该文件会完全替换默认模板,并包含设备的相应 target_preparer 选项。

  1. 复制模板的内容:

    • sdv-one-device.xml
    • sdv-two-devices.xml
    • sdv-three-devices.xml
  2. 将 {MODULE} 更新为测试的模块名称。

  3. 为每台设备添加 com.android.tradefed.targetprep.PushFilePreparer。

<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file" key="<FILE_NAME>" value="<REMOTE_FILE_PATH>" />
  </target_preparer>
</device>

配置 CATBox

如需将测试作为套件运行,需要进行 CATBox 配置。

  1. 在 libraries/sdv/sdv_catbox/res/config/ 中创建一个新的配置文件,并遵循以下命名惯例:

    • 示例测试: sdv-sample-<NAME>-test.xml
    • 端到端测试: sdv-e2e-<NAME>-test.xml
    • 长时间运行的测试: sdv-long-running-<NAME>-test.xml
    • 性能测试: sdv-performance-<NAME>-test.xml
    • 硬件测试: sdv-hw-<NAME>-test.xml
  2. 根据测试类型添加相应信息:

  • 单虚拟机测试配置:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/one-device" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • 两个虚拟机的测试配置:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/two-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • 三虚拟机测试配置:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/three-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    

默认模板足以满足大多数测试的需求。除非有令人信服的理由,否则请避免创建自定义配置。

更新默认超时时间

如果默认超时时间不足以完成测试,您可以替换该值。

替换默认超时时间

如需替换默认超时,请将以下内容添加到配置文件的末尾。长测试的超时时间上限应为 10 分钟。

  <!-- Long Test - 10 minutes timeout: <REASON> -->
  <option name="mobly-host:mobly-test-timeout" value="600000" />

将文件推送到设备

以下部分介绍了如何在配置 CATBox 时将文件推送到设备。

将文件推送到设备

如需将文件推送到相应设备,请在 plan 选项后添加以下配置:

<!-- Automatically pushes config file to device-->
<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file"
      key="<FILE_NAME>"
      value="<REMOTE_FILE_PATH>"
    />
  </target_preparer>
</device>

如果您需要每个设备上的文件,请为每个设备添加配置(例如 name=device1、name=device2)。

测试执行

这些说明假定您已完成设置正常运行的 SDV 环境。

设置环境

该框架不会启动云虚拟设备 (CVD) 实例,因此您必须在运行测试之前启动它们。

  1. 设置环境并启动 SDV 目标:

    . build/envsetup.sh
    lunch <TARGET>
    
  2. 启动第一个 CVD 实例:

    cvd create --config=sdv_core_instance1
    
  3. 启动第二个 CVD 实例(用于多虚拟机测试):

    cvd create --config=sdv_core_instance2
    
  4. 启动第三个 CVD 实例(用于多虚拟机测试):

    cvd create --config=sdv_core_instance3
    

运行 atest

atest <TestModuleName>

运行 CATBox

这些命令假定您位于代码库的根目录中。

  1. 构建 CATBox:m catbox
  2. (可选)查看 CATBox 中所有可用的 SDV 测试计划:
out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed l p | grep sdv-

运行测试:

  • 运行一项虚拟机测试:

    NOTIFY_AS_NATIVE=0.0.0.0:6520 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520
    
  • 运行两个虚拟机测试:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521
    
  • 运行三虚拟机测试:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521,0.0.0.0:6522 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521 --{device3}serial 0.0.0.0:6522