我在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将测试分开?
答案 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%。此外,当您的测试类上的某些测试被忽略,禁用并与启用的测试交织时,您可能会更加干扰特定方法hashcode
(Junit Description
uniqueId
是从方法生成的班级名称)。
这只是统计问题。正如您在this answer中看到的那样:
如何分组是