我想从sbt并行运行测试套件,但是每个套件都具有自己的专用jvm。
(在我的项目中,每个jvm只有一个资源,并且不能在不同线程中并行使用)
这是我的测试设置:
import java.lang.management.ManagementFactory
import org.scalatest.FunSuite
trait BaseTest extends FunSuite {
test("test1") {
println(f"process_id: ${ManagementFactory.getRuntimeMXBean.getName} - thread_id: ${Thread.currentThread.getId}")
Thread.sleep(5000)
}
}
class Test1 extends BaseTest
class Test2 extends BaseTest
class Test3 extends BaseTest
这些是我在sbt中尝试过的设置:
logBuffered in Test := false //make the logs nicer
parallelExecution in Test := true
fork in Test := true
testForkedParallel in Test := true
concurrentRestrictions in Global := Seq(Tags.limit(Tags.ForkedTestGroup, 4), Tags.limit(Tags.Test, 4))
这是我运行测试时打印的内容:
进程ID:16676 @主机-线程ID:13
process_id:16676 @ host-thread_id:14
process_id:16676 @ host-thread_id:12
测试在不同的线程中运行,但是所有过程都在同一进程中。
我有没有办法让每个套件都有自己的jvm?
答案 0 :(得分:1)
这是我第一次听说安装程序。通常,很难做到所有工具都尽量重用JVM以保持温暖。
您可以执行以下操作:
sbt -no-colors --error "print test:definedTests"
以获取测试套件的列表。如果我为我的一个项目运行它,我会得到类似的东西:
chimneyJVM / Test / definedTests
Vector(Test io.scalaland.chimney.PatcherSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.PBTransformationSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.DslSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.DslFSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.IssuesSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.JavaBeansSpec : subclass(true, utest.TestSuite))
chimneyJS / Test / definedTests
Vector(Test io.scalaland.chimney.PatcherSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.PBTransformationSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.DslSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.DslFSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.IssuesSpec : subclass(true, utest.TestSuite), Test io.scalaland.chimney.JavaBeansSpec : subclass(true, utest.TestSuite))
chimneyCatsJVM / Test / definedTests
Vector(Test io.scalaland.chimney.cats.CatsValidatedSpec : subclass(true, utest.TestSuite))
chimneyCatsJS / Test / definedTests
Vector(Test io.scalaland.chimney.cats.CatsValidatedSpec : subclass(true, utest.TestSuite))
Test / definedTests
Vector()
此输出可以通过AWK或Python脚本进行解析,以获取按项目分组的测试套件列表。
下一步,您可以运行每个项目套件:
sbt $project/testOnly $suite
这将在单独的过程中运行每个套件。
但是,这些进程中的每一个都将在文件系统上使用相同的锁,以确保其他进程不会从其下面拉地毯(合理),但是-即使您在运行之前运行test:compile
避免在编译时同步-这会导致某些事情,我只能认为这是无效的,易碎的混乱。每个进程将重新分配内存(使用大量的套件将占用大量内存),初始化所有内容,所有这些都将争夺对相同资源的访问权,并且所有这些都必须从头开始预热JVM。我敢打赌,除非您有一个非常奇怪的用例,否则此设置将比在一个JVM中按顺序运行套件要慢。