Junit 使用gradle运行并行测试任务

Junit 使用gradle运行并行测试任务,junit,gradle,build.gradle,Junit,Gradle,Build.gradle,我们使用JUnit作为测试框架。我们有很多项目。我们使用gradle(版本1.12)作为构建工具。为了使用gradle并行运行单元测试,我们在测试任务下的每个项目中使用下面的脚本 maxParallelForks = Runtime.runtime.availableProcessors() 例: 我们还维护单个gradle.properties文件 是否可以在gradle.properties文件中定义test.maxParallelForks=Runtime.Runtime.availab

我们使用JUnit作为测试框架。我们有很多项目。我们使用gradle(版本1.12)作为构建工具。为了使用gradle并行运行单元测试,我们在测试任务下的每个项目中使用下面的脚本

maxParallelForks = Runtime.runtime.availableProcessors()
例:

我们还维护单个gradle.properties文件


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

subprojects {
    tasks.withType(Test) {
        maxParallelForks = Runtime.runtime.availableProcessors()
    }
}

上述公认的答案可行,但Gradle文档建议您使用


maxpallelforks=Runtime.Runtime.availableProcessors().intdiv(2)?:1
我在2.3 GHz Intel Core i7 Mac Book Pro上尝试了这两种方法,并在测试后使用了16GB RAM(4核超读)

测试{

maxParallelForks=Runtime.Runtime.availableProcessors() }

test{

maxParallelForks=Runtime.Runtime.availableProcessors().intdiv(2)?:1 }
Gradle文档建议的方法为我们的单元测试套件提供了更快的响应时间:7分钟,而不是8分钟(与最初的13分钟相比)。此外,我的Mac CPU没有被锁定,风扇也没有启动


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

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

tasks.test {
    maxParallelForks = Runtime.getRuntime().availableProcessors()
}

tasks.withType{
maxParallelForks=(Runtime.getRuntime().availableProcessors()/2).takeIf{it>0}?:1
}
我发现

编辑:如前所述,我遇到了一些问题。这是(希望)我的最终表格:

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
}
tasks.withType{
systemProperties[“junit.jupiter.execution.parallel.enabled”]=true
systemProperties[“junit.jupiter.execution.parallel.mode.default”]=“并发”
maxParallelForks=(Runtime.getRuntime().availableProcessors()/2).takeIf{it>0}?:1
}

FYI gradle文档建议不要使用所有可用的内核。请参见下面的我的答案。上面的链接不起作用。下面是我得到的错误。错误:(69,0)无法为类型为org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer的配置容器设置未知属性“maxParallelForks”。可以在同一个JVM中并行运行测试吗2个物理核心。因此intDiv(2)将您限制为超线程cpu(如i7)上的物理内核数。缺点是在一台4核非超线程机器上,您最终将有2个核未用于测试运行。确实如此,但仅仅因为核未使用并不意味着测试将运行得更快。根据机器上运行的其他内容,xparallelworks=Runtime.Runtime.availableProcessors().intdiv(2)?:在我的MacBook 6-Core i7中,1几乎将运行时间缩短了一半
tasks.withType<Test> {
        maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
}
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
}