JBT*_*JBT 8 java groovy junit gradle
我正在试验Gradle并行运行测试的能力.我发现的主要设置是测试任务的maxParallelForks属性.我希望该设置的行为类似于执行测试.即,固定数量的线程(Gradle的情况下的进程)同时执行; 只要一个线程完成工作,就会在池中激活一个新线程.Executors.newFixedThreadPool
但是,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
}
}
Run Code Online (Sandbox Code Playgroud)
快速类(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
}
}
Run Code Online (Sandbox Code Playgroud)
所有类都在包中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
Run Code Online (Sandbox Code Playgroud)
如您所见,慢类DemoTest被分为两个快速类.如果将快速类组合在一起,则总运行时间约为13秒,可能是10秒.
那么,有没有直接的方法在Gradle中优化这种行为而不需要使用自定义JUnit运行器?
非常感谢你.
| 归档时间: |
|
| 查看次数: |
2054 次 |
| 最近记录: |