4

こんにちは、私たちの組織内で統合テストを処理する SBT ビルド ファイルがあります。テスト自体は機能し、ユニットとテストを個別に実行できます。ただし、アプリを sbt-assembly でパッケージ化する場合、コンパイル時にメモリ不足になるため、両方のテストを順番に実行することはできません (ユニット ++ 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 オーバーヘッド制限を超えました

2つ(ユニット/ it)テストのうち1つだけを使用してみましたが、なんとかコンパイルできましたが、両方が必要です。何か提案はありますか?前もって感謝します。

編集:sbtを実行しようとしSBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"ましたが、エラーに別のメッセージがありました。java.lang.OutOfMemoryError: Java heap space

4

1 に答える 1

7

あなたが今行っているのは、アセンブリ中にテストと統合テストを並行して実行することです。SBT は、独立した操作を並行して実行することですべてを並列化しようとします。定義は次のようになります。

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

これらの 2 つのタスク (test in Testtest in IntegrationTest) は互いに独立しているためです。

またはそれ以上のメモリを与えるとうまくいくかもしれませんが、ここで説明されているように、アプローチsbt -mem 4096を使用して順次実行することもできます。コードは次のようになります。Def.sequential

test in assembly := Def.sequential(
  test in Test,
  test in IntegrationTest
).value
于 2016-12-23T18:16:20.003 に答える