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