为了账号安全,请及时绑定邮箱和手机立即绑定

使用 gradle 并行运行 JUnit4 测试

使用 gradle 并行运行 JUnit4 测试

POPMUISE 2022-05-25 17:29:19
我想使用 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 :testse.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT    Start 2 secondsse.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT    Start 4 secondsse.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT    Done 2 secondsse.thinkcode.ManyTest > should_sleep_1_seconds STANDARD_OUT    Start 1 seconds    Done 1 secondsse.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT    Done 4 secondsBUILD SUCCESSFUL in 5s3 actionable tasks: 3 executed这告诉我存在并行性,但它仅在类级别,而不是方法级别。是否有任何本机方法可以让 Gradle 每个测试方法在一个线程中执行?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超5个赞

不能使用 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 用户指南 - 并行执行。


查看完整回答
反对 回复 2022-05-25
?
弑天下

TA贡献1818条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-05-25
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

不幸的是,gradle 仍然不支持这个功能。

PS maxParallelForks 的数量应该以这种方式计算出来:

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


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 521 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号