Geb, Spock, Gradle и maxParallelForks - PullRequest
       68

Geb, Spock, Gradle и maxParallelForks

0 голосов
/ 12 февраля 2019

У меня возникли проблемы с пониманием проблемы, которая возникает у нас с нашими тестами Geb / Spock.Мы используем gradle и пытаемся запустить наши тесты параллельно.Насколько я понимаю, свойство maxParallelForks в gradle будет запускать тест классы в отдельных JVM.

Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня есть 6 тестовых классов и я установил для maxParallelForks значение 4, при запуске теста я получу 4 тестовых класса, работающих параллельно.Потрясающие!Но последние 2 класса - вот где проблема.Скажем, из первых 4 занятий в классе 2 занятия проводятся за 1 минуту, а 2 занятия - за 5 минут.То, что я вижу вместо того, чтобы первые 2 заканчивали и начинали следующие 2 класса, похоже, что оно ждет, пока последние 2 длительных класса не закончат, прежде чем раскрутить другие вилки.Это далеко не идеально.

Я что-то неправильно понимаю или я где-то пропускаю собственность?Вот что у меня в build.gradle:

tasks.withType(Test) {
   systemProperties System.properties
   maxParallelForks = 4
   forkEvery = 1 
}

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Используя наборы JUNIT, вы можете решить, какой набор классов должен быть выбран конкретным форком.

import org.junit.runner.RunWith
import org.junit.runners.Suite

@RunWith(Suite.class)
@Suite.SuiteClasses([
    TimeTaking.class, // Class that takes a lot of time
    NotSoMuchTimeTaking.class, //Class that is quick
// Add more test classes which need to be executed in same fork.  
])

public class FirstTestSuite { // keep this empty
}

Аналогичным образом создайте SecondTestSuite {} и т. Д.

ВВ дополнение к вышеперечисленным шагам, включите * TestSuite.class в свой build.gradle

tasks.withType(Test) {
systemProperties System.properties
maxParallelForks = 4
forkEvery = 1  
include '**/*TestSuite*.class'
}     

Таким образом, вы сможете контролировать выполнение и решать, какие классы тестов должны выполняться в каком порядке.

0 голосов
/ 12 февраля 2019

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

С другой стороны - вы не хотитеделать forkEvery = 1 - это будет перезапускать ваши тестовые jvms после каждого тестового класса, замедляя выполнение теста без всякой выгоды.

...