限制scalatest并行执行线程数

时间:2017-07-18 14:14:20

标签: scala sbt scalatest

我正在尝试并行执行部分测试,因此我使用ParallelTestExecution特性扩展了这些测试类,唯一的问题是它一次运行了太多测试。据我所知,它运行到2 * number_of_cpu_cores所以在我的情况下2 * 8测试。它的方式太多了,我想将它限制为最多4个线程。我试图使用SBT concurentRestrictions in Test设置,但它不会改变任何东西(我认为它只影响并发测试类的执行,并不影响一个类中的并发测试数)。有没有办法强制scalaTest并行运行最大N次测试?最好是我可以设置每个测试类的最大线程数,因为有些测试耗费的资源较少,而且我可以同时运行4个以上。

2 个答案:

答案 0 :(得分:1)

尝试将此行添加到您的sbt项目设置中:

testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-P4")

来自http://www.scalatest.org/user_guide/using_the_runner

  

-P选项可以选择附加一个数字(例如" -P10" -   没有中间空间)来指定要创建的线程数   在线程池中。如果未指定数字(或0),则数量为   线程将根据可用的处理器数量来决定。

答案 1 :(得分:1)

因此,一年多以后,我又回到了这个问题,因为以前我无法解决它。我在这个项目的解决方案上加盖了标记:https://github.com/agido/pageobject。这比我需要的要复杂一些,因此根据他们的代码,我创建了一个更简单的解决方案,仅具有一个可以用作标准ParallelTestExecution的特征。

package org.scalatest

import java.util.concurrent.Executors

import org.scalatest.tools.ConcurrentDistributor

trait FixedThreadPoolParallelExecution extends SuiteMixin with ParallelTestExecution{ this: Suite =>

  val threadPoolSize: Int

  abstract override def run(testName: Option[String], args: Args): Status =
    super.run(testName, args.copy(
      distributor = Some(
        new ConcurrentDistributor(
          args,
          java.util.concurrent.Executors.newFixedThreadPool(threadPoolSize, Executors.defaultThreadFactory)
        )
      )
    ))
}

更多工作原理,并在此处找到一些示例:https://github.com/mateuszgruszczynski/scalatesttwolevelparallelism