提问者:小点点

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


我有一堆由 sbt 运行的集成测试,给定测试 N 个套件,每个套件都有 1..M 个测试。我已经在集成测试中设置了fork := true,但是测试套件始终按顺序执行。根据文档,情况一定不是这样:测试套件应该并发执行。

测试套件是一个类,如下所示:

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

MyTestSuite1 和 MyTestSuiteN 按顺序执行(确切地说是按字母顺序)

MyTestSuite1和MyTestSuiteM同时执行

。sbopts:

-J-Xms1G
-J-Xmx4G
-J-XX:MaxMetaspaceSize=512m
-J-Xss4M

我注意到所有测试都使用相同的池和线程运行,例如,所有测试都使用< code>pool-1-thread-1。

SBT 版本:1.2.8 Scala:2.12.8 操作系统:MacOS 10.15,Ubuntu 19.04 Sca最新版本:3.2.0-SNAP10

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

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

没有帮助。

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

fork in(集成测试,测试):= true 适用于全局级别,但我有 2 个项目,我想让它保留项目的相对路径。

e. g.

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,
    ...)

不并行运行测试

相反,这是并行运行的,但显然,主目录分别设置为“.”而不是“./p1”或“./p2”:

fork in(IntegrationTest, test) := true

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

共2个答案

匿名用户

似乎在集成测试中有testForkedParallel:= true选项,它完全符合我的需求 - 它为每个测试套件生成新的JVM。

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

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

选项1-将所有sbt进程集中到只有4个并行

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

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

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

匿名用户

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

设置:

测试/分叉:=true

指定所有测试将在单个外部JVM中执行。请参阅分叉以配置分叉的标准选项。默认情况下,在分叉JVM中执行的测试按顺序执行。testGrouping键提供了对如何将测试分配给JVM以及传递给这些JVM的选项的更多控制。

所以,你有两个选择:

    < li >不要派生JVM,默认情况下您的测试将并行运行 < li >如果您想要派生并仍然进行rut测试,请并行通过此文档:https://www.scala-sbt.org/1.x/docs/Testing.html#Forking测试