我正在尝试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运行器?
非常感谢。
答案 0 :(得分:1)
这只能通过更改Gradle代码库来优化。