如何使SBT并行运行测试套件?

时间:2019-10-26 12:31:36

标签: scala sbt scalatest

我有许多由sbt运行的集成测试,给定测试N个套件,每个套件有1..M个测试。 我已经设置了C:\........\npm,但是测试套件总是按顺序执行。根据文档,情况并非一定如此:测试套件应同时执行。

测试套件是一个如下类:

fork in IntegrationTest := true
class MyTestSuite1 extends FlatSpec with Matchers 
...
it should "do A" {}
it should "do B" {}

问题

MyTestSuite1和MyTestSuiteN顺序执行(准确地按字母顺序执行)

期望

MyTestSuite1和MyTestSuiteM同时执行

env

.sbopts:

class MyTestSuite2 extends FlatSpec with Matchers 
...
it should "do C" {}
it should "do D" {}

注意

我注意到所有测试都使用相同的池和线程运行,例如,-J-Xms1G -J-Xmx4G -J-XX:MaxMetaspaceSize=512m -J-Xss4M 用于所有测试。

sbt版本:1.2.8 斯卡拉(Scala):2.12.8 作业系统:MacOS 10.15,Ubuntu 19.04 Scalatest版本:3.2.0-SNAP10

尝试sbt v.1.3.2-结果相同。 添加

pool-1-thread-1

没有帮助。

============

更新

testOptions in IntegrationTest += Tests.Argument(TestFrameworks.ScalaTest, "-P4"), 在全球范围内工作,但是我有2个项目,我想使其工作以保留相对于项目的相对路径。

例如

fork in(IntegrationTest, test) := true

不并行运行测试

而是并行运行,但是很明显,主目录设置为“”。而不是分别是“ ./p1”或“ ./p2”:

lazy val `p1` = Project(id = "p1", base = file("./p1"))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings: _*)
  .settings(
    fork in(IntegrationTest, test) := true,
    ...)

lazy val `p2` = Project(id = "p2", base = file("./p2"))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings: _*)
  .settings(
    fork in(IntegrationTest, test) := true,
    ...)

2 个答案:

答案 0 :(得分:0)

默认情况下,在分叉JVM中执行的默认测试是顺序执行的。请参考sbt测试文档中的以下段落:

  

设置:

     

测试/分叉:= true

     

指定所有测试将在单个外部JVM中执行。   请参阅派生以配置派生的标准选项。默认情况下,   在分叉的JVM中执行的测试将顺序执行。更多控制   关于如何将测试分配给JVM以及将哪些选项传递给JVM的信息   可以通过testGrouping键使用。

因此,您有两个选择:

  1. 请勿分叉JVM,默认情况下,您的测试将并行运行
  2. 如果您想同时进行分叉测试和发情测试,请阅读以下文档: https://www.scala-sbt.org/1.x/docs/Testing.html#Forking+tests

答案 1 :(得分:0)

解决方案:

似乎有一个testForkedParallel in IntegrationTest := true选项正好满足了我的需要-它为每个测试套件生成了新的JVM。

==============

备注:

所以,唯一的问题是,现在它产生的JVM数量与所有可用CPU的数量一样多,而我不能仅对测试并发性进行漏斗:

选项1-将所有sbt进程并行化为2个

concurrentRestrictions in Global := Seq(Tags.limitAll(4))

选项2-什么都不做(测试在子项目中)

concurrentRestrictions in Global += Tags.limit(Tags.Test, 4),