1

テストに使用されるカスタム構成を含む完全なビルド定義を持つ SBT プロジェクトがあります。

独自の構成が付属するプラグインを追加します。可能であれば、両方の構成を使用してタスクを実行できるようにしたいと考えています。

不可能な場合は、プラグインからカスタム構成に構成を取り込みたいと考えています。

詳細

私のカスタムunit構成は、特定のテストを単体テストとして分類するために使用され、sbt-scoverageを使用してカバレッジを追加したいと考えています。

私の完全なビルド定義は次のとおりです。

lazy val UnitTest = config("unit") extend(Test)
def unitTestFilter(name: String) = name endsWith "UnitSpec"

lazy val myProject = Project(id="MyProject")
         .configs( UnitTest )
         .settings( inConfig(UnitTest)(Defaults.testTasks) : _*)
         .settings(
            testOptions in UnitTest := Seq(Tests.Filter(unitTestFilter)),
            parallelExecution in UnitTest := true
         )

単体テストを実行するために、 を実行しますsbt unit:test

IA)ビルド定義sbt-scoverageの構成に追加する方法、または B) SBT 実行にと構成の両方を含める方法、たとえば?unitscoverageunitsbt "unit,scoverage:test"

編集提供された2つの回答に基づいて、私が望むものに近づいています。私が今抱えている問題は、テストフィルターとそれを構成に適用することです。上記の元のコード スニペットを更新して、ファイル名に基づいて使用したフィルターを含めました。testOptionsプロジェクト セクションと使用方法を参照してくださいunitTestFilter。カバレッジを追加するために、カバレッジ テスト用の新しい構成を追加したのでUnitTest、 、ComponentTestCoverageUnitTestおよびCoverageComponentTest. 私が今抱えている問題は、テスト オプション/ファイル名フィルターを取得して、scoverage 構成に伝達できないことです。

方法 1: scoverageTest を拡張する構成を作成する

lazy val CoverageUnitTest = config("coverUnit") extend (scoverageTest)
def unitTestFilter(name: String) = name endsWith "UnitSpec"

lazy val myProject = Project(id="MyProject")
     .configs( UnitTest, CoverageUnitTest )
     .settings(
        testOptions in CoverageUnitTest := Seq(Tests.Filter(unitTestFilter)),
        parallelExecution in CoverageUnitTest := true
     )

上記の方法では、設定は適用されません。を実行coverUnit:testすると、コンポーネント スペックとユニット スペックの両方が実行されます。フィルターで動作するも使用してみtestOptions in scoverageTestましたが、問題は、プロジェクトに 2 つの構成、つまり CoverageUnitTest と CoverageComponentTest があり、 を使用するin scoverageTestと、両方のタスクに 1 つのフィルターのみが適用されることです (つまり、coverUnit:test とcoverComponent:test 両方とも、順序に基づいて単体テストまたはコンポーネント テストを実行します)。

方法 2: テストを拡張し、インストルメンテーションを追加する

lazy val CoverageUnitTest = config("coverUnit") extend (Test)
def unitTestFilter(name: String) = name endsWith "UnitSpec"

lazy val myProject = Project(id="MyProject")
     .configs( UnitTest, CoverageUnitTest )
     .settings( inConfig(CoverageUnitTest)(ScoverageSbtPlugin.instrumentSettings) : _* )
     .settings(
        testOptions in CoverageUnitTest := Seq(Tests.Filter(unitTestFilter)),
        parallelExecution in CoverageUnitTest := true
     )

繰り返しますが、このメソッドは unitTestFilter でテストをフィルタリングしません。

ScoverageSbtPlugin ソースを見ると、どうにかしてこれをオーバーライドする必要があるように見えます: inConfig(scoverageTest)(Defaults.testSettings) ++、これは正しいアプローチですか?

edit #2 これは、「CoverageUnitTest」を「scoverageTest」に置き換えた方法 1 を使用した回避策です。

lazy val dynamicTestFilter(name:String):Boolean = name endsWith scala.util.Properties.envOrElse("TEST_TYPE","UnitSpec")

で実行TEST_TYPE=ComponentSpec sbt coverComponent:test

4

3 に答える 3

1

私はこれをチェックしませんでしたが、ここにあなたが試すことができるものがあります.

lazy val UnitTest = config("unit") extend(Test)
lazy val myProject = Project(id="MyProject").
  configs(UnitTest, scoverage, scoverageTest).
  settings(ScoverageSbtPlugin.instrumentSettings: _*).
  settings(
    parallelExecution in UnitTest := true,
    sources in scoverageTest += (sources in UnitTest).value,
    sourceDirectory in scoverageTest += (sourceDirectory in UnitTest).value,
    unmanagedResources in scoverageTest += (unmanagedResources in UnitTest),
    resourceDirectory in scoverageTest += (resourceDirectory in UnitTest),
    externalDependencyClasspath in scoverageTest := Classpaths
      .concat((externalDependencyClasspath in scoverageTest).value, (externalDependencyClasspath in UnitTest).value)
  )
于 2014-03-29T22:12:51.540 に答える
0

両方の提案を組み合わせて、機能する構成を考え出しました。構成の継承を停止する方法がよくわからなかったので、私が使用した醜いハックが1つありますが、多かれ少なかれ私が持っていたものです(ここでは1つのテストタイプ-ユニット-のみを示していますが、実際にはさまざまなタイプがあります. ユニットのみが並行して実行できます。コンポーネント / 統合テストの構成では、並行して false に設定する必要があります):

lazy val UnitTest = config("unit") extend(Test)
lazy val CoverageUnitTest = config("coverUnit") extend (scoverageTest)
def unitTestFilter(name: String) = name endsWith "UnitSpec"
def dynamicTestFilter(name:String): Boolean = name endsWith scala.util.Properties.envOrElse("TEST_TYPE","UnitSpec")

def determineParallel:Boolean = {
  scala.util.Properties.envOrElse("TEST_TYPE","UnitSpec") match {
    case testType:String if testType == "UnitSpec => true
    case _ => false
  }
}

lazy val myProject = Project(id="MyProject")
 .configs( UnitTest, CoverageUnitTest )
 .configs( ComponentTest, CoverageComponentTest )
 .settings( inConfig(UnitTest)(Defaults.testTasks) : _*)
 .settings(
   testOptions in UnitTest := Seq(Tests.Filter(unitTestFilter)),
   parallelExecution in UnitTest := true
 )
 .settings( inConfig(ComponentTest)(Defaults.testTasks) : _*)
 .settings(
   testOptions in ComponentTest := Seq(Tests.Filter(componentTestFilter)),
   parallelExecution in ComponentTest := false
 )
 .settings(
    testOptions in scoverageTest := Seq(Tests.Filter(unitTestFilter)),
    parallelExecution in scoverageTest := determineParallel
 )

設定コントロール ユニット テストの最初のグループ (カバレッジなし) はunit:test、2 番目のコントロール コンポーネント テスト ( component:test) で実行されます。最後の構成は、カバレッジを有効にしてテストを実行するために使用されます。scoverageTest 構成は単体テストとコンポーネント テストの両方に使用されますが、SBT の実行時にフラグを使用して並列実行を有効または無効にするようにシステム プロパティを設定しました。

sbt coverUnit:testscoverageTest 構成を使用して単体テストを実行し、並列を有効にします。 $ TEST_TYPE=ComponentSpec sbt coverComponent:testscoverageTest 構成でコンポーネント テストを実行し、determineParallel 関数を使用して並列実行を無効にします。

于 2014-05-09T13:16:26.593 に答える