我有一堆由 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: _*)
似乎在集成测试中有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的选项的更多控制。
所以,你有两个选择: