带有集成测试的 sbt 程序集
sbt assembly with integration test
您好,我有一个 SBT 构建文件,用于处理我们组织内的集成测试,测试本身可以工作,我可以 运行 单独单元并进行测试。但是,当使用 sbt-assembly 打包应用程序时,我无法 运行 都按顺序进行测试(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)
如您所见,我在任务 assembly::test 期间使用 (test in assembly := { ... }) 指定对 运行 进行的测试,但是如果我 运行 sbt assembly
失败
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:GC overhead limit exceeded
我尝试只使用两个 (unit/it) 测试中的一个,它成功编译了,但我确实需要同时使用它们,有什么建议吗?提前致谢。
编辑:我尝试 运行ning sbt 与 SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"
并且我在错误中有不同的消息,java.lang.OutOfMemoryError: Java heap space
您现在正在做的是运行在组装过程中并行进行测试和集成测试。 SBT 试图通过 运行 并行独立操作来并行化所有事物,定义如下:
test in assembly := Seq(
(test in Test).value ,
(test in IntegrationTest).value
)
允许它这样做,因为这 2 个任务(test in Test
和 test in IntegrationTest
)彼此独立。
如果您使用 sbt -mem 4096
或更多内存给它更多内存,它可能会起作用,但您也可以使用 Def.sequential
方法按顺序 运行 它们,如 here 所述.您的代码将如下所示:
test in assembly := Def.sequential(
test in Test,
test in IntegrationTest
).value
您好,我有一个 SBT 构建文件,用于处理我们组织内的集成测试,测试本身可以工作,我可以 运行 单独单元并进行测试。但是,当使用 sbt-assembly 打包应用程序时,我无法 运行 都按顺序进行测试(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)
如您所见,我在任务 assembly::test 期间使用 (test in assembly := { ... }) 指定对 运行 进行的测试,但是如果我 运行 sbt assembly
失败
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:GC overhead limit exceeded
我尝试只使用两个 (unit/it) 测试中的一个,它成功编译了,但我确实需要同时使用它们,有什么建议吗?提前致谢。
编辑:我尝试 运行ning sbt 与 SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"
并且我在错误中有不同的消息,java.lang.OutOfMemoryError: Java heap space
您现在正在做的是运行在组装过程中并行进行测试和集成测试。 SBT 试图通过 运行 并行独立操作来并行化所有事物,定义如下:
test in assembly := Seq(
(test in Test).value ,
(test in IntegrationTest).value
)
允许它这样做,因为这 2 个任务(test in Test
和 test in IntegrationTest
)彼此独立。
如果您使用 sbt -mem 4096
或更多内存给它更多内存,它可能会起作用,但您也可以使用 Def.sequential
方法按顺序 运行 它们,如 here 所述.您的代码将如下所示:
test in assembly := Def.sequential(
test in Test,
test in IntegrationTest
).value