Łuk*_*mek 15 junit instrumentation android sharding adb
我在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)
Run Code Online (Sandbox Code Playgroud)
如您所见,adb将测试分成两个不均匀的组.第二个测试的测试次数是第一个的两倍,执行时间是原来的两倍.如果你问我,不是最好的并行性.
是否有可能控制测试的分布,或至少强制adb平均分割测试?
让我们来看看吧.
启动测试套件时,TestRequestBuilder是基于JUnitFilters构建的.ShardingFilter是其中之一,并添加.添加它意味着先前添加的Filter是与新的"交叉" - public boolean shouldRun(Description description)调用方法.如果你看一下,更有可能在这个片段:
if (description.isTest()) {
return (Math.abs(description.hashCode()) % mNumShards) == mShardIndex;
}
Run Code Online (Sandbox Code Playgroud)
用你的数字代替(numShards=2),你会注意到,这只是一个奇偶校验测试.在统计上可能会发生,生成的HashCode奇偶校验分布不是50%.此外,当您的测试类上的某些测试被忽略,禁用并与启用的测试交织时,您甚至可以更多地干扰特定方法hashcode(JunitDescription uniqueId是从方法和类名生成的).
这只是统计问题.正如您在此答案中看到的那样:
如何分组是任意的
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |