使用gradle运行并行测试任务

Jav*_*kar 26 junit gradle build.gradle

我们使用Junit作为测试框架.我们有很多项目.我们使用gradle(版本1.12)作为构建工具.要使用gradle并行运行单元测试,我们在测试任务的每个项目中使用波纹管脚本.

maxParallelForks = Runtime.runtime.availableProcessors()
Run Code Online (Sandbox Code Playgroud)

例如:

 test {    
         maxParallelForks = Runtime.runtime.availableProcessors()       
    }
Run Code Online (Sandbox Code Playgroud)

我们还维护单个gradle.properties文件.是否可以在gradle.properties文件中定义test.maxParallelForks = Runtime.runtime.availableProcessors(),而不是在测试任务下的每个build.gradle文件中定义?

Pet*_*ser 38

$rootDir/build.gradle:

subprojects {
    tasks.withType(Test) {
        maxParallelForks = Runtime.runtime.availableProcessors()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 gradle 文档建议不要使用所有可用的内核 https://gradle.github.io/performance-guide/#_parallel_test_execution 请参阅下面的答案 (2认同)
  • 上面的链接不起作用.试试https://docs.gradle.org/current/userguide/java_plugin.html#sec:test_execution (2认同)

kel*_*yfj 34

上面接受的答案有效,但此处的gradle文档建议您使用

maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
Run Code Online (Sandbox Code Playgroud)

我试过两个并且在2.3 GHz英特尔酷睿i7 Mac Book Pro上测试了16GB RAM(4核超线程)

test {
    maxParallelForks = Runtime.runtime.availableProcessors()
}
Run Code Online (Sandbox Code Playgroud)

test {    
    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1      
}
Run Code Online (Sandbox Code Playgroud)

Gradle文档建议的方法为我们的单元测试套件产生了更快的响应时间:7分钟与8分钟(与原始的13分钟相比).此外,我的Mac CPU没有被钉住,风扇也没有启动.

我假设在共享资源上存在争用 - 即使它只是我们运行单元测试的机器.

  • 1个具有超线程功能的内核!= 2个物理内核。因此intDiv(2)将您限制在诸如i7之类的超线程CPU上的物理内核数上。缺点是在4核非超线程计算机上,最终将有2个未使用的核用于测试运行。 (2认同)

Nar*_*pai 7

对于我们这些在 build.gralde.kts 中使用 Gradle Kotlin DSL 的人,他们在谷歌搜索后发现自己在这里,我能够让它以这种方式工作:

tasks.test {
    maxParallelForks = Runtime.getRuntime().availableProcessors()
}
Run Code Online (Sandbox Code Playgroud)

或者

tasks.withType<Test> {
        maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
}
Run Code Online (Sandbox Code Playgroud)

正如我在这里找到的

编辑:我遇到了一些问题,如描述在这里。这是(希望)我的最终形式:

tasks.withType<Test> {
     systemProperties["junit.jupiter.execution.parallel.enabled"] = true
     systemProperties["junit.jupiter.execution.parallel.mode.default"] = "concurrent" 
     maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
}
Run Code Online (Sandbox Code Playgroud)