【问题标题】:sbt assembly with integration test带有集成测试的 sbt 程序集
【发布时间】:2017-05-09 07:54:05
【问题描述】:

您好,我有一个 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)

如您所见,我使用 (test in assembly := { ... }) 来指定在任务 assembly::test 期间要运行的测试,但是如果我运行 sbt assembly 它会失败并显示

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

我尝试只使用两个 (unit/it) 测试中的一个,它可以编译,但我确实需要同时拥有它们,有什么建议吗?提前致谢。

编辑:我尝试使用 SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled" 运行 sbt,但错误中出现了不同的消息,java.lang.OutOfMemoryError: Java heap space

【问题讨论】:

    标签: scala sbt sbt-assembly spec2


    【解决方案1】:

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

    test in assembly := Seq(
      (test in Test).value ,
      (test in IntegrationTest).value
    )
    

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

    如果您使用sbt -mem 4096 给它更多内存甚至更多,它可能会起作用,但您也可以使用Def.sequential 方法按顺序运行它们,如here 所述。您的代码如下所示:

    test in assembly := Def.sequential(
      test in Test,
      test in IntegrationTest
    ).value
    

    【讨论】:

    • 谢谢,按顺序执行它们就可以了释放。
    • 很高兴它有帮助,并且一般性评论:SBT 几乎是向后兼容的,所以真的没有理由不更新到最新版本,目前是 0.13.13。
    猜你喜欢
    • 2023-03-12
    • 2014-03-29
    • 2021-10-24
    • 2014-05-30
    • 2014-06-16
    • 1970-01-01
    • 2016-06-28
    • 2012-12-02
    • 2020-05-26
    相关资源
    最近更新 更多