4、执行CTS测试:使用cts-tradefed命令行、单模块测试、全量测试、并行测试与超时设置

CTS测试跑起来,说白了就是跟设备较劲的过程。你写好了配置,搭好了环境,接下来就是真刀真枪地执行了。我个人习惯把这一步分成几个场景:单模块调试、全量回归、并行加速,还有最让人头疼的超时问题。咱们一个一个说。

4.1 cts-tradefed 命令行基础

CTS测试的入口是 cts-tradefed 这个命令。你进入 CTS 目录后,直接敲:

cd android-cts
./cts-tradefed

然后你会看到一个 tf> 提示符。这就是 TradeFed 的控制台。嗯,这里要注意,第一次启动可能会慢一点,因为它要加载一堆模块。

我个人习惯把常用命令写成别名,比如:

alias cts='cd ~/android-cts && ./cts-tradefed'

省得每次敲一长串。你在控制台里输入 help 就能看到所有命令。但我建议你重点记住这几个:

  • run cts – 跑全量测试
  • run cts --module – 跑单个模块
  • list modules – 查看所有可用模块
  • list plans – 查看测试计划
小技巧: 如果你不想进交互式控制台,可以直接用 ./cts-tradefed run cts --plan CTS 这种一行命令搞定。我在项目中经常用这种方式写自动化脚本。

4.2 单模块测试:精准定位问题

你想想看,全量测试跑一次可能要几个小时。如果只是改了一个小功能,比如蓝牙或者相机,没必要跑全部。单模块测试就是干这个的。

举个例子,我只想测试 Camera 相关的 CTS:

run cts --module CtsCameraTestCases

模块名怎么找?用 list modules 命令,它会列出所有模块。我遇到过新手直接猜模块名,结果拼错了跑不起来。其实你可以用 list modules | grep -i camera 来过滤。

有时候你只想跑某个测试类里的几个方法,可以这样:

run cts --module CtsCameraTestCases --test android.hardware.camera2.cts.CameraTest#testCapture

注意那个 # 号,后面跟的是具体方法名。我曾经在调试一个HAL层bug时,就靠这种精准定位,把问题缩小到了三个测试用例,省了大把时间。

避坑指南: 单模块测试跑完后,结果会保存在 android-cts/results/ 目录下。每个测试结果都有一个时间戳文件夹,别搞混了。我建议你跑之前先 date 看一眼时间,方便对应。

4.3 全量测试:回归的硬仗

全量测试,说白了就是 run cts 或者 run cts --plan CTS。这个命令会跑所有 CTS 模块,包括 ARM 和 X86 的测试。我建议你在发布正式版本前至少跑一次全量。

全量测试的典型输出是这样的:

05-12 14:30:22 I/TestInvocation: Starting invocation: 'cts' on device 'ABCD1234'
05-12 14:30:25 I/Module: Starting module: CtsCameraTestCases
05-12 14:30:25 I/Module: [1/142] CtsCameraTestCases
...

看到那个 [1/142] 了吗?142 是总模块数。我一般会盯着这个数字,如果长时间不动,可能就是卡住了。

全量测试的时间取决于设备性能。我记得有一次在低端设备上跑,整整花了 12 个小时。所以,我建议你:

  • 用性能好一点的设备跑全量
  • 确保设备不锁屏、不休眠
  • USB 线要稳,别中途断开
警告: 全量测试过程中不要拔掉 USB 线,否则测试会中断,而且结果可能不完整。我曾经有一次跑了一晚上,结果早上发现 USB 松了,白跑。从那以后我都是用胶带把 USB 口固定住。

4.4 并行测试:让时间减半

全量测试太慢了怎么办?并行测试是个好办法。CTS 支持同时跑多个模块,利用多核 CPU 的优势。

启用并行测试很简单:

run cts --shard-count 4

这个 4 表示分成 4 个分片并行执行。你想想看,如果你的机器是 8 核的,设成 4 或者 8 都能明显提速。我一般设成 CPU 核心数的一半,留点资源给系统。

并行测试的输出会有点乱,因为多个模块同时打印日志。但最终结果会汇总到一个文件夹里。你可以用 --shard-index 指定只跑某个分片:

run cts --shard-count 4 --shard-index 2

这个在调试时很有用。比如你发现第 3 个分片总是失败,就可以单独跑它看看。

个人经验: 并行测试虽然快,但容易暴露资源竞争问题。比如两个模块同时访问摄像头,可能会冲突。我建议你先用单模块跑一遍,确认没问题了再用并行加速。

4.5 超时设置:别让测试卡死

测试卡死是家常便饭。有时候一个测试用例跑着跑着就没反应了,整个测试就停在那里。这时候超时设置就派上用场了。

CTS 支持两种超时:

超时类型 默认值 设置方式
测试用例超时 10 分钟 --test-timeout 600000
模块超时 60 分钟 --module-timeout 3600000

单位是毫秒。比如你想把测试用例超时改成 5 分钟:

run cts --test-timeout 300000

我遇到过一种情况:某个测试用例在特定设备上会死锁,默认 10 分钟超时根本不够。后来我把超时改成 30 分钟,虽然慢了点,但至少能跑完。

避坑指南: 超时时间别设得太短。有些测试用例需要下载资源或者等待硬件响应,比如 NFC 测试。我曾经把超时设成 1 分钟,结果一堆测试因为超时失败,后来才发现是误报。

还有一个全局超时参数 --max-testcase-run-time,它控制整个测试运行的最大时间。比如:

run cts --max-testcase-run-time 7200000

这个参数适合在 CI 环境中用,防止测试跑太久占用资源。

4.6 综合实战:一条命令搞定

说了这么多,给你一个我常用的实战命令:

./cts-tradefed run cts --plan CTS --shard-count 4 --test-timeout 600000 --module-timeout 3600000 --skip-preconditions --skip-system-status-check

解释一下:

  • --plan CTS – 跑全量计划
  • --shard-count 4 – 4 路并行
  • --test-timeout 600000 – 每个用例 10 分钟超时
  • --module-timeout 3600000 – 每个模块 1 小时超时
  • --skip-preconditions – 跳过前置条件检查(比如 Wi-Fi 连接)
  • --skip-system-status-check – 跳过系统状态检查(比如电池电量)

这两个 skip 参数在调试时很有用,但正式测试时我建议去掉,因为前置条件检查能帮你发现环境问题。

好了,执行 CTS 测试的核心就这些。单模块调试、全量回归、并行加速、超时控制,这四个点你掌握好了,大部分场景都能应对。下一章咱们聊聊测试结果的分析和报告生成,那个才是真正头疼的地方。