2. CTS 测试计划与模块选择
2.1 CTS 测试模块分类
Android 兼容性测试套件(CTS)由多个子模块组成,每个模块面向不同的硬件或软件子系统。模块分类决定了测试覆盖范围和执行效率,以下是主要模块分类及其职责:
| 模块名称 | 测试领域 | 典型测试项举例 |
|---|---|---|
| android.media | 多媒体编解码、音视频播放/录制 | MediaCodec 编码格式支持测试 |
| android.telephony | 蜂窝通信、短信、数据连接 | 4G/5G 信号强度与 RRC 状态测试 |
| android.graphics | GPU 渲染、SurfaceFlinger | OpenGL ES 3.2 兼容性测试 |
| android.system.cts | 系统核心 API、内核接口 | Socket 与 SELinux 策略测试 |
| android.app.cts | 应用框架与 Activity 管理 | Intent 解析与权限验证测试 |
| android.hardware.cts | 传感器、NFC、Wi-Fi 等硬件模块 | 加速度计采样率与精度测试 |
除标准 CTS 外,还有 CTS-Instant(不产生长时间持久写操作,用于快速验证)和 GTS(Google 移动服务测试套件),后者覆盖预装 GMS 应用的合规性。VTS(Vendor Test Suite)则专注于供应商 HAL 实现,常与 CTS 协同执行。
2.2 选择测试计划 (Test Plan)
CTS 预定义了多个测试计划,通过 --plan 参数指定。常用计划包括:
- cts – 全量 CTS 测试(耗时 6~12 小时)
- cts-instant – 轻量级快速验证(约 15 分钟)
- cts -m android.media – 单模块运行(通过
-m选项) - gts – GMS 认证所需测试
- vts – Vendor HAL 测试
实际生产环境中,开发者常根据变更范围选择计划:
# 执行全量 CTS
run cts --plan cts
# 仅测试多媒体模块
run cts --plan cts -m android.media
# 使用 cts-instant 做冒烟测试
run cts --plan cts-instant
提示:初次移植 AOSP 后,建议先执行 cts-instant 快速排除致命兼容性问题,再逐步扩大范围至全量计划。
2.3 过滤测试用例
精确过滤可以大幅节省测试时间。CTS 支持按 类名、方法名、标签 和 分片索引 进行过滤:
2.3.1 按类名/方法名过滤
# 仅运行某个测试类
run cts -m android.media -t android.media.MediaCodecTest
# 仅运行某个测试方法
run cts -m android.media -t android.media.MediaCodecTest#testVideoCodec
# 支持通配符
run cts -m android.media -t "android.media.MediaCodecTest#test*"
2.3.2 按测试过滤器(include-filter / exclude-filter)
# 通过过滤器文件包含指定的测试
run cts --include-filter /path/to/include_filters.xml
# 排除已知失败的测试
run cts --exclude-filter /path/to/exclude_filters.xml
过滤器文件示例(XML 格式):
<?xml version="1.0" encoding="utf-8"?>
<ExcludeFilters>
<ExcludeFilter name="android.telephony.TelephonyManagerTest#testNetworkType" />
<ExcludeFilter name="android.graphics.BitmapTest#testCompress" />
</ExcludeFilters>
2.4 批量执行策略
在资源有限的 CI 环境或大型项目(如高通、联发科 SOC 平台)中,需要并行执行 CTS 模块。主要策略包括:
2.4.1 分片(Sharding)
将测试用例均匀分配到多个设备或同一设备的不同进程:
# 在 4 台设备上分片执行 CTS
run cts --plan cts --shard-count 4 --shard-index 0 # 设备1
run cts --plan cts --shard-count 4 --shard-index 1 # 设备2
run cts --plan cts --shard-count 4 --shard-index 2 # 设备3
run cts --plan cts --shard-count 4 --shard-index 3 # 设备4
注意:分片必须在 同一份 CTS 安装目录 下执行,且设备间应保证 Android 版本完全一致,否则测试结果不可比较。
2.4.2 失败重跑与重试次数
# 对失败用例重跑 2 次(默认 1 次)
run cts --plan cts --retry 2
# 只重跑上一次失败的用例(基于 result 文件)
run cts --plan cts --retry --retry-with-result /tmp/last_run_result.xml
2.4.3 超时与资源限制
# 每个测试用例最长时间 5 分钟
run cts --plan cts --test-timeout 300000
# 限制同时运行的 ADB 设备数量(用于多设备并行)
run cts --plan cts --max-devices 8
2.5 模块选择与计划执行流程
下图展示了从 AOSP 源码编译 CTS 后,到生成最终报告的典型选择与执行链路:
2.6 常见错误与调试
| 错误现象 | 根因 | 解决方案 |
|---|---|---|
| 选择计划时报 "TestPlan not found" | 未正确设置 CTS 安装目录 | 运行 ls $ANDROID_HOST_OUT/cts/plans/ 检查计划文件是否存在;使用路径 --plan /path/to/plan.xml |
| 过滤后无任何测试运行 | 模块名或测试类名拼写错误 | 使用 list tests -m android.media 列出可用测试确认过滤字符串 |
| 分片后各设备测试数量不均 | 测试用例数量不能被分片数整除 | 使用 --shard-count 时尽量选择能被总用例数整除的值;或在脚本末尾合并结果 |
| 重跑仍失败,但手动执行可通过 | 环境残留(进程未清理) | 在重跑前执行 adb reboot 或 am force-stop 清理目标进程 |
2.7 稳定性优化建议
- 分片粒度控制:每个分片分配 200~400 个测试用例为宜,避免过细导致上下文切换开销。
- 禁用非必要模块:在 CI 分支上,通过
--exclude-filter排除已知稳定的模块(如 android.location),缩短回归时间。 - 结果收敛策略:设置最大重跑次数为 3,并启用
--retry-with-result避免重复跑已通过项。 - 资源隔离:在执行大量 I/O 密集型测试(如 android.media)时,使用
--max-devices 1降低磁盘冲突。
实践要点:本章的命令和策略可直接嵌入 CI/CD 流水线。推荐将测试计划选择和过滤逻辑封装为 Jenkinsfile 或 GitLab CI 中的 run_cts.sh 脚本,配合 Artemis 或 TradeFed 的 --plan 参数动态传入。