testing - 什么限制了 Gradle 构建中的活跃工作人员数量?

标签 testing gradle spock

我正在尝试在我的笔记本电脑上并行运行测试,它有 4 个物理 CPU 和 8 个逻辑 CPU。

➜  sysctl -n hw.ncpu
8
➜  sysctl -n hw.physicalcpu
4

我想并行运行最多 4 个测试。
这是我正在运行的命令:

./gradlew remoteChromeTest -Pparallel=4 --continue --max-workers=8

parallel 属性进入 Test 任务的 maxParallelForks

不过,Gradle 似乎最多同时占用 4 个 worker(其中一个 似乎 是为构建本身保留的),这与物理 CPU 的数量一致(不确定这是否重要).

输出看起来像这样:

> Task :remoteChromeTest
Running tests in parallel using 4 processes.
<============-> 92% EXECUTING [12s]
> :remoteChromeTest > 0 tests completed
> :remoteChromeTest > Executing test spec.Spec1
> IDLE
> :remoteChromeTest > Executing test spec.Spec2
> :remoteChromeTest > Executing test spec.Spec3

因此,只有 3 个测试并行运行。

我在这里错过了什么?文档表明这可能会超过实际 CPU 的数量。奇怪的是,其中一名工作人员显示为 IDLE

我在另一台只有 2 个物理内核的机器上得到了相同的行为,并且仅限于两个进程,即根本没有并行执行。

为什么一个 worker IDLE

最佳答案

--max-workers不仅用于测试执行,还用于并行项目执行。但是,在示例中,您将测试执行并行度限制为 4。尝试设置 maxParallelForks超过 4,您将在测试执行中看到更多的并行性。但无论如何,它将被限制在测试次数和 --max-workers 之间的最小值。

您还可以使用 --parallel 启用并行项目执行选项。同样,构建并行度(包括测试并行度)将限制为 --max-workers:

subprojects {
    tasks.withType(Test) {
        maxParallelForks = 8
    }
}
gradle clean build --parallel --max-workers=6
...
<<===========--> 85% EXECUTING [15s]
>> :module-1:test > 4 tests completed
>> :module-2:test > 2 tests completed
>> :module-2:test > Executing test so.Module2Spec3
>> :module-2:test > Executing test so.Module2Spec1
>> :module-1:test > Executing test so.Module1Spec4
>> :module-1:test > Executing test so.Module1Spec2
>> :module-1:test > Executing test so.Module1Spec1
>> :module-1:test > Executing test so.Module1Spec3
gradle clean build --parallel --max-workers=12
...
<===========--> 85% EXECUTING [13s]
> :module-1:test > 0 tests completed
> :module-2:test > 0 tests completed
> :module-2:test > Executing test so.Module2Spec1
> :module-2:test > Executing test so.Module2Spec2
> :module-2:test > Executing test so.Module2Spec3
> :module-2:test > Executing test so.Module2Spec4
> :module-1:test > Executing test so.Module1Spec1
> :module-1:test > Executing test so.Module1Test2
> :module-1:test > Executing test so.Module1Spec4
> :module-1:test > Executing test so.Module1Test3
> :module-1:test > Executing test so.Module1Test1
> :module-1:test > Executing test so.Module1Spec3
> :module-1:test > Executing test so.Module1Spec2
> :module-1:test > Executing test so.Module1Test4

关于testing - 什么限制了 Gradle 构建中的活跃工作人员数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55532635/

相关文章:

python - 与用户定义的异常相比,内置异常的处理频率如何?

javascript - Jest 快照测试 - 在 componentDidMount() 中创建新对象时发生错误

javascript - Gradle Maven 依赖项

java - Libgdx Android Gradle 构建错误

testing - 除非使用@Stepwise,否则类无法将模块解析为内容

groovy - 如何将 Groovy 闭包变量注入(inject) Spock 模拟谓词参数?

angularjs - 如何解耦js和angularjs

java - Gradle多项目——模块间共享测试代码

grails - 如何重复 Spock 测试?

java - Junit testing in play with java.lang.OutOfMemoryError 已被捕获,Java 堆空间