ConnectedAndroidTest на нескольких эмуляторах

Фон

Я хочу запустить тесты на Android Instrumented на Jenkins на разных эмуляторах. Скажем, у меня есть 100 тестов и 4 эмулятора, я хочу выполнить 25 тестов для каждого.

Я выполняю ./gradlew connectedDebugAndroidTest в Jenkins Pipeline параллельно для 4 эмуляторов

stage('Instrumented Tests') {
    parallel(
            emu1: {
                 runInstrumentedTestOnEmu(...)
            },
            emu2: {
                 runInstrumentedTestOnEmu(...)
            }
            ...
    )
}

connectedDebugAndroidTest будет порождать другие команды, чтобы настроить среду для запуска инструментальных тестов.

...
:app:transformNativeLibsWithMergeJniLibsForDebugAndroidTest
:app:processDebugAndroidTestJavaRes NO-SOURCE
:app:transformResourcesWithMergeJavaResForDebugAndroidTest
:app:validateSigningDebugAndroidTest
:app:packageDebugAndroidTest
:app:assembleDebugAndroidTest
:app:connectedDebugAndroidTest

И когда среда готова, она выполняет :app:connectedDebugAndroidTest, которая начнет выполнение тестов на эмуляторе.

Я не хочу запускать эту процедуру для всех своих параллельных вызовов (в этом случае это будет 4 из них), потому что, очевидно, я выполняю то же самое задание несколько раз. Теоретически лучшим вариантом было бы выполнить настройку до parallel, и когда все будет готово для запуска тестов, перейдите к шагу parallel и начните тесты на каждом эмуляторе.

Вопрос

Возможно ли выполнить все шаги предварительной настройки connectedDebugAndroidTest без выполнения самого себя?

Кроме того, если я запускаю connectedDebugAndroidTest parallel на 4 эмуляторах, сборка сработает, потому что gradle пытается прочитать файл из каталога intermediate, когда другая параллельная сборка уже удалила этот файл, что приводит к сбою.

Вы можете просмотреть этот тестовый проект в github с настройкой, упомянутой выше.

Ответ 1

Возможно ли выполнить все шаги предварительной настройки подключенногоDebugAndroidTest без выполнения самой функции?

Да, вы можете запустить assembleDebugAndroidTest, который, как показывает журнал сборки, является последним предварительным условием для запуска тестов устройства. Запустив это, будут созданы как APK приложения, так и APK.

Несмотря на AFAIK, при использовании Gradle не существует способа очертить ваши тесты на нескольких эмуляторах, вам нужно будет установить оба APK на каждый эмулятор и использовать adb shell am instrument с помощью numShards и shardIndex.