【问题标题】:Geb, Spock, Gradle and maxParallelForksGeb、Spock、Gradle 和 maxParallelForks
【发布时间】:2019-07-05 11:01:57
【问题描述】:

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

我遇到的问题是当我有 6 个测试类并将 maxParallelForks 设置为 4 时,当测试开始时,我将获得 4 个并行运行的测试类。惊人的!但最后的 2 节课是问题所在。假设在前 4 节课中,2 节课在 1 分钟内完成,2 节课在 5 分钟内完成。我所看到的不是前 2 个完成并开始接下来的 2 个课程,它似乎要等到最后 2 个长时间运行的课程完成后再启动其他分叉。这不太理想。

我是误会了什么,还是我在某处遗漏了某处房产?这就是我在 build.gradle 中的内容:

tasks.withType(Test) {
   systemProperties System.properties
   maxParallelForks = 4
   forkEvery = 1 
}

【问题讨论】:

    标签: selenium gradle automated-tests spock geb


    【解决方案1】:

    类被分配给 fork 以便预先执行,而不是基于轮询。因此,前两个分支将预先分配两个类,另外两个分别分配一个,无论这些类中的每一个需要多长时间才能完成。在最坏的情况下,两个运行时间最长的类将被分配给一个分支。这就是它的工作原理 - 类被分成组,然后使用要为每个类执行的类列表启动单独的测试 jvm(fork)。

    附带说明 - 您不想这样做 forkEvery = 1 - 这将在每个测试类减慢您的测试执行速度后重新启动您的测试 jvm,但没有任何好处。

    【讨论】:

    • 有没有一种方法可以构建或命名我的类,以了解这些类分配给分叉的顺序?在我的情况下,每次运行时间最长的 2 个测试都是最后一次,所以如果每次运行似乎都给它们分配相同的值。另外,我是否将 forkEvery 保留为默认值 (0)?
    【解决方案2】:

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

    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'
    }     
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多