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 создается из имени метода и класса).

Это просто статистика. Как вы можете видеть в этом ответе:

Как разделяются группы, произвольно