限制scalatest并行执行线程数

relj7zay  于 2023-04-30  发布在  Scala
关注(0)|答案(3)|浏览(145)

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

dsekswqp

dsekswqp1#

所以一年多后我又回到了这个问题上,因为我以前没能解决它。我在这个项目中提出了一个解决方案:https://github.com/agido/pageobject。它比我需要的要复杂一些,所以基于他们的代码,我创建了一个简单的解决方案,只有一个trait,可以用作标准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

lsmepo6l

lsmepo6l2#

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

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

http://www.scalatest.org/user_guide/using_the_runner
-P选项可以可选地附加数字(例如,例如“-P10”-没有中间空格)来指定要在线程池中创建的线程的数量。如果未指定任何数字(或0),则将根据可用处理器的数量决定线程的数量。

8gsdolmq

8gsdolmq3#

我已经尝试在测试设置中使用SBT concurrentRestrictions,但它不会改变任何东西
SBT documentation说:
这必然是一组全局规则,因此其作用域必须为Global /。
你需要像这样使用它:

Global / concurrentRestrictions := Seq(
  Tags.limit(Tags.Test, 4)
)

我认为它只影响并发测试类的执行,而不影响一个类中并发测试的数量
除非使用ParallelTestExecution,否则测试类中的各个测试将按顺序运行,只有类(套件)会并行运行。

相关问题