当测试语料库很大或执行时间变长时,我们提供了跨多个设备拆分测试的可能性:分片。
分片具有测试运行程序支持分片的 先决条件。
大多数主要测试运行程序已支持分片,因此无需进行额外的工作。以下程序已支持分片:Instrumentation 测试、主机端驱动的测试、GTest。
我们在 Tradefed 中支持两种类型的分片:本地分片和分布式分片。它们有一些相似之处,因此本页介绍了它们的共同属性,然后介绍了每种分片的具体细节。
共同属性
两种形式的分片都假定测试运行程序具有相同的属性:分片需要是独立的和确定性的。两种分片的第一步都是构建完整的有序测试列表,然后将它们拆分为不同的组/分片。
分片形式的主要区别在于它们执行测试的方式。更多详情请参见以下章节。
本地分片
本地分片是指参与分片调用的执行的所有设备都连接到同一物理主机。
执行
本地分片利用连接到同一主机的所有设备,方法是创建一个需要执行的测试池,并让每个设备在其空闲时(即完成上一个测试后)轮询测试。这实现了优化的设备利用率。我们也称之为动态分片。
选项
--shard-count XX
分布式分片
分布式分片是指参与分片调用的执行的所有设备可以位于任何位置并连接到不同的物理主机。
执行
分布式分片发生在构建测试列表时,并且每个分片的内容仅执行当前请求的分片。因此,所有分布式分片首先构建相同的列表,然后执行其互斥子集,从而执行所有测试。
这种形式的主要特性是分片彼此完全不知道,并且可以独立失败。
主要的缺点是分片长度不一定平衡,仅仅是因为我们无法预先预测每个分片中每个测试的运行时长。进行分配是为了使每个分片中具有大致相同数量的测试用例。
选项
--shard-count XX --shard-index XX
令牌分片
令牌分片只能与本地分片一起使用。该标志在非本地分片用例中不起作用。有时,参与分片的设备之一拥有其他设备没有的特殊资源,例如 SIM 卡。某些测试可能仅在该特殊资源可用时才有效,否则将失败。
令牌分片是我们针对此类用例的解决方案。测试模块能够在其 AndroidTest.xml
中声明它们需要的特殊资源,并且 Tradefed 将测试路由到具有该资源的设备。
XML 配置
<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
令牌的 value
与 Tradefed 的 TokenProperty
匹配,并与 TokenProviderHelper
中的处理程序关联。
这允许测试模块针对可以正确执行测试的设备运行。
如果没有设备可以运行测试怎么办?
如果没有任何可用设备具有与测试模块匹配的资源,则测试模块将失败并跳过,因为它无法正确执行。
例如,如果测试模块请求 SIM 卡运行,但没有设备具有 SIM 卡,则测试模块将失败。
实现
将此功能标志传递给主 Tradefed 命令行
--enable-token-sharding