4. CTS测试框架:Trade Federation (TF) 架构、测试用例生命周期、配置解析

Trade Federation(简称 TF)是 Android CTS 的官方测试框架,负责测试用例的调度、执行、结果收集与报告生成。理解 TF 的架构与生命周期,是搭建 CTS 环境、定位测试失败根因的必备技能。

4.1 TF 整体架构

TF 采用模块化、可插拔的架构设计,核心组件包括:

  • Harness:框架入口,负责加载配置、初始化模块、启动测试循环。
  • Test Invocation:一次完整的测试运行实例,包含前置检查、测试执行、后置清理。
  • ITestSuite / ITestFilter:测试套件与过滤器接口,支持按模块、标签、优先级筛选用例。
  • IDeviceTest / IRemoteTest:测试用例基类,分别对应设备端与远程端执行。
  • ITestInvocationListener:结果监听器,负责收集测试结果、生成 XML 报告。
  • Configuration:基于 XML 的配置系统,定义设备、测试包、参数、监听器。
关键理解:TF 的架构设计遵循“配置驱动、监听分离”原则。测试逻辑与设备管理、结果收集完全解耦,便于扩展自定义测试模块。
Trade Federation 核心架构组件关系 Harness (入口) Configuration (XML) Test Invocation ITestSuite / Filter IDeviceTest ITestInvocationListener Android 设备 XML 测试报告 说明:Harness 加载 Configuration 后创建 Test Invocation,Invocation 协调测试套件、设备测试与结果监听三大模块。

4.2 测试用例生命周期

每个 CTS 测试用例在 TF 框架中经历完整的生命周期阶段。理解各阶段回调顺序,有助于在 HAL 层调试时准确插入日志或断点。

阶段 回调方法 说明
1. 前置检查 preInvocationSetup() 检查设备连接状态、系统属性、权限等前置条件
2. 测试初始化 setUp() 创建测试环境、安装 APK、推送测试文件
3. 测试执行 testXxx() 执行具体的 Camera HAL 接口调用与断言
4. 结果收集 testResult() 收集测试结果、异常堆栈、性能指标
5. 后置清理 tearDown() 卸载 APK、清理临时文件、恢复设备状态
6. 报告生成 invocationEnded() 生成 XML 报告,写入 test_result.xml
调试技巧:在 HAL 层调试时,重点关注 setUp() 阶段是否成功打开 Camera HAL 服务,以及 tearDown() 阶段是否正确释放资源。这两个阶段是 CTS 测试失败的高发区。
CTS 测试用例生命周期流程 1. 前置检查 2. setUp() 3. testXxx() 4. testResult() 5. tearDown() 6. 报告生成

4.3 配置解析机制

TF 使用 XML 配置文件驱动测试行为。配置文件定义了测试套件、设备参数、过滤器、监听器等全部运行时信息。解析流程如下:

  1. 加载 XML:Harness 读取 testcases/ 目录下的 .xml 配置文件。
  2. 构建 Configuration 对象:解析 <configuration> 根标签下的子元素。
  3. 注册模块:根据 <test>、<device>、<listener> 等标签实例化对应类。
  4. 注入参数:将 <option> 标签中的键值对注入到模块对象。
  5. 启动 Invocation:Configuration 就绪后,Harness 创建 Test Invocation 开始执行。
配置示例:Camera ITS 测试的典型配置文件片段如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration description="Camera ITS test config">
    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
        <option name="package" value="android.hardware.camera.cts" />
        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
        <option name="test-filter" value="android.hardware.camera.cts.CameraTest" />
    </test>

    <device class="com.android.tradefed.device.DeviceManager">
        <option name="serial" value="emulator-5554" />
        <option name="max-battery" value="50" />
    </device>

    <listener class="com.android.tradefed.result.XmlResultReporter">
        <option name="output-file" value="/tmp/cts_result.xml" />
    </listener>
</configuration>

4.4 常见配置参数速查

参数 所属标签 说明 示例值
package <test> 测试 APK 的包名 android.hardware.camera.cts
runner <test> 测试运行器类名 androidx.test.runner.AndroidJUnitRunner
test-filter <test> 过滤特定测试类或方法 CameraTest#testPreview
serial <device> 设备序列号 emulator-5554
max-battery <device> 最低电量要求(百分比) 50
output-file <listener> 测试报告输出路径 /tmp/cts_result.xml
常见陷阱:配置文件中 test-filter 的格式必须严格遵循 类名#方法名 或 包名.类名。格式错误会导致 TF 无法匹配测试用例,表现为“0 tests found”错误。

4.5 调试配置的实用命令

在 CTS 环境搭建与调试过程中,以下 TF 命令可帮助验证配置是否正确:

  • 列出可用配置:tradefed.sh list configs — 显示 testcases/ 目录下所有 XML 配置。
  • 验证配置解析:tradefed.sh run config <config_name> --dry-run — 模拟运行,不实际执行测试,只打印解析结果。
  • 查看配置详情:tradefed.sh run config <config_name> --help — 显示该配置支持的所有 option 及其默认值。
  • 动态覆盖参数:tradefed.sh run config <config_name> --test-filter CameraTest#testPreview — 在命令行覆盖 XML 中的 filter 设置。
实战建议:在调试 Camera HAL 层问题时,优先使用 --dry-run 验证配置是否正确加载,再使用 --test-filter 精确定位单个测试用例,避免全量运行浪费时间。