安卓测试分片

11

请问有人能解释一下Android中的测试分片是用来完成什么任务的吗?如果有人可以分享一些教程那就太好了。

单词“shard”意为整体的一小部分。如何根据数字执行分片,以及我应该基于什么指定shardIndex?

以下是开发者文档中的定义:

测试分片

测试运行程序支持将单个测试套件分成多个分片,这样您可以轻松地将属于同一分片的测试作为一个组一起运行,在同一个Instrumentation实例下运行。每个分片都由索引号标识。在运行测试时,使用-e numShards选项指定要创建的独立分片数和-e shard index选项指定要运行的分片。

例如,要将测试套件分成10个分片,并仅运行第二个分片中分组的测试,请使用以下命令:

adb shell am instrument -w -e numShards 10 -e shardIndex 2

2个回答

18

测试分片允许您将测试平均分成多组。分片索引是您正在运行的“百分比”组的指数。如何划分这些组是任意的,因为分片的目的是并行化您的测试。

例如,假设您有60个测试需要运行,每个测试需要1分钟才能完成。如果您在单个设备上运行所有测试,则需要1小时才能完成。现在,假设您想通过在同时在两个设备上运行一半的测试来加快测试速度,从而仅花费30分钟。

您可以通过并行运行以下ADB命令来实现此目的。

adb -s DEVICE_1_SERIAL shell am instrument -w -e numShards 2 -e shardIndex 0 > device_1_results // Runs first half of the tests
adb -s DEVICE_2_SERIAL shell am instrument -w -e numShards 2 -e shardIndex 1 > device_2_results // Runs second half of the tests

您现在将60个测试分配到两个设备上,均匀分配负载后仅用30分钟便完成了所有测试,并且现在可以处理结果。

想要了解其工作原理的详细信息,请查看TestRequestBuilder.java内部的ShardingFilter。


8
你也可以通过Gradle命令来实现这一点。如果你使用Gradle任务来运行单元测试或UI测试,下面的命令将允许你根据分片号和索引来过滤测试。
ANDROID_SERIAL=emulator-5554 ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.numShards=3 -Pandroid.testInstrumentationRunnerArguments.shardIndex=0

ANDROID_SERIAL的值可以更改为从adb devices获取的设备ID。


我们如何在不同的模拟器上并行运行碎片?比如 emulator-5554 和 emulator-5556,numShards=2。我想要在 emulator-5554 上运行碎片索引 0,在 emulator-5556 上运行碎片索引 1。或者有没有一种提供模拟器列表和碎片编号的方法? - Kavitha
1
我尝试过的唯一方法是打开两个终端窗口,并在其中一个窗口中运行以下命令。如果进行dex合并,则可能会失败。我通常通过Jenkins运行它,我在两个不同的从机上运行这两个分片。ANDROID_SERIAL=emulator-5554 ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.numShards=2 -Pandroid.testInstrumentationRunnerArguments.shardIndex=0ANDROID_SERIAL=emulator-5556 ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.numShards=2 -Pandroid.testInstrumentationRunnerArguments.shardIndex=1 - Amrinder Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接