Запускать тесты JUnit4 параллельно, используя gradle - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы запускать тесты параллельно, используя Gradle.Мои эксперименты показывают, что Gradle запускает тесты параллельно на уровне класса.Мне нужно, чтобы они выполнялись на уровне метода.

Имеется два таких тестовых класса:

public class OneTest {
    @Test
    public void should_sleep_4_seconds() throws Exception {
        System.out.println("Start 4 seconds");
        Thread.sleep(4000);
        System.out.println("Done 4 seconds");
    }
}
public class ManyTest {

    @Test
    public void should_sleep_1_seconds() throws Exception {
        System.out.println("Start 1 seconds");
        Thread.sleep(1000);
        System.out.println("Done 1 seconds");
    }

    @Test
    public void should_sleep_2_seconds() throws Exception {
        System.out.println("Start 2 seconds");
        Thread.sleep(2000);
        System.out.println("Done 2 seconds");
    }
}

И такой скрипт сборки:

plugins {
    id 'java'
}

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

dependencies {
    testCompile 'junit:junit:4.12'
}

test {
    testLogging.showStandardStreams = true
    maxParallelForks = 3
}

repositories {
    mavenCentral()
}

Я могу получить такой результат:

./gradlew clean test

> Task :test

se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
    Start 2 seconds

se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
    Start 4 seconds

se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
    Done 2 seconds

se.thinkcode.ManyTest > should_sleep_1_seconds STANDARD_OUT
    Start 1 seconds
    Done 1 seconds

se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
    Done 4 seconds

BUILD SUCCESSFUL in 5s
3 actionable tasks: 3 executed

Это говорит мне, что есть параллелизм, но он только на уровне класса, а не на уровне метода.

Есть ли какой-нибудь нативный способ сделать Gradleвыполнить выполнение в одном потоке для каждого метода тестирования?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

К сожалению, Gradle по-прежнему не поддерживает эту функцию.

PS количество maxParallelForks должно быть вычислено в таким образом :

maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
0 голосов
/ 30 января 2019

Это невозможно (пока?) В Gradle.Самый лучший уровень - классы , где Плагин Maven Surefire может опуститься до методов уровень

0 голосов
/ 30 января 2019

Невозможно использовать бегун Gradles JUnit 4 для параллельного запуска тестов для чего-либо, кроме классов.

Я не могу подтвердить, что это работает, но вы можете попробовать JUnit Platform + JUnit Vintage от JUnit5. Посмотрите на JUnit 5 стартеров , чтобы увидеть, как его настроить.

dependencies {
    def junit4Version = '4.12'
    def junit5Version = '5.3.2'
    implementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) {
        because 'enforce matching Platform, Jupiter, and Vintage versions'
    }

    // JUnit Jupiter
    testImplementation('org.junit.jupiter:junit-jupiter-api')
    testImplementation('org.junit.jupiter:junit-jupiter-params')
    testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') {
        because 'allows JUnit 5 (read Jupiter) tests to run'
    }

    // JUnit Vintage
    testImplementation("junit:junit:${junit4Version}")
    testRuntimeOnly('org.junit.vintage:junit-vintage-engine') {
        because 'allows JUnit 3 and JUnit 4 tests to run'
    }
}

Затем вы можете добавить junit.jupiter.execution.parallel.enabled=true к junit-platform.properties, чтобы включить параллельное выполнение.См. Руководство пользователя JUnit 5 - Параллельное выполнение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...