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