此页面介绍了可以通过分片为套件模块 (AndroidTest.xml
) 进行哪些调整,从而在实验室中的持续执行期间获得最佳速度性能。我们将尝试以通用方式描述这些选项,并说明使用每个选项的理由。
在实验室中持续运行套件时,套件通常会在多个设备之间进行分片,以缩短总体完成时间。工具通常会尝试平衡每个分片的执行时间,以最大限度地缩短总体完成时间(当最后一个分片完成时);但由于某些测试的性质,我们并不总是有足够的内省,并且需要模块所有者调整某些行为。
可分片还是不可分片?
可以为模块 (AndroidTest.xml
) 标记 <option name="not-shardable" value="true" />
,以通知工具不应对其进行分片。
在典型模块中,让 harness 对你的模块进行分片(默认行为)是正确的做法。但在某些情况下,你可能想要覆盖该行为。
- 当你的模块设置成本很高时
对模块进行分片会导致准备工作(安装 APK、推送文件等)可能在每个涉及的设备上运行一次。如果你的模块设置耗时且成本高昂,与测试的运行时相比,不值得复制,则应将你的模块标记为不可分片。
- 当你的模块中的测试数量较少时
对模块进行分片会导致所有测试用例可能在不同的设备上独立执行。这与第一点有关;如果你的测试数量较少,你最终可能会在某些分片中只有一个测试或没有测试,这将使任何准备步骤都非常昂贵。例如,为一个测试用例安装 APK 通常是不值得的。
Instrumentation 测试:最大分片数?
通过 AndroidJUnitTest 运行的 instrumentation 测试在实际安装并运行 APK 之前,不会向 harness 公开 instrumentation 中包含多少个测试。这些操作成本很高,并且无法在分片时对套件中的所有模块执行。
Harness 可能会过度分片 instrumentation 测试,并最终得到一些空分片;将包含五个测试的 instrumentation 测试分片成六个分片会导致五个分片各有一个测试,一个分片没有测试。每个分片都需要耗费成本的 APK 安装。
因此,当 instrumentation 测试 APK 中的测试数量较少时,使用 <option name="not-shardable" value="true" />
标记模块将允许 harness 知道分片该模块是不值得的。
AndroidJUnitTest
运行器有一个特殊的选项,允许指定它允许分片的最大分片数:<option name="ajur-max-shard" value="5" />
。
这允许你指定 instrumentation 可以分片的最大次数,而无需考虑调用级别请求的分片数。默认情况下,instrumentation 将被分片为调用请求的分片数。
例如,如果你的 instrumentation 测试 APK 仅包含两个测试用例,但你仍然想要对其进行分片,则将 ajur-max-shard
值设置为 2
将确保你不会创建空分片。