gpt4 book ai didi

java - Gradle:优化并行运行的测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:52 25 4
gpt4 key购买 nike

我正在试验 Gradle 并行运行测试的功能。我发现的主要设置是 TestmaxParallelForks 属性任务。我预计该设置的行为类似于 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
}
}

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

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 秒,如果将快速类(class)组合在一起,则可能为 10 秒。

那么,有没有什么直接的方法可以在不借助自定义 JUnit 运行器的情况下优化 Gradle 中的这种行为?

非常感谢。

最佳答案

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

关于java - Gradle:优化并行运行的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22737495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com