每个套件使用单独的jvm运行scalatest

时间:2020-04-04 06:50:46

标签: scala sbt scalatest

我想从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?

1 个答案:

答案 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中按顺序运行套件要慢。

相关问题