我有一个 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
方法 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
,它会执行组件和单元规范。我也尝试过 using 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 源,看起来我可能需要以某种方式考虑覆盖 this: inConfig(scoverageTest)(Defaults.testSettings) ++
,这是正确的方法吗?
编辑 #2 这是一个变通方法,使用方法 1,将“CoverageUnitTest”替换为“scoverageTest”:
lazy val dynamicTestFilter(name:String):Boolean = name endsWith scala.util.Properties.envOrElse("TEST_TYPE","UnitSpec")
运行TEST_TYPE=ComponentSpec sbt coverComponent:test