繁体   English   中英

使用gradle并行运行JUnit4测试

[英]Run JUnit4 tests parallel using gradle

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

除了类之外,不可能使用Gradles JUnit 4 runner来并行运行测试。

我无法确认这是否有效,但您可能想要从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仍然不支持此功能。

应该通过这种方式计算PS的maxParallelForks数量:

maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1

在Gradle中不可能 (还有?) 最好的水平是其中的类 Maven的Surefire插件可以深入到方法级别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM