Android weird test sharding
Я экспериментирую с тестированием на 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 разделил тесты на две неравномерные группы. Второй имеет в два раза больше тестов, чем первый, и выполняет в два раза больше. Не лучший parallelism, если вы спросите меня.
Есть ли возможность контролировать распределение тестов или, по крайней мере, заставить adb равномерно распределять тесты?
Ответы
Ответ 1
Проследите его.
Когда набор тестов запущен, TestRequestBuilder
построен на JUnit Filters
. ShardingFilter
является одним из них и добавлен. Добавление этого означает, что ранее добавленный Filter
был "intersected" с новым методом - public boolean shouldRun(Description description)
. Если вы посмотрите на него, скорее всего на этот фрагмент:
if (description.isTest()) {
return (Math.abs(description.hashCode()) % mNumShards) == mShardIndex;
}
И подставляя свои номера (numShards=2
), вы заметите, что это всего лишь тест на четность. По статистике это может случиться, что сгенерированное распределение четности HashCode не составляет 50%. Более того, когда некоторые тесты на вашем тестовом классе игнорируются, отключены и переплетены с включенными тестами, вы можете даже больше беспокоить конкретный метод hashcode
(Junit Description
uniqueId
создается из имени метода и класса).
Это просто статистика. Как вы можете видеть в этом ответе:
Как разделяются группы, произвольно