テストに使用されるカスタム構成を含む完全なビルド定義を持つ 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 実行にと構成の両方を含める方法、たとえば?unit
scoverage
unit
sbt "unit,scoverage:test"
編集提供された2つの回答に基づいて、私が望むものに近づいています。私が今抱えている問題は、テストフィルターとそれを構成に適用することです。上記の元のコード スニペットを更新して、ファイル名に基づいて使用したフィルターを含めました。testOptions
プロジェクト セクションと使用方法を参照してくださいunitTestFilter
。カバレッジを追加するために、カバレッジ テスト用の新しい構成を追加したのでUnitTest
、 、ComponentTest
、CoverageUnitTest
および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