2016-03-12 3 views
9

Я искал ответы за последние несколько дней и не смог его найти. Самый близкий ответ, который я мог найти, - this, который точно не отвечает на мои вопросы.Параллельное тестовое выполнение с использованием Gradle maxParallelForks свойство

Кстати, у меня есть проект испытаний на селен, который основан на Gradle. Мы строим проект на Jenkins, который запускает тесты в 20 параллельных потоках. Общее число уникальных тестовых классов, которые у меня есть, - 87. Итак, я ожидаю, что gradle выработает не менее 5 партий. Проект тестирования строится с использованием JVM Cucumber, строит и запускает тесты Jenkins в Selenium Hub. Я попытался увеличить параллельность тестов, используя как можно больше сетку. Но проблема началась, когда число тестов начало расти.

Когда я начал тесты у Дженкинса, я заметил, что сначала выстрел прошел все 20 тестовых процессов, и я вижу, что вторая партия также началась с того же количества процессов. После второй партии процессы возвращались в единый режим, и для выполнения всего задания потребовалось 14 часов, что привело к неудаче в попытке выполнить параллельное тестирование.

Gradle свойства:

jvmArgs '-Xms128m', '-Xmx1024m', '-XX:MaxPermSize=128m' 
Runtime.runtime.availableProcessors().toString()) as int   
maxParallelForks = PropertyUtils.getProperty('test.parallel', '15') as int 
forkEvery = PropertyUtils.getProperty('test.forkEvery', '0') as int 

CLI:

gradle clean test -Dtest.single=*TestRun --info 

Я прочитал все документы, я могу возможно найти, но не смог получить ответ. Был бы рад, если кто-то может помочь мне с этими вопросами.

1. Как Gradle выставляет тестовый бегун внутри? Например, если запущено 20 исполнителей и тест 1,2,3 выполняется быстрее других, выполняются ли три исполнителя еще три класса тестов или ждут завершения выполнения всего пакета?

2. Может ли forkEvery влиять на то, как выполнение выполняется во время параллельного тестирования?

Дженкинс войти

Успешно начал процесс 'Gradle Тест Исполнитель 6'

Успешно начал процесс 'Gradle испытаний Исполнитель 13'

Успешно начал процесс 'Gradle Тест Исполнитель 14'

Успешно начатый процесс «Испытание протекторов 5»

Успешно начал процесс 'Gradle Тест Исполнитель 16'

Успешно начал процесс 'Gradle Тест Исполнитель 8'

Успешно начал процесс 'Gradle Тест Исполнитель 19'

Успешно начал процесс «Gradle Тест Executor 4 '

Успешно начал процесс 'Gradle Тест Исполнитель 2'

Успешно начал процесс' Gradle Тест Исполнитель 11'

Успешно начал процесс 'Gradle Тест Исполнитель 10'

Успешно начал процесс 'Gradle Тест Исполнитель 18'

Успешно начал процесс 'Gradle Тест Исполнитель 1'

Успешно начал процесс " Gradle Тест Исполнитель 20'

Успешно начал процесс 'Gradle Тест Executor 7'

Успешно начал процесс 'Gradle Тест Executor 9'

Успешно начал процесс 'Gradle Тест Исполнитель 3'

Успешно начал процесс 'Gradle Тест Executor 15'

Успешно начал процесс 'Gradle испытания Исполнителя 17' ​​

Успешно запущенный процесс «Тест-драйв-исполнитель 12»

Исполнительный экзамен 13 был запущен.

Исполнительный экзамен Gradle 14 исполнил тесты.

Исполнительный экзамен Gradle Test 6 начал выполнение тестов.

Исполнительный экзамен 5-го поколения начал выполнять испытания.

Исполнительный экзамен Gradle 16 начал выполнение тестов.

Исполнительный экзамен Gradle 19 исполнил тесты.

Исполнительный экзамен Gradle 8 исполнил тесты.

Исполнительный экзамен Bradle Test 4 начал выполнение тестов.

Исполнительный экзамен Gradle 2 исполнил тесты.

Исполнительный экзамен Gradle Test 10 начал выполнение тестов.

Исполнительный экзамен 11-го класса начал выполнять испытания.

Исполнительный экзамен Gradle 18 исполнил тесты.

Исполнительный экзамен Gradle Test 1 начал выполнение тестов.

Исполнительный экзамен Gradle 20 исполнил тесты.

Исполнительный экзамен Gradle 7 исполнил тесты.

Исполнительный экзамен 3-го уровня начал выполнять испытания.

Исполнительный экзамен Gradle 9 исполнил тесты.

Исполнительный экзамен Gradle 17 начал выполнение тестов.

Исполнительный экзамен 15-го поколения начал выполнять испытания.

Исполнительный экзамен 12-го класса начал выполнять испытания.

+0

Вы знаете, что работает 20 браузеров (при условии, что селен), вероятно, будет медленнее, чем 1? –

+0

@tim_yates true. Но я использую селеновую сетку и несколько машин. Это ты имел в виду? – Saifur

ответ

3

по умолчанию forkEvery 0

Согласно the documentation forkEvery является

Максимальное количество тестовых классов для выполнения в раздвоенным процессе тестирования. Процесс раздвоения будет перезапущен, когда этот предел будет достигнут. Значение по умолчанию равно 0 (без максимума).

Таким образом, градация (и, вероятно, junit) будет развиваться по классам, а не испытаниям внутри класса. Похоже, что некоторые из 87 тестовых классов имеют длительные тесты или большое количество тестов, и они попадают в один разветвленный тестовый процесс. Я бы рассмотрел установку forkEvery на 1. Это обеспечит отправку каждого тестового класса на новую вилку. Если по-прежнему существует проблема, вам может потребоваться найти, какие тестовые классы занимают больше всего времени. Рассмотрите разделение этих классов на меньшие группы тестов, чтобы тесты распределялись по каждому jvm. Если это один тест, который навсегда требует пересмотра его и, возможно, создания меньших тестов.

Я не верю, что градл проходит тесты партиями. Когда рабочий становится доступным, он берет тестовый класс из очереди оставшихся тестов. Вам действительно нужно будет посмотреть, как работает JUnit, поскольку я уверен, что градл просто передает эти конфигурации JUnit.

Смежные вопросы