使用 gradle 并行运行 JUnit4 测试

我想使用 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 每个测试方法在一个线程中执行?


POPMUISE
浏览 522回答 3
3回答

收到一只叮咚

不能使用 Gradles JUnit 4 运行器为类以外的任何东西并行运行测试。我无法确认这是否有效,但您可能想尝试 JUnit 5 中的 JUnit Platform + JUnit Vintage。查看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 用户指南 - 并行执行。

弑天下

在 Gradle 中这是不可能的(还?)。最好的级别是Maven Surefire插件可以下降到方法级别的类

慕的地6264312

不幸的是,gradle 仍然不支持这个功能。PS maxParallelForks 的数量应该以这种方式计算出来:maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java