Gradle:并行优化运行测试

时间:2014-03-29 22:04:08

标签: java groovy junit gradle

我正在尝试Gradle并行运行测试的功能。我找到的主要设置是Test任务的maxParallelForks属性。我希望该设置的行为类似于使用Executors.newFixedThreadPool来执行测试。即,固定数量的线程(Gradle的情况下的进程)同时执行;只要一个线程完成工作,就会在池中激活一个新线程。

然而,Gradle的行为在不太理想的情况下根本不同。看起来Gradle将测试类划分为等于组的maxParallelForks的数字,然后Gradle为每个组生成一个进程并让这些进程并行执行。这个策略的问题很明显:它无法根据测试类所需的时间动态调整执行。

例如,假设您有5个类,maxParallelForks设置为2.在五个类中,速度较慢,其余类相对较快。一个理想的策略是让一个进程执行慢速进程而另一个进程快速执行。但是,Gradle所做的是将缓慢的一个与一个或两个快速组合在一起,并产生两个进程来执行两组类,这当然不如理想情况那么优化。

这是一个简单的演示。

慢班:

class DemoTest {
    @Test
    void one() {
        Thread.sleep( 5000 )
        println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
        assert 1 == 1
    }

    @Test
    void two() {
        Thread.sleep( 5000 )
        println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
        assert 1 == 1
    }
}

快速课程(DemoTest2-4,具有相同的课程主体):

class DemoTest2 {
    @Test
    void one() {
        Thread.sleep( 1000 )
        println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
        assert 1 == 1
    }

    @Test
    void two() {
        Thread.sleep( 1000 )
        println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
        assert 1 == 1
    }
}

所有类都在包junit中,它恰好与着名的测试框架同名: - )

这是一个可能的输出:

junit.DemoTest2 > one STANDARD_OUT
    2: 14:54:00

junit.DemoTest2 > two STANDARD_OUT
    2: 14:54:01

junit.DemoTest4 > one STANDARD_OUT
    2: 14:54:02

junit.DemoTest4 > two STANDARD_OUT
    2: 14:54:03

junit.DemoTest > one STANDARD_OUT
    3: 14:54:04

junit.DemoTest > two STANDARD_OUT
    3: 14:54:09

junit.DemoTest3 > one STANDARD_OUT
    3: 14:54:10

junit.DemoTest3 > two STANDARD_OUT
    3: 14:54:11

junit.DemoTest5 > one STANDARD_OUT
    3: 14:54:12

junit.DemoTest5 > two STANDARD_OUT
    3: 14:54:13

如您所见,慢类DemoTest分为两个快速类。如果将快速类组合在一起,则总运行时间约为13秒,可能是10秒。

那么,是否有任何直接的方法可以在Gradle中优化此行为而无需使用自定义JUnit运行器?

非常感谢。

1 个答案:

答案 0 :(得分:1)

这只能通过更改Gradle代码库来优化。