配置分片

本页介绍了如何通过分片对套件模块 ( AndroidTest.xml ) 进行调整,并在实验室连续执行期间获得最佳速度性能。我们将尝试以通用方式描述这些选项以及使用每个选项的基本原理。

在实验室中连续运行套件时,该套件通常会跨多个设备进行分片,以减少总体完成时间。该工具通常会尝试平衡每个分片的执行时间,以最大限度地缩短总体完成时间(当最后一个分片完成时);但由于某些测试的性质,我们并不总是有足够的内省,需要模块所有者调整某些行为。

可分片还是不可分片?

可以使用<option name="not-shardable" value="true" />标记模块 ( AndroidTest.xml ),以通知工具不应对其进行分片。

在典型的模块中,让线束对模块进行分片(默认行为)是正确的做法。但在某些情况下,您可能想要覆盖该行为:

  • 当模块的设置成本昂贵时:

对模块进行分片会导致准备工作(安装 APK、推送文件等)可能在每个涉及的设备上运行一次。如果您的模块设置又长又昂贵,并且与测试的运行时相比不值得复制,那么您应该将您的模块标记为不可分片。

  • 当模块中的测试数量较少时:

对模块进行分片会导致所有测试用例可能在不同设备上独立执行。这与第一点有关;如果您的测试数量很少,您可能最终会在某些分片中进行单个测试或不进行测试,这将使任何准备步骤变得非常昂贵。例如,为单个测试用例安装 APK 通常是不值得的。

仪器测试:最大分片数量?

在我们实际安装并运行 APK 之前,通过AndroidJUnitTest运行的插装测试不会向工具暴露有多少测试是插装的一部分。这些操作成本高昂,并且无法在套件的所有模块部分的分片时执行。

线束可能会对仪器测试进行过度分片,并最终产生一些空分片;将仪器测试分片为 6 个分片,其中包含 5 个测试,结果是 5 个分片有 1 个测试,1 个分片没有测试。每个分片都需要昂贵的 APK 安装。

因此,当仪器测试 APK 中的测试数量较低时,使用<option name="not-shardable" value="true" />标记模块将使工具知道对该模块进行分片是不值得的。

AndroidJUnitTest运行程序有一个特殊选项,允许它指定允许分片的最大分片数量: <option name="ajur-max-shard" value="5" />

这允许您指定仪器可以分片的最大次数,无论调用级别请求的分片数量如何。默认情况下,检测将被分成调用请求的分片数量。

例如,如果您的仪器测试 APK 仅包含两个测试用例,但您仍想对其进行分片,则ajur-max-shard值为2将确保您不会创建空分片。