gpt4 book ai didi

scala - 带有集成测试的 sbt 组装

转载 作者:行者123 更新时间:2023-12-02 23:03:33 28 4
gpt4 key购买 nike

嗨,我有一个 SBT 构建文件,用于处理我们组织内的集成测试,测试本身可以工作,我可以单独运行单元和它测试。但是,当使用 sbt-assemble 打包应用程序时,我无法按顺序运行两个测试(unit++ it),因为编译时内存不足,这是 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 overhead limit exceeded

我尝试仅使用两个(单元/it)测试之一,它成功编译,但我确实需要两者都拥有,有什么建议吗?提前致谢。

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

最佳答案

您现在要做的是在组装期间并行运行测试和集成测试。 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

关于scala - 带有集成测试的 sbt 组装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41304321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com