Фон
Я хочу запустить тесты 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 с настройками, указанными выше.