Geb,Spock,Gradle和maxParallelForks

问题描述 投票:1回答:1

我在理解Geb / Spock测试中遇到的问题时遇到了一些麻烦。我们正在使用gradle,我们正在尝试并行运行测试。据我了解,gradle中的maxParallelForks属性将在单独的JVM中运行测试类。

我遇到的问题是当我有6个测试类并且我将maxParallelForks设置为4时,测试开始时我会得到4个并行运行的测试类。真棒!但最后的两个课程就是问题所在。让我们说在前4个类中运行,其中2个类在1分钟内完成,2个类在5分钟内完成。我所看到的不是前两个完成并开始接下来的两个课程,它似乎等到最后两个长时间运行的课程完成之后再旋转其他分叉。这不太理想。

我误解了什么,或者我错过了某个地方的财产?这是我在build.gradle中的内容:

tasks.withType(Test) {
   systemProperties System.properties
   maxParallelForks = 4
   forkEvery = 1 
}
selenium gradle automated-tests spock geb
1个回答
3
投票

类被分配给forks用于预先执行而不是基于轮询。因此前两个分支将获得两个预先分配的类,另外两个分别为每个类,无论每个类完成多长时间。在最坏的情况下,两个最长的运行类将被分配给一个fork。这就是它的工作原理 - 将类拆分成组,然后将单独的测试jvms(forks)与要为每个类执行的类列表分开。

在旁注 - 你不想做forkEvery = 1 - 这将在每个测试类减慢你的测试执行后重启你的测试jvms没有任何好处。


0
投票

使用JUNIT套件,您可以决定特定fork需要选择哪些类。

import org.junit.runner.RunWith
import org.junit.runners.Suite

@RunWith(Suite.class)
@Suite.SuiteClasses([
    TimeTaking.class, // Class that takes a lot of time
    NotSoMuchTimeTaking.class, //Class that is quick
// Add more test classes which need to be executed in same fork.  
])

public class FirstTestSuite { // keep this empty
}

同样,创建一个SecondTestSuite {}等等。

除了上述步骤,还要在build.gradle中包含* TestSuite.class

tasks.withType(Test) {
systemProperties System.properties
maxParallelForks = 4
forkEvery = 1  
include '**/*TestSuite*.class'
}     

这样,您将能够控制执行并决定需要以什么顺序执行哪些测试类。

© www.soinside.com 2019 - 2024. All rights reserved.