使用Gradle maxParallelForks属性执行并行测试

Sai*_*fur 11 java groovy selenium gradle build.gradle

我最近几天一直在寻找答案而无法找到答案.我能找到的最接近的答案是,并不完全回答我的问题.

顺便说一下,我有一个基于Gradle的Selenium测试项目.我们在Jenkins上构建项目,在20个并发线程中运行测试.我拥有的唯一测试类总数是87.所以,我希望gradle能够执行至少5个批次测试项目是使用Cucumber JVM构建的,构建并触发Jenkins对Selenium Hub的测试.我试图通过尽可能多地利用网格来增加测试的并行性.但是,当测试数量开始增长时,问题就开始了.

当我从Jenkins开始测试时,我在第一次观察时观察到测试执行了所有20个测试过程,我看到第二批也开始使用相同数量的过程.在第二批之后,流程回到单一模式,整个工作需要14个小时才能完成,这违背了并行测试执行的目的.

Gradle属性:

jvmArgs '-Xms128m', '-Xmx1024m', '-XX:MaxPermSize=128m'
Runtime.runtime.availableProcessors().toString()) as int        
maxParallelForks =  PropertyUtils.getProperty('test.parallel', '15') as int
forkEvery =  PropertyUtils.getProperty('test.forkEvery', '0') as int
Run Code Online (Sandbox Code Playgroud)

CLI:

gradle clean test -Dtest.single=*TestRun --info
Run Code Online (Sandbox Code Playgroud)

我已经阅读了所有可能找到但未能得到答案的文件.如果有人可以帮我解决这些问题,将不胜感激

1. Gradle如何在内部批量测试运行器?例如,如果20个执行程序启动并且测试1,2,3完成执行速度比其他执行程序快,那么三个执行程序是否会获得另外三个测试类或等待整个批处理完成执行?

2. forkEvery可以影响并行测试期间执行的工作方式吗?

詹金斯登录

成功启动了"Gradle Test Executor 6"流程

成功启动了"Gradle Test Executor 13"流程

成功启动了"Gradle Test Executor 14"流程

成功启动了"Gradle Test Executor 5"流程

成功启动了"Gradle Test Executor 16"流程

成功启动了"Gradle Test Executor 8"流程

成功启动了"Gradle Test Executor 19"流程

成功启动了"Gradle Test Executor 4"流程

成功启动了"Gradle Test Executor 2"流程

成功启动了"Gradle Test Executor 11"流程

成功启动了"Gradle Test Executor 10"流程

成功启动了"Gradle Test Executor 18"流程

成功启动了"Gradle Test Executor 1"流程

成功启动了"Gradle Test Executor 20"流程

成功启动了"Gradle Test Executor 7"流程

成功启动了"Gradle Test Executor 9"流程

成功启动了"Gradle Test Executor 3"流程

成功启动了"Gradle Test Executor 15"流程

成功启动了"Gradle Test Executor 17"流程

成功启动了"Gradle Test Executor 12"流程

Gradle Test Executor 13开始执行测试.

Gradle Test Executor 14开始执行测试.

Gradle Test Executor 6开始执行测试.

Gradle Test Executor 5开始执行测试.

Gradle Test Executor 16开始执行测试.

Gradle Test Executor 19开始执行测试.

Gradle Test Executor 8开始执行测试.

Gradle Test Executor 4开始执行测试.

Gradle Test Executor 2开始执行测试.

Gradle Test Executor 10开始执行测试.

Gradle Test Executor 11开始执行测试.

Gradle Test Executor 18开始执行测试.

Gradle Test Executor 1开始执行测试.

Gradle Test Executor 20开始执行测试.

Gradle Test Executor 7开始执行测试.

Gradle Test Executor 3开始执行测试.

Gradle Test Executor 9开始执行测试.

Gradle Test Executor 17开始执行测试.

Gradle Test Executor 15开始执行测试.

Gradle Test Executor 12开始执行测试.

Joh*_*ier 5

forkEvery的默认值是0

根据文档forkEvery 是

在分叉测试进程中执行的测试类的最大数量。当达到此限制时,分叉测试进程将重新启动。默认值为 0(无最大值)。

因此 gradle (可能还有 junit)将按类而不是类内的测试进行分叉。听起来 87 个测试类中的一些测试类需要长时间运行的测试或大量测试,并且它们最终会出现在一个分叉的测试过程中。我会考虑将 forkEvery 设置为 1。这将确保每个测试类都发送到一个新的 fork。如果仍然存在问题,您可能需要找出哪些测试类花费的时间最多。考虑将这些类分成较小的测试组,以便测试分布在每个 jvm 上。如果这是一项需要很长时间的测试,请考虑重新设计它,并可能从中创建更小的测试。

我不相信 gradle 会批量运行测试。当工作人员变得可用时,它会从剩余测试队列中获取一个测试类。你真的必须看看 JUnit 是如何工作的,因为我确信 gradle 只是将这些配置传递给 JUnit。