带有集成测试的sbt组装

use*_*634 3 scala sbt sbt-assembly spec2

嗨,我有一个SBT构建文件,用于处理我们组织内的集成测试,该测试本身可以工作,并且我可以单独运行该单元并对其进行测试。但是,当使用sbt-assembly打包应用程序时,由于无法在内存中进行编译,因此我无法依次运行两个测试(单元++),这是sbt.Project及其设置:

  import BuildSettings._
  import Dependencies._
  import Resolvers._

  val name = "api"
  lazy val api = Project(
    name, file("."),
    settings = buildSettings
      ++ Seq(resolvers := repositories, libraryDependencies ++= dependencies)
      ++ SbtStartScript.startScriptForClassesSettings
      ++ Revolver.settings
      ++ assemblySettings
      ++ Seq(jarName := name + "-" + currentGitBranch + ".jar")
  ).configs(IntegrationTest)
    .settings(Defaults.itSettings: _*)
    .settings(parallelExecution in IntegrationTest := false)
    .settings(parallelExecution in Test := true)
    .settings(scalaSource in IntegrationTest := baseDirectory.value / "src/test/scala")
    .settings(resourceDirectory in IntegrationTest := baseDirectory.value / "src/test/resources")
    .settings(
  testOptions in IntegrationTest := Seq(Tests.Filter(itFilter)),
  testOptions in Test := Seq(Tests.Filter(unitFilter))
    )
    .settings(parallelExecution in Compile := true)
    .settings(fork in Compile := true)
    .settings(sources in (Compile, doc) := Seq.empty)
    .settings(test in assembly := Seq(
      (test in Test).value ,
      (test in IntegrationTest).value
    ))

  def currentGitBranch = {
    "git rev-parse --abbrev-ref HEAD".lines_!.mkString.replaceAll("/", "-").replaceAll("heads-", "")
  }

  def itFilter(name: String): Boolean = name endsWith "IT"

  def unitFilter(name: String): Boolean = !itFilter(name)
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用(在程序集中测试:= {...})来指定在任务Assembly :: test期间要运行的测试,但是如果我运行,sbt assembly它将失败并

java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:超出了GC开销限制

我尝试仅使用两个(单元/它)测试之一,它可以编译,但是我确实需要同时使用它们,有什么建议吗?提前致谢。

编辑:我尝试运行sbt,SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"并且在错误中有其他消息,java.lang.OutOfMemoryError: Java heap space

Has*_*tor 5

您现在要做的是在组装过程中并行运行测试和集成测试。SBT尝试通过并行运行独立的操作来并行化所有事物,并定义如下:

test in assembly := Seq(
  (test in Test).value ,
  (test in IntegrationTest).value
)
Run Code Online (Sandbox Code Playgroud)

允许这样做,因为这两个任务(test in Testtest in IntegrationTest)彼此独立。

如果你给它更多的内存也许工作sbt -mem 4096,甚至更多,但你也可以使用连续运行它们Def.sequential的方法,如所描述这里。您的代码如下所示:

test in assembly := Def.sequential(
  test in Test,
  test in IntegrationTest
).value
Run Code Online (Sandbox Code Playgroud)