当测试语料库很大或执行时间变长时,我们提供了将测试拆分到多个设备的可能性:分片。
分片具有测试运行器支持分片的先决条件。
大多数主要测试运行程序已经支持分片,因此不需要额外的工作。这些已经支持分片:仪器测试、主机端驱动测试、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