2016-12-23 22 views
2

こんにちは私は組織内の統合テストを処理するSBTビルドファイルを持っています。テスト自体は機能しており、別々のユニットを実行してテストできます。私はコンパイルするとき、それはメモリの外に出るので、両方の試験順次(単位++、それを)実行することはできませんよSBT-アセンブリとアプリケーションをパッケージ化するときしかし、ここでsbt.Projectは、その設定である:統合テストを使用したsbtアセンブリ

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) 

あなたが見ることができるように私は使用(アセンブリ内でテストを:= {...})私はsbt assemblyを実行した場合しかし、それは私が使用してみました

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:GC overhead limit exceeded

で失敗し、タスクアセンブリ::テスト中に実行するためにどのようなテストを指定します2つのうちの1つ(ユニット/ it)のみをテストし、コンパイルすることができますが、私はそれらを両方とも持っている必要があります。前もって感謝します。

編集:私はSBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"で実行されているSBTを試してみましたが、私はあなたが今、組み立て時に並行してテストや統合テストを実行しているやっているどのようなエラーで異なるメッセージ、java.lang.OutOfMemoryError: Java heap space

答えて

2

を持っていました。 SBTは、並列に独立した操作を実行することにより、すべてのものを並列化しようとすると、このような定義:これらの2つのタスク(test in Testtest in IntegrationTest)は互いに独立しているので、

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

は、それがそうすることができます。

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

+0

ありがとう、それらを順番に実行すると、それを実行するすべてのメモリを取ることはありません、幸い私はすでに彼らが導入したようにSBT 0.13.8にあったそれ以降のリリースでは。 – user145634

+0

うれしいことですが、一般的なコメント:SBTはかなり下位互換性がありますので、現在最新のバージョン0.13.13にアップデートしない理由はありません。 – Haspemulator

関連する問題