Android奇怪的测试分片

时间:2017-07-31 14:34:42

标签: android junit adb sharding instrumentation

我在Android上尝试测试分片,我得到了非常奇怪的结果:

+ adb -s emulator-5580 shell am instrument -e numShards 2 -e shardIndex 0 -e class com.package.etc.automation.Tests.SanityTest.SanityTest -w com.package.etc.test/android.support.test.runner.AndroidJUnitRunner

com.package.etc.automation.Tests.SanityTest.SanityTest:..........

Time: 306.578

OK (10 tests)


+ adb -s emulator-5582 shell am instrument -e numShards 2 -e shardIndex 1 -e class com.package.etc.automation.Tests.SanityTest.SanityTest -w com.package.etc.test/android.support.test.runner.AndroidJUnitRunner

com.package.etc.automation.Tests.SanityTest.SanityTest:......................

Time: 645.723

OK (22 tests)

如您所见,adb将测试分成两个不均匀的组。第二个测试的测试次数是第一个的两倍,执行时间是原来的两倍。如果你问我,那不是最好的并行性。

是否有可能控制测试的分布,或者至少强制adb将测试分开?

1 个答案:

答案 0 :(得分:6)

让我们追查它。

当测试套件为started时,TestRequestBuilder建立在JUnit Filters之上。 ShardingFilter是其中之一,is added。添加它意味着之前添加的Filter "intersected"为新的{ - 3}} - 方法public boolean shouldRun(Description description)被调用。如果你看一下,更有可能在这个片段:

if (description.isTest()) {
    return (Math.abs(description.hashCode()) % mNumShards) == mShardIndex;
}

用您的数字(numShards=2)代替,您会注意到,这只是一个奇偶校验测试。在统计上可能会发生,生成的HashCode奇偶校验分布不是50%。此外,当您的测试类上的某些测试被忽略,禁用并与启用的测试交织时,您可能会更加干扰特定方法hashcodeJunit Description uniqueId是从方法生成的班级名称)。

这只是统计问题。正如您在this answer中看到的那样:

  

如何分组是