使用 gradle 运行并行测试任务
Posted
技术标签:
【中文标题】使用 gradle 运行并行测试任务【英文标题】:Run parallel test task using gradle 【发布时间】:2014-07-11 10:29:34 【问题描述】:我们使用 JUnit 作为测试框架。我们有很多项目。我们使用 gradle(1.12 版)作为构建工具。为了使用 gradle 并行运行单元测试,我们在每个被测项目中使用以下脚本。
maxParallelForks = Runtime.runtime.availableProcessors()
例如:
test
maxParallelForks = Runtime.runtime.availableProcessors()
我们还维护单个 gradle.properties 文件。
是否可以在 gradle.properties 文件中定义 test.maxParallelForks = Runtime.runtime.availableProcessors() 而不是在 test 任务下的每个 build.gradle 文件中定义它?
【问题讨论】:
【参考方案1】:上面接受的答案有效,但 Gradle 文档 here 建议您使用
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
我在配备 16GB RAM(4 核超线程)的 2.3 GHz Intel Core i7 Mac Book Pro 上都进行了测试和测试之后
test
maxParallelForks = Runtime.runtime.availableProcessors()
和
test
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
Gradle 文档建议的方法为我们的单元测试套件产生了更快的响应时间:7 分钟对 8 分钟(与原来的 13 分钟相比)。此外,我的 Mac CPU 没有固定,风扇也没有启动。
我假设共享资源存在争用 - 即使它只是我们正在运行单元测试的机器。
【讨论】:
1 个超线程内核!= 2 个物理内核。因此 intDiv(2) 将您限制在超线程 CPU(例如 i7)上的物理核心数。缺点是在 4 核非超线程机器上,您最终将有 2 个内核未用于测试运行。 没错,但仅仅因为未使用核心并不意味着测试会运行得更快。 . . .取决于机器上正在运行的其他内容 maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 在我的 MackBook 6-Core i7 中几乎使运行时间减半【参考方案2】:$rootDir/build.gradle
:
subprojects
tasks.withType(Test)
maxParallelForks = Runtime.runtime.availableProcessors()
【讨论】:
仅供参考 gradle 文档建议不要使用所有可用的内核 gradle.github.io/performance-guide/#_parallel_test_execution 请参阅下面的答案 上面的链接失效了。试试docs.gradle.org/current/userguide/… 以下是我得到的错误。错误:(69, 0) 无法为 org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer 类型的配置容器设置未知属性“maxParallelForks”。 打开文件 是否可以在同一个JVM中并行运行测试? @Capacytron 是: threadCount Runtime.runtime.availableProcessors()
事实上,应该优先于 maxParallelForks,因为多线程比多处理更有效。【参考方案3】:
对于我们这些在 build.gralde.kts 中使用 Gradle Kotlin DSL 并在 google 搜索后发现自己在这里的人,我能够让它以这种方式工作:
tasks.test
maxParallelForks = Runtime.getRuntime().availableProcessors()
或
tasks.withType<Test>
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf it > 0 ?: 1
我发现here
编辑:我遇到了here 描述的一些问题。这是(希望)我的最终形式:
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
【讨论】:
以上是关于使用 gradle 运行并行测试任务的主要内容,如果未能解决你的问题,请参考以下文章
text 用于测试gradle并行测试。和`-t`参数继续运行测试。