Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每个套件使用单独的jvm运行scalatest_Scala_Sbt_Scalatest - Fatal编程技术网

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

每个套件使用单独的jvm运行scalatest,scala,sbt,scalatest,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: ${ManagementFactor

我想从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@host-线程id:13
进程id:16676@host-线程id:14
进程id:16676@host-螺纹编号:12

这些测试在不同的线程中运行,但都在同一进程中


我有没有办法让每个套件都有自己的jvm?

这是我第一次听说安装程序。一般来说,这很难,因为所有工具都试图尽可能多地重用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中顺序运行套件慢。

这是一个有趣的想法,我将尝试将is作为sbt任务而不是脚本运行。为了澄清我的设置,只要运行是顺序的,所有套件都可以在同一个jvm中运行。问题是当它们并行运行时。所以我并不需要每个套件1个jvm,它也可以是n个单独的实例,每个实例运行一批套件