当测试语料库很大或执行时间变得很长时,我们可以将测试拆分到多部设备上:这种做法就是“分片”。
若要支持分片,测试运行程序需满足分片的先决条件。
大多数主要测试运行程序已经支持分片,所以不需要进行额外的处理。以下测试已经支持分片:插桩测试、主机端驱动测试和 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