【问题标题】:Run parallel test task using gradle使用 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 文件中定义它?

【问题讨论】:

    标签: junit gradle 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2015-12-28
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多